From ee9c15aa23f74505c869ff00d0a7d6ed9ca01eaa Mon Sep 17 00:00:00 2001 From: Pierre d'Herbemont Date: Tue, 25 Dec 2007 22:55:15 +0000 Subject: [PATCH] MacOSX/Framework/VLCMediaDiscoverer: Publish -isRunning. --- .../Headers/Public/VLCMediaDiscoverer.h | 3 + .../Framework/Sources/VLCMediaDiscoverer.m | 72 +++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/extras/MacOSX/Framework/Headers/Public/VLCMediaDiscoverer.h b/extras/MacOSX/Framework/Headers/Public/VLCMediaDiscoverer.h index 2ebd6f5d28..729bb12292 100644 --- a/extras/MacOSX/Framework/Headers/Public/VLCMediaDiscoverer.h +++ b/extras/MacOSX/Framework/Headers/Public/VLCMediaDiscoverer.h @@ -32,6 +32,7 @@ NSString *localizedName; VLCMediaList * discoveredMedia; void * mdis; + BOOL running; } + (NSArray *)availableMediaDiscoverer; @@ -40,4 +41,6 @@ - (VLCMediaList *)discoveredMedia; - (NSString *)localizedName; + +- (BOOL)isRunning; @end diff --git a/extras/MacOSX/Framework/Sources/VLCMediaDiscoverer.m b/extras/MacOSX/Framework/Sources/VLCMediaDiscoverer.m index 6bfa83e2be..4fd895cfe0 100644 --- a/extras/MacOSX/Framework/Sources/VLCMediaDiscoverer.m +++ b/extras/MacOSX/Framework/Sources/VLCMediaDiscoverer.m @@ -26,11 +26,40 @@ #import "VLCMediaDiscoverer.h" #import "VLCLibrary.h" #import "VLCLibVLCBridging.h" +#import "VLCEventManager.h" #include static NSArray * availableMediaDiscoverer = nil; +@interface VLCMediaDiscoverer (Private) +- (void)mediaDiscovererStarted; +- (void)mediaDiscovererEnded; +@end + +/* libvlc event callback */ +static void HandleMediaDiscovererStarted(const libvlc_event_t *event, void *user_data) +{ + NSLog(@"oopps"); + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + id self = user_data; + [[VLCEventManager sharedManager] callOnMainThreadObject:self + withMethod:@selector(mediaDiscovererStarted) + withArgumentAsObject:nil]; + [pool release]; +} + +static void HandleMediaDiscovererEnded( const libvlc_event_t * event, void * user_data) +{ + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + id self = user_data; + [[VLCEventManager sharedManager] callOnMainThreadObject:self + withMethod:@selector(mediaDiscovererEnded) + withArgumentAsObject:nil]; + [pool release]; +} + + @implementation VLCMediaDiscoverer + (NSArray *)availableMediaDiscoverer { @@ -55,11 +84,33 @@ static NSArray * availableMediaDiscoverer = nil; mdis = libvlc_media_discoverer_new_from_name( [VLCLibrary sharedInstance], [aServiceName UTF8String], &ex ); + libvlc_event_manager_t * p_em = libvlc_media_discoverer_event_manager(mdis); + libvlc_event_attach(p_em, libvlc_MediaDiscovererStarted, HandleMediaDiscovererStarted, self, NULL); + libvlc_event_attach(p_em, libvlc_MediaDiscovererEnded, HandleMediaDiscovererEnded, self, NULL); + running = libvlc_media_discoverer_is_running(mdis); + quit_on_exception( &ex ); } return self; } +- (void)release +{ + @synchronized(self) + { + if([self retainCount] <= 1) + { + /* We must make sure we won't receive new event after an upcoming dealloc + * We also may receive a -retain in some event callback that may occcur + * Before libvlc_event_detach. So this can't happen in dealloc */ + libvlc_event_manager_t * p_em = libvlc_media_list_event_manager(mdis, NULL); + libvlc_event_detach(p_em, libvlc_MediaDiscovererStarted, HandleMediaDiscovererStarted, self, NULL); + libvlc_event_detach(p_em, libvlc_MediaDiscovererEnded, HandleMediaDiscovererEnded, self, NULL); + } + [super release]; + } +} + - (void)dealloc { if( localizedName ) @@ -105,4 +156,25 @@ static NSArray * availableMediaDiscoverer = nil; } return localizedName; } + +- (BOOL)isRunning +{ + return running; +} +@end + +@implementation VLCMediaDiscoverer (Private) +- (void)mediaDiscovererStarted +{ + [self willChangeValueForKey:@"running"]; + running = YES; + NSLog(@"mediaDiscovererStarted %@", [self localizedName]); + [self didChangeValueForKey:@"running"]; +} +- (void)mediaDiscovererEnded +{ + [self willChangeValueForKey:@"running"]; + running = NO; + [self didChangeValueForKey:@"running"]; +} @end -- 2.39.2