X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=projects%2Fmacosx%2Fframework%2FSources%2FVLCMediaPlayer.m;h=49ede29bcc533a86b82fa23fef12ccf4c104ab1b;hb=592c1efc6b3ecdd445c135c12c8ab5f0f0dfafc5;hp=a49b8c72000187bcb3c7f1df75b7de29bb9bb2e7;hpb=6ee778a4ea323a91929ae1caad5e87153ce190b0;p=vlc diff --git a/projects/macosx/framework/Sources/VLCMediaPlayer.m b/projects/macosx/framework/Sources/VLCMediaPlayer.m index a49b8c7200..49ede29bcc 100644 --- a/projects/macosx/framework/Sources/VLCMediaPlayer.m +++ b/projects/macosx/framework/Sources/VLCMediaPlayer.m @@ -72,8 +72,8 @@ static void HandleMediaInstanceVolumeChanged(const libvlc_event_t * event, void static void HandleMediaTimeChanged(const libvlc_event_t * event, void * self) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - [[VLCEventManager sharedManager] callOnMainThreadObject:self - withMethod:@selector(mediaPlayerTimeChanged:) + [[VLCEventManager sharedManager] callOnMainThreadObject:self + withMethod:@selector(mediaPlayerTimeChanged:) withArgumentAsObject:[NSNumber numberWithLongLong:event->u.media_player_time_changed.new_time]]; [[VLCEventManager sharedManager] callOnMainThreadDelegateOfObject:self @@ -86,8 +86,8 @@ static void HandleMediaPositionChanged(const libvlc_event_t * event, void * self { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - [[VLCEventManager sharedManager] callOnMainThreadObject:self - withMethod:@selector(mediaPlayerPositionChanged:) + [[VLCEventManager sharedManager] callOnMainThreadObject:self + withMethod:@selector(mediaPlayerPositionChanged:) withArgumentAsObject:[NSNumber numberWithFloat:event->u.media_player_position_changed.new_position]]; [pool release]; } @@ -112,8 +112,8 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - [[VLCEventManager sharedManager] callOnMainThreadObject:self - withMethod:@selector(mediaPlayerStateChanged:) + [[VLCEventManager sharedManager] callOnMainThreadObject:self + withMethod:@selector(mediaPlayerStateChanged:) withArgumentAsObject:[NSNumber numberWithInt:newState]]; [[VLCEventManager sharedManager] callOnMainThreadDelegateOfObject:self @@ -124,6 +124,18 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * } +static void HandleMediaPlayerMediaChanged(const libvlc_event_t * event, void * self) +{ + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + + [[VLCEventManager sharedManager] callOnMainThreadObject:self + withMethod:@selector(mediaPlayerMediaChanged:) + withArgumentAsObject:[VLCMedia mediaWithLibVLCMediaDescriptor:event->u.media_player_media_changed.new_media]]; + + [pool release]; + +} + // TODO: Documentation @interface VLCMediaPlayer (Private) @@ -134,6 +146,7 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * - (void)mediaPlayerTimeChanged:(NSNumber *)newTime; - (void)mediaPlayerPositionChanged:(NSNumber *)newTime; - (void)mediaPlayerStateChanged:(NSNumber *)newState; +- (void)mediaPlayerMediaChanged:(VLCMedia *)media; @end @implementation VLCMediaPlayer @@ -194,7 +207,7 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * - (void)dealloc { - NSAssert(libvlc_media_player_get_state(instance, NULL) == libvlc_Stopped, @"You released the media player before ensuring that it is stopped"); + NSAssert(libvlc_media_player_get_state(instance) == libvlc_Stopped, @"You released the media player before ensuring that it is stopped"); // Always get rid of the delegate first so we can stop sending messages to it // TODO: Should we tell the delegate that we're shutting down? @@ -203,13 +216,14 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * // Clear our drawable as we are going to release it, we don't // want the core to use it from this point. This won't happen as // the media player must be stopped. - libvlc_media_player_set_nsobject(instance, nil, NULL); + libvlc_media_player_set_nsobject(instance, nil); libvlc_media_player_release(instance); - + // Get rid of everything else [media release]; [cachedTime release]; + [cachedRemainingTime release]; [drawable release]; [super dealloc]; @@ -226,7 +240,7 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * } - (void)setVideoView:(VLCVideoView *)aVideoView -{ +{ [self setDrawable: aVideoView]; } @@ -238,19 +252,12 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * - (void)setDrawable:(id)aDrawable { // Make sure that this instance has been associated with the drawing canvas. - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_player_set_nsobject(instance, aDrawable, &ex); - catch_exception( &ex ); + libvlc_media_player_set_nsobject(instance, aDrawable); } - (id)drawable { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - id ret = libvlc_media_player_get_nsobject(instance); - catch_exception( &ex ); - return ret; + return libvlc_media_player_get_nsobject(instance); } - (VLCAudio *)audio @@ -258,57 +265,61 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * return [[VLCLibrary sharedLibrary] audio]; } -- (void)setVideoAspectRatio:(char *)value -{ - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_video_set_aspect_ratio( instance, value, &ex ); - catch_exception( &ex ); -} +#pragma mark - +#pragma mark Subtitles -- (char *)videoAspectRatio +- (void)setCurrentVideoSubTitleIndex:(NSUInteger)index { libvlc_exception_t ex; libvlc_exception_init( &ex ); - char * result = libvlc_video_get_aspect_ratio( instance, &ex ); + libvlc_video_set_spu( instance, (int)index, &ex ); catch_exception( &ex ); - return result; } -- (void)setVideoSubTitles:(int)value +- (NSUInteger)currentVideoSubTitleIndex { libvlc_exception_t ex; libvlc_exception_init( &ex ); - libvlc_video_set_spu( instance, value, &ex ); - catch_exception( &ex ); + NSInteger count = libvlc_video_get_spu_count( instance, &ex ); + if (libvlc_exception_raised( &ex )) + { + libvlc_exception_clear( &ex ); + return NSNotFound; + } + if (count <= 0) + return NSNotFound; + NSUInteger result = libvlc_video_get_spu( instance, &ex ); + if (libvlc_exception_raised( &ex )) + { + libvlc_exception_clear( &ex ); + return NSNotFound; + } + else + return result; } -- (int)countOfVideoSubTitles +- (BOOL)openVideoSubTitlesFromFile:(NSString *)path { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - int result = libvlc_video_get_spu( instance, &ex ); - catch_exception( &ex ); - return result; + return libvlc_video_set_subtitle_file(instance, [path UTF8String]); } -- (int)currentVideoSubTitles +- (NSArray *)videoSubTitles { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - int result = libvlc_video_get_spu( instance, &ex ); - if (libvlc_exception_raised(&ex)) - { - libvlc_exception_clear(&ex); - return -1; - } - else - { - libvlc_exception_clear(&ex); - return result; + libvlc_track_description_t *currentTrack = libvlc_video_get_spu_description(instance); + + NSMutableArray *tempArray = [NSMutableArray array]; + while (currentTrack) { + [tempArray addObject:[NSString stringWithUTF8String:currentTrack->psz_name]]; + currentTrack = currentTrack->p_next; } + libvlc_track_description_release(currentTrack); + return [NSArray arrayWithArray: tempArray]; } + +#pragma mark - +#pragma mark Video Crop geometry + - (void)setVideoCropGeometry:(char *)value { libvlc_exception_t ex; @@ -326,19 +337,19 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * return result; } -- (void)setVideoTeleText:(int)value +- (void)setVideoAspectRatio:(char *)value { libvlc_exception_t ex; libvlc_exception_init( &ex ); - libvlc_video_set_teletext( instance, value, &ex ); + libvlc_video_set_aspect_ratio( instance, value, &ex ); catch_exception( &ex ); } -- (int)videoTeleText +- (char *)videoAspectRatio { libvlc_exception_t ex; libvlc_exception_init( &ex ); - int result = libvlc_video_get_teletext( instance, &ex ); + char * result = libvlc_video_get_aspect_ratio( instance, &ex ); catch_exception( &ex ); return result; } @@ -361,19 +372,12 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * - (void)setRate:(float)value { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_player_set_rate( instance, value, &ex ); - catch_exception( &ex ); + libvlc_media_player_set_rate(instance, value); } - (float)rate { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - float result = libvlc_media_player_get_rate( instance, &ex ); - catch_exception( &ex ); - return result; + return libvlc_media_player_get_rate(instance); } - (NSSize)videoSize @@ -388,37 +392,19 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * - (BOOL)hasVideoOut { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - BOOL result = libvlc_media_player_has_vout((libvlc_media_player_t *)instance, &ex); - if (libvlc_exception_raised( &ex )) - { - libvlc_exception_clear( &ex ); - return NO; - } - else - return result; + return libvlc_media_player_has_vout(instance); } - (float)framesPerSecond { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - float result = libvlc_media_player_get_fps( (libvlc_media_player_t *)instance, &ex ); - catch_exception( &ex ); - return result; + return libvlc_media_player_get_fps(instance); } - (void)setTime:(VLCTime *)value { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); // Time is managed in seconds, while duration is managed in microseconds // TODO: Redo VLCTime to provide value numberAsMilliseconds, numberAsMicroseconds, numberAsSeconds, numberAsMinutes, numberAsHours - libvlc_media_player_set_time( (libvlc_media_player_t *)instance, - (value ? [[value numberValue] longLongValue] / 1000 : 0), - &ex ); - catch_exception( &ex ); + libvlc_media_player_set_time(instance, value ? [[value numberValue] longLongValue] : 0); } - (VLCTime *)time @@ -428,129 +414,139 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * - (VLCTime *)remainingTime { - double currentTime = [[cachedTime numberValue] doubleValue]; - double remaining = currentTime / position * (1 - position); - return [VLCTime timeWithNumber:[NSNumber numberWithDouble:-remaining]]; + return cachedRemainingTime; } -- (int)fps +- (NSUInteger)fps { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - int result = libvlc_media_player_get_fps( instance, &ex ); - catch_exception( &ex ); - return result; + return libvlc_media_player_get_fps(instance); } -- (void)setChapter:(int)value; +#pragma mark - +#pragma mark Chapters +- (void)setCurrentChapterIndex:(NSUInteger)value; { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_player_set_chapter( instance, value, &ex ); - catch_exception( &ex ); + libvlc_media_player_set_chapter(instance, value); } -- (int)currentChapter +- (NSUInteger)currentChapterIndex { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - int result = libvlc_media_player_get_chapter( instance, &ex ); - catch_exception( &ex ); + NSInteger count = libvlc_media_player_get_chapter_count(instance); + if (count <= 0) + return NSNotFound; + NSUInteger result = libvlc_media_player_get_chapter(instance); return result; } -- (int)countOfChapters +- (void)nextChapter { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - int result = libvlc_media_player_get_chapter_count( instance, &ex ); - catch_exception( &ex ); - return result; + libvlc_media_player_next_chapter(instance); } -- (void)nextChapter +- (void)previousChapter { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_player_next_chapter( instance, &ex ); - catch_exception( &ex ); + libvlc_media_player_previous_chapter(instance); } -- (void)previousChapter +- (NSArray *)chaptersForTitleIndex:(NSUInteger)title { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_player_previous_chapter( instance, &ex ); - catch_exception( &ex ); + NSInteger count = libvlc_media_player_get_chapter_count(instance); + if (count <= 0) + return [NSArray array]; + + libvlc_track_description_t *tracks = libvlc_video_get_chapter_description(instance, title); + NSMutableArray *tempArray = [NSMutableArray array]; + NSInteger i; + for (i = 0; i < count ; i++) + { + [tempArray addObject:[NSString stringWithUTF8String:tracks->psz_name]]; + tracks = tracks->p_next; + } + libvlc_track_description_release(tracks); + return [NSArray arrayWithArray:tempArray]; } -- (void)setCurrentTitle:(int)value +#pragma mark - +#pragma mark Titles + +- (void)setCurrentTitleIndex:(NSUInteger)value { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_player_set_title( instance, value, &ex ); - catch_exception( &ex ); + libvlc_media_player_set_title(instance, value); } -- (int)currentTitle +- (NSUInteger)currentTitleIndex { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - int result = libvlc_media_player_get_title( instance, &ex ); - catch_exception( &ex ); - return result; + NSInteger count = libvlc_media_player_get_title_count(instance); + if (count <= 0) + return NSNotFound; + + return libvlc_media_player_get_title(instance); } -- (int)countOfTitles +- (NSUInteger)countOfTitles { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - int result = libvlc_media_player_get_title_count( instance, &ex ); - catch_exception( &ex ); + NSUInteger result = libvlc_media_player_get_title_count(instance); return result; } -- (void)setAudioTrack:(int)value +- (NSArray *)titles { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_audio_set_track( instance, value, &ex ); - catch_exception( &ex ); + libvlc_track_description_t *tracks = libvlc_video_get_title_description(instance); + NSMutableArray *tempArray = [NSMutableArray array]; + NSInteger i; + for (i = 0; i < [self countOfTitles] ; i++) + { + [tempArray addObject:[NSString stringWithUTF8String: tracks->psz_name]]; + tracks = tracks->p_next; + } + libvlc_track_description_release(tracks); + return [NSArray arrayWithArray: tempArray]; } -- (int)currentAudioTrack +#pragma mark - +#pragma mark Audio tracks +- (void)setCurrentAudioTrackIndex:(NSUInteger)value { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - int result = libvlc_audio_get_track( instance, &ex ); - catch_exception( &ex ); - return result; + libvlc_audio_set_track( instance, (int)value); } -- (int)countOfAudioTracks +- (NSUInteger)currentAudioTrackIndex { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - int result = libvlc_audio_get_track_count( instance, &ex ); - catch_exception( &ex ); + NSInteger count = libvlc_audio_get_track_count(instance); + if (count <= 0) + return NSNotFound; + + NSUInteger result = libvlc_audio_get_track(instance); return result; } -- (void)setAudioChannel:(int)value +- (NSArray *)audioTracks { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_audio_set_channel( instance, value, &ex ); - catch_exception( &ex ); + NSInteger count = libvlc_audio_get_track_count(instance); + if (count <= 0) + return [NSArray array]; + + libvlc_track_description_t *tracks = libvlc_audio_get_track_description(instance); + NSMutableArray *tempArray = [NSMutableArray array]; + NSUInteger i; + for (i = 0; i < count ; i++) + { + [tempArray addObject:[NSString stringWithUTF8String: tracks->psz_name]]; + tracks = tracks->p_next; + } + libvlc_track_description_release(tracks); + + return [NSArray arrayWithArray: tempArray]; } -- (int)audioChannel +- (void)setAudioChannel:(NSInteger)value { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - int result = libvlc_audio_get_channel( instance, &ex ); - catch_exception( &ex ); - return result; + libvlc_audio_set_channel(instance, value); +} + +- (NSInteger)audioChannel +{ + return libvlc_audio_get_channel(instance); } - (void)setMedia:(VLCMedia *)value @@ -559,14 +555,11 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * { if (media && [media compare:value] == NSOrderedSame) return; - + [media release]; media = [value retain]; - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_player_set_media( instance, [media libVLCMediaDescriptor], &ex ); - catch_exception( &ex ); + libvlc_media_player_set_media(instance, [media libVLCMediaDescriptor]); } } @@ -576,11 +569,8 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * } - (BOOL)play -{ - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_player_play( (libvlc_media_player_t *)instance, &ex ); - catch_exception( &ex ); +{ + libvlc_media_player_play(instance); return YES; } @@ -590,31 +580,25 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * { /* Hack because we create a dead lock here, when the vout is stopped * and tries to recontact us on the main thread */ - /* FIXME: to do this properly we need to do some locking. We may want + /* FIXME: to do this properly we need to do some locking. We may want * to move that to libvlc */ [self performSelectorInBackground:@selector(pause) withObject:nil]; return; } // Pause the stream - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_player_pause( (libvlc_media_player_t *)instance, &ex ); - - // fail gracefully - // in most cases, it's just EOF so let's stop - if (libvlc_exception_raised(&ex)) - [self stop]; - - libvlc_exception_clear(&ex); + libvlc_media_player_pause(instance); } - (void)stop { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_player_stop((libvlc_media_player_t *)instance, &ex); - catch_exception( &ex ); + libvlc_media_player_stop(instance); +} + +- (void)gotoNextFrame +{ + libvlc_media_player_next_frame(instance); + } - (void)fastForward @@ -641,7 +625,7 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * { if( [self isSeekable] ) { - interval = interval * 1000000; + interval = interval * 1000; [self setTime: [VLCTime timeWithInt: ([[self time] intValue] - interval)]]; } } @@ -650,7 +634,7 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * { if( [self isSeekable] ) { - interval = interval * 1000000; + interval = interval * 1000; [self setTime: [VLCTime timeWithInt: ([[self time] intValue] + interval)]]; } } @@ -709,16 +693,7 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * - (BOOL)willPlay { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - BOOL ret = libvlc_media_player_will_play( (libvlc_media_player_t *)instance, &ex ); - if (libvlc_exception_raised(&ex)) - { - libvlc_exception_clear(&ex); - return NO; - } - else - return ret; + return libvlc_media_player_will_play(instance); } static const VLCMediaPlayerState libvlc_to_local_state[] = @@ -744,28 +719,17 @@ static const VLCMediaPlayerState libvlc_to_local_state[] = - (void)setPosition:(float)newPosition { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - libvlc_media_player_set_position( instance, newPosition, &ex ); - catch_exception( &ex ); + libvlc_media_player_set_position(instance, newPosition); } - (BOOL)isSeekable { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - BOOL ret = libvlc_media_player_is_seekable( instance, &ex ); - catch_exception( &ex ); - return ret; + return libvlc_media_player_is_seekable(instance); } - (BOOL)canPause { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - BOOL ret = libvlc_media_player_can_pause( instance, &ex ); - catch_exception( &ex ); - return ret; + return libvlc_media_player_can_pause(instance); } - (void *)libVLCMediaPlayer @@ -782,6 +746,7 @@ static const VLCMediaPlayerState libvlc_to_local_state[] = delegate = nil; media = nil; cachedTime = [[VLCTime nullTime] retain]; + cachedRemainingTime = [[VLCTime nullTime] retain]; position = 0.0f; cachedState = VLCMediaPlayerStateStopped; @@ -790,11 +755,11 @@ static const VLCMediaPlayerState libvlc_to_local_state[] = // instance libvlc_exception_t ex; libvlc_exception_init( &ex ); - instance = (void *)libvlc_media_player_new([VLCLibrary sharedInstance], &ex); + instance = libvlc_media_player_new([VLCLibrary sharedInstance]); catch_exception( &ex ); - + [self registerObservers]; - + [self setDrawable:aDrawable]; } return self; @@ -802,30 +767,28 @@ static const VLCMediaPlayerState libvlc_to_local_state[] = - (void)registerObservers { - libvlc_exception_t ex; - libvlc_exception_init( &ex ); - // Attach event observers into the media instance - libvlc_event_manager_t * p_em = libvlc_media_player_event_manager( instance, &ex ); - libvlc_event_attach( p_em, libvlc_MediaPlayerPlaying, HandleMediaInstanceStateChanged, self, &ex ); - libvlc_event_attach( p_em, libvlc_MediaPlayerPaused, HandleMediaInstanceStateChanged, self, &ex ); - libvlc_event_attach( p_em, libvlc_MediaPlayerEncounteredError, HandleMediaInstanceStateChanged, self, &ex ); - libvlc_event_attach( p_em, libvlc_MediaPlayerEndReached, HandleMediaInstanceStateChanged, self, &ex ); + libvlc_event_manager_t * p_em = libvlc_media_player_event_manager(instance); + libvlc_event_attach(p_em, libvlc_MediaPlayerPlaying, HandleMediaInstanceStateChanged, self); + libvlc_event_attach(p_em, libvlc_MediaPlayerPaused, HandleMediaInstanceStateChanged, self); + libvlc_event_attach(p_em, libvlc_MediaPlayerEncounteredError, HandleMediaInstanceStateChanged, self); + libvlc_event_attach(p_em, libvlc_MediaPlayerEndReached, HandleMediaInstanceStateChanged, self); /* FIXME: We may want to turn that off when none is interested by that */ - libvlc_event_attach( p_em, libvlc_MediaPlayerPositionChanged, HandleMediaPositionChanged, self, &ex ); - libvlc_event_attach( p_em, libvlc_MediaPlayerTimeChanged, HandleMediaTimeChanged, self, &ex ); - catch_exception( &ex ); + libvlc_event_attach(p_em, libvlc_MediaPlayerPositionChanged, HandleMediaPositionChanged, self); + libvlc_event_attach(p_em, libvlc_MediaPlayerTimeChanged, HandleMediaTimeChanged, self); + libvlc_event_attach(p_em, libvlc_MediaPlayerMediaChanged, HandleMediaPlayerMediaChanged, self); } - (void)unregisterObservers { - libvlc_event_manager_t * p_em = libvlc_media_player_event_manager( instance, NULL ); - libvlc_event_detach( p_em, libvlc_MediaPlayerPlaying, HandleMediaInstanceStateChanged, self, NULL ); - libvlc_event_detach( p_em, libvlc_MediaPlayerPaused, HandleMediaInstanceStateChanged, self, NULL ); - libvlc_event_detach( p_em, libvlc_MediaPlayerEncounteredError, HandleMediaInstanceStateChanged, self, NULL ); - libvlc_event_detach( p_em, libvlc_MediaPlayerEndReached, HandleMediaInstanceStateChanged, self, NULL ); - libvlc_event_detach( p_em, libvlc_MediaPlayerPositionChanged, HandleMediaPositionChanged, self, NULL ); - libvlc_event_detach( p_em, libvlc_MediaPlayerTimeChanged, HandleMediaTimeChanged, self, NULL ); + libvlc_event_manager_t * p_em = libvlc_media_player_event_manager(instance); + libvlc_event_detach(p_em, libvlc_MediaPlayerPlaying, HandleMediaInstanceStateChanged, self); + libvlc_event_detach(p_em, libvlc_MediaPlayerPaused, HandleMediaInstanceStateChanged, self); + libvlc_event_detach(p_em, libvlc_MediaPlayerEncounteredError, HandleMediaInstanceStateChanged, self); + libvlc_event_detach(p_em, libvlc_MediaPlayerEndReached, HandleMediaInstanceStateChanged, self); + libvlc_event_detach(p_em, libvlc_MediaPlayerPositionChanged, HandleMediaPositionChanged, self); + libvlc_event_detach(p_em, libvlc_MediaPlayerTimeChanged, HandleMediaTimeChanged, self); + libvlc_event_detach(p_em, libvlc_MediaPlayerMediaChanged, HandleMediaPlayerMediaChanged, self); } - (void)mediaPlayerTimeChanged:(NSNumber *)newTime @@ -834,7 +797,10 @@ static const VLCMediaPlayerState libvlc_to_local_state[] = [self willChangeValueForKey:@"remainingTime"]; [cachedTime release]; cachedTime = [[VLCTime timeWithNumber:newTime] retain]; - + [cachedRemainingTime release]; + double currentTime = [[cachedTime numberValue] doubleValue]; + double remaining = currentTime / position * (1 - position); + cachedRemainingTime = [[VLCTime timeWithNumber:[NSNumber numberWithDouble:-remaining]] retain]; [self didChangeValueForKey:@"remainingTime"]; [self didChangeValueForKey:@"time"]; } @@ -861,4 +827,15 @@ static const VLCMediaPlayerState libvlc_to_local_state[] = [self didChangeValueForKey:@"state"]; } +- (void)mediaPlayerMediaChanged:(VLCMedia *)newMedia +{ + [self willChangeValueForKey:@"media"]; + if (media != newMedia) + { + [media release]; + media = [newMedia retain]; + } + [self didChangeValueForKey:@"media"]; +} + @end