I did try after you asked, and KVO may be working, but the video doesn’t
play. If I delete the KVO bindings from IB and change my code like this:

  var currentTime : Double = 0 {
    didSet {
      timeSlider.doubleValue = currentTime
    }
  }

  var duration: Double = 0
  {
    didSet {
      timeSlider.maxValue = duration
    }
  }

The video will play and all the buttons will work right. Seriously,
*everything* works except I can’t scrub and I haven’t bothered yet to test
the volume slider.

If I take that working code and the ONLY changes I make are to (a) change
currentTime to the code below and (b) add the binding in IB, the video will
not play. The strange thing is when I do this, I think KVO is actually
working because I get hammered with log messages saying “Seek to 0.0
seconds.”

  dynamic var currentTime : Double {
    get {
      return CMTimeGetSeconds( player.currentTime() )
    }
    set ( seconds ) {
      NSLog( "Seek to \(seconds) seconds" )
      let time = CMTimeMakeWithSeconds( seconds, 1 )
      player.seek( to: time )
    }
  }

I thought maybe this meant my periodic time observer was messed up, so I
replaced my equivalent of the ObjC code with this:

      myTimeObserver = player.addPeriodicTimeObserver(
        forInterval: CMTimeMake( 1, 10 ),
        queue: DispatchQueue.main
      ) {
        [weak self] ( time: CMTime ) -> () in
        if let weakSelf = self {
          let seconds = weakSelf.currentTime // Force a read from player
          NSLog( "Asking to set time to \(seconds) seconds" )
          weakSelf.currentTime = seconds // Force KVO update
        }
      }

And the resulting log messages prove, I think, that player.currentTime()
really does sit at 0.0 while I’m using KVO for the slider.


On Sat, Jan 7, 2017 at 3:32 PM, Charles Srstka <cocoa...@charlessoft.com>
wrote:

> On Jan 7, 2017, at 2:27 PM, Charles Jenkins <cejw...@gmail.com> wrote:
>
>
> Charles,
>
> Thank you for the reply. “Won’t compile” was incorrect shorthand for a
> long-winded explanation. What really happens is this:
>
> In the AVSimplePlayer demo, the timeSlider has two bindings: Value is
> bound to File’s Owner.currentTime and MaxValue is bound to File’s
> Owner.duration. These are double properties in ObjC. Here is an example of
> one of them:
>
> - (double)currentTime
> {
>   return CMTimeGetSeconds(self.player.currentTime);
> }
>
> - (void)setCurrentTime:(double)time
> {
>   [self.player seekToTime:CMTimeMakeWithSeconds(time, 1)
> toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
> }
>
> In my project using Swift, I haven’t found a way to set File’s Owner in
> IB, so I choose my binding object to be “View Controller,” because Xcode
> automatically generated my view controller class with the name
> ViewController. I have the currentTime and duration properties in my Swift
> file, so I try to make my timeSlider mimic Apple’s two bindings: Value is
> bound to ViewController.currentTime and MaxValue is bound to
> ViewController.duration. I know I haven’t mistyped them because when I
> clear the Model Key Path boxes, I can use a pulldown to select the
> properties. But when I select them, a red stop sign appears in each Model
> Key Path box, and when I hover over it I see this message like this: “The
> Value binding expects to be bound to an object of type NSNumber, but
> currentTime is of type Double.”
>
> Here’s my updated code for the currentTime property IB doesn’t like:
>
> dynamic var currentTime: Double {
>   get {
>     return CMTimeGetSeconds( player.currentTime() )
>   }
>   set ( seconds ) {
>     let time = CMTimeMakeWithSeconds( seconds, 1 )
>     player.seek( to: time )
>   }
> }
>
> To be clear, my ViewController object is an NSViewController subclass, so
> I think NSObject conformance is a given. What else could be wrong?
>
>
> Have you just tried compiling and running it and seeing if it works? I’ve
> found that little stop sign in the Model Key Path box to produce false
> positives from time to time, and this sounds like one. The KVO system wraps
> primitive types in objects, and for Double, that’ll be NSNumber. As long as
> your properties are dynamic, it should work.
>
> Charles
>
>


-- 

Charles
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to