X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fintf.m;h=aa529071f5f1ab0785d6094a4fbccbca3b063e8f;hb=d6fd7e4227ae722e6e2a52f0db1054ab7d731ae5;hp=cac24fa4c8c93e7cef7e8c519c461ab5d73a5c69;hpb=d4d9a5656601fdb1cc62d5c595dd75bf1a11a529;p=vlc diff --git a/modules/gui/macosx/intf.m b/modules/gui/macosx/intf.m index cac24fa4c8..aa529071f5 100644 --- a/modules/gui/macosx/intf.m +++ b/modules/gui/macosx/intf.m @@ -48,7 +48,6 @@ #import "wizard.h" #import "extended.h" #import "bookmarks.h" -#import "sfilters.h" #import "interaction.h" #import "embeddedwindow.h" #import "update.h" @@ -106,7 +105,6 @@ int OpenIntf ( vlc_object_t *p_this ) p_intf->p_sys->o_pool = [[NSAutoreleasePool alloc] init]; - p_intf->p_sys->o_sendport = [[NSPort port] retain]; p_intf->p_sys->p_sub = msg_Subscribe( p_intf ); p_intf->pf_run = Run; p_intf->b_should_run_on_first_thread = true; @@ -125,7 +123,6 @@ void CloseIntf ( vlc_object_t *p_this ) msg_Unsubscribe( p_intf, p_intf->p_sys->p_sub ); - [p_intf->p_sys->o_sendport release]; [p_intf->p_sys->o_pool release]; free( p_intf->p_sys ); @@ -184,70 +181,6 @@ static void * ManageThread( void *user_data ) return NULL; } -int ExecuteOnMainThread( id target, SEL sel, void * p_arg ) -{ - int i_ret = 0; - - //NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init]; - - if( [target respondsToSelector: @selector(performSelectorOnMainThread: - withObject:waitUntilDone:)] ) - { - [target performSelectorOnMainThread: sel - withObject: [NSValue valueWithPointer: p_arg] - waitUntilDone: NO]; - } - else if( NSApp != nil && [[VLCMain sharedInstance] respondsToSelector: @selector(getIntf)] ) - { - NSValue * o_v1; - NSValue * o_v2; - NSArray * o_array; - NSPort * o_recv_port; - NSInvocation * o_inv; - NSPortMessage * o_msg; - intf_thread_t * p_intf; - NSConditionLock * o_lock; - NSMethodSignature * o_sig; - - id * val[] = { &o_lock, &o_v2 }; - - p_intf = (intf_thread_t *)VLCIntf; - - o_recv_port = [[NSPort port] retain]; - o_v1 = [NSValue valueWithPointer: val]; - o_v2 = [NSValue valueWithPointer: p_arg]; - - o_sig = [target methodSignatureForSelector: sel]; - o_inv = [NSInvocation invocationWithMethodSignature: o_sig]; - [o_inv setArgument: &o_v1 atIndex: 2]; - [o_inv setTarget: target]; - [o_inv setSelector: sel]; - - o_array = [NSArray arrayWithObject: - [NSData dataWithBytes: &o_inv length: sizeof(o_inv)]]; - o_msg = [[NSPortMessage alloc] - initWithSendPort: p_intf->p_sys->o_sendport - receivePort: o_recv_port components: o_array]; - - o_lock = [[NSConditionLock alloc] initWithCondition: 0]; - [o_msg sendBeforeDate: [NSDate distantPast]]; - [o_lock lockWhenCondition: 1]; - [o_lock unlock]; - [o_lock release]; - - [o_msg release]; - [o_recv_port release]; - } - else - { - i_ret = 1; - } - - //[o_pool release]; - - return( i_ret ); -} - /***************************************************************************** * playlistChanged: Callback triggered by the intf-change playlist * variable, to let the intf update the playlist. @@ -415,7 +348,6 @@ static VLCMain *_o_sharedMainInstance = nil; o_embedded_list = [[VLCEmbeddedList alloc] init]; o_interaction_list = [[VLCInteractionList alloc] init]; o_info = [[VLCInfo alloc] init]; - o_sfilters = nil; #ifdef UPDATE_CHECK o_update = [[VLCUpdate alloc] init]; #endif @@ -549,7 +481,7 @@ static VLCMain *_o_sharedMainInstance = nil; var_AddCallback( p_playlist, "fullscreen", FullscreenChanged, self); var_AddCallback( p_intf->p_libvlc, "intf-show", ShowController, self); - vlc_object_release( p_playlist ); + pl_Release( p_intf ); var_Create( p_intf, "interaction", VLC_VAR_ADDRESS ); var_AddCallback( p_intf, "interaction", InteractCallback, self ); @@ -772,11 +704,6 @@ static VLCMain *_o_sharedMainInstance = nil; o_msg_lock = [[NSLock alloc] init]; o_msg_arr = [[NSMutableArray arrayWithCapacity: 200] retain]; - [p_intf->p_sys->o_sendport setDelegate: self]; - [[NSRunLoop currentRunLoop] - addPort: p_intf->p_sys->o_sendport - forMode: NSDefaultRunLoopMode]; - /* FIXME: don't poll */ interfaceTimer = [[NSTimer scheduledTimerWithTimeInterval: 0.5 target: self selector: @selector(manageIntf:) @@ -1205,6 +1132,7 @@ static VLCMain *_o_sharedMainInstance = nil; - (void)manage { playlist_t * p_playlist; + input_thread_t * p_input = NULL; /* new thread requires a new pool */ NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init]; @@ -1226,24 +1154,25 @@ static VLCMain *_o_sharedMainInstance = nil; { vlc_mutex_lock( &p_intf->change_lock ); - if( p_intf->p_sys->p_input == NULL ) + if( !p_input ) { - p_intf->p_sys->p_input = p_playlist->p_input; + p_input = playlist_CurrentInput( p_playlist ); /* Refresh the interface */ - if( p_intf->p_sys->p_input ) + if( p_input ) { msg_Dbg( p_intf, "input has changed, refreshing interface" ); p_intf->p_sys->b_input_update = true; } } - else if( p_intf->p_sys->p_input->b_die || p_intf->p_sys->p_input->b_dead ) + else if( !vlc_object_alive (p_input) || p_input->b_dead ) { /* input stopped */ p_intf->p_sys->b_intf_update = true; p_intf->p_sys->i_play_status = END_S; msg_Dbg( p_intf, "input has stopped, refreshing interface" ); - p_intf->p_sys->p_input = NULL; + vlc_object_release( p_input ); + p_input = NULL; } /* Manage volume status */ @@ -1256,6 +1185,8 @@ static VLCMain *_o_sharedMainInstance = nil; vlc_object_unlock( p_intf ); [o_pool release]; + if( p_input ) vlc_object_release( p_input ); + var_DelCallback( p_playlist, "playlist-current", PlaylistChanged, self ); var_DelCallback( p_playlist, "intf-change", PlaylistChanged, self ); var_DelCallback( p_playlist, "item-change", PlaylistChanged, self ); @@ -1264,7 +1195,7 @@ static VLCMain *_o_sharedMainInstance = nil; pthread_testcancel(); /* If we were cancelled stop here */ - msg_Info( p_intf, "Killing the Mac OS X module" ); + msg_Dbg( p_intf, "Killing the Mac OS X module" ); /* We are dead, terminate */ [NSApp performSelectorOnMainThread: @selector(terminate:) withObject:nil waitUntilDone:NO]; @@ -1310,7 +1241,7 @@ static VLCMain *_o_sharedMainInstance = nil; //b_chapters = p_input->stream.i_area_nb > 1; vlc_object_release( p_input ); } - vlc_object_release( p_playlist ); + pl_Release( p_intf ); [o_btn_stop setEnabled: b_input]; [o_btn_ff setEnabled: b_seekable]; @@ -1358,7 +1289,7 @@ static VLCMain *_o_sharedMainInstance = nil; p_input = vlc_object_find( p_playlist, VLC_OBJECT_INPUT, FIND_CHILD ); - if( p_input && !p_input->b_die ) + if( p_input && vlc_object_alive (p_input) ) { vlc_value_t val; @@ -1369,8 +1300,8 @@ static VLCMain *_o_sharedMainInstance = nil; if( p_playlist->status.p_item == NULL ) { vlc_object_release( p_input ); - vlc_object_release( p_playlist ); - return; + pl_Release( p_intf ); + goto end; } if( input_item_GetNowPlaying ( p_playlist->status.p_item->p_input ) ) o_temp = [NSString stringWithUTF8String: @@ -1437,13 +1368,13 @@ static VLCMain *_o_sharedMainInstance = nil; else { p_intf->p_sys->i_play_status = END_S; - p_intf->p_sys->b_playlist_update = true; [self playStatusUpdated: p_intf->p_sys->i_play_status]; [o_embedded_window playStatusUpdated: p_intf->p_sys->i_play_status]; [self setSubmenusEnabled: FALSE]; } - vlc_object_release( p_playlist ); + pl_Release( p_intf ); +end: [self updateMessageArray]; if( ((i_end_scroll != -1) && (mdate() > i_end_scroll)) || !p_input ) @@ -1459,10 +1390,9 @@ static VLCMain *_o_sharedMainInstance = nil; - (void)setupMenus { playlist_t * p_playlist = pl_Yield( p_intf ); - input_thread_t * p_input = p_playlist->p_input; + input_thread_t * p_input = playlist_CurrentInput( p_playlist ); if( p_input != NULL ) { - vlc_object_yield( p_input ); [o_controls setupVarMenuItem: o_mi_program target: (vlc_object_t *)p_input var: "program" selector: @selector(toggleVar:)]; @@ -1531,7 +1461,7 @@ static VLCMain *_o_sharedMainInstance = nil; } vlc_object_release( p_input ); } - vlc_object_release( p_playlist ); + pl_Release( p_intf ); } - (void)refreshVoutDeviceMenu:(NSNotification *)o_notification @@ -1573,13 +1503,12 @@ static VLCMain *_o_sharedMainInstance = nil; - (void)resetScrollField { playlist_t * p_playlist = pl_Yield( p_intf ); - input_thread_t * p_input = p_playlist->p_input; + input_thread_t * p_input = playlist_CurrentInput( p_playlist ); i_end_scroll = -1; - if( p_input && !p_input->b_die ) + if( p_input && vlc_object_alive (p_input) ) { NSString *o_temp; - vlc_object_yield( p_input ); if( input_item_GetNowPlaying ( p_playlist->status.p_item->p_input ) ) o_temp = [NSString stringWithUTF8String: input_item_GetNowPlaying ( p_playlist->status.p_item->p_input )]; @@ -1589,10 +1518,10 @@ static VLCMain *_o_sharedMainInstance = nil; [self setScrollField: o_temp stopAfter:-1]; [[[self getControls] getFSPanel] setStreamTitle: o_temp]; vlc_object_release( p_input ); - vlc_object_release( p_playlist ); + pl_Release( p_intf ); return; } - vlc_object_release( p_playlist ); + pl_Release( p_intf ); [self setScrollField: _NS("VLC media player") stopAfter:-1]; } @@ -1732,14 +1661,13 @@ static VLCMain *_o_sharedMainInstance = nil; return; } p_playlist = pl_Yield( p_intf ); - p_input = p_playlist->p_input; + p_input = playlist_CurrentInput( p_playlist ); if( p_input != NULL ) { vlc_value_t time; vlc_value_t pos; NSString * o_time; char psz_time[MSTRTIME_MAX_SIZE]; - vlc_object_yield( p_input ); pos.f_float = f_updated / 10000.; var_Set( p_input, "position", pos ); @@ -1753,7 +1681,7 @@ static VLCMain *_o_sharedMainInstance = nil; [o_embedded_window setTime: o_time position: f_updated]; vlc_object_release( p_input ); } - vlc_object_release( p_playlist ); + pl_Release( p_intf ); } - (void)applicationWillTerminate:(NSNotification *)notification @@ -1844,6 +1772,12 @@ static VLCMain *_o_sharedMainInstance = nil; /* write cached user defaults to disk */ [[NSUserDefaults standardUserDefaults] synchronize]; + /* Kill the playlist, so that it doesn't accept new request + * such as the play request from vlc.c (we are a blocking interface). */ + p_playlist = pl_Yield( p_intf ); + vlc_object_kill( p_playlist ); + pl_Release( p_intf ); + vlc_object_kill( p_intf->p_libvlc ); /* Go back to Run() and make libvlc exit properly */ @@ -1949,22 +1883,6 @@ static VLCMain *_o_sharedMainInstance = nil; [o_extended showPanel]; } -- (IBAction)showSFilters:(id)sender -{ - if( o_sfilters == nil ) - { - o_sfilters = [[VLCsFilters alloc] init]; - } - if( !nib_sfilters_loaded ) - { - nib_sfilters_loaded = [NSBundle loadNibNamed:@"SFilters" owner:self]; - [o_sfilters initStrings]; - [o_sfilters showAsPanel]; - } else { - [o_sfilters showAsPanel]; - } -} - - (IBAction)showBookmarks:(id)sender { /* we need the wizard-nib for the bookmarks's extract functionality */ @@ -2005,12 +1923,7 @@ static VLCMain *_o_sharedMainInstance = nil; o_prefs= [[VLCPrefs alloc] init]; } - if( sender == o_mi_sprefs ) - { - [o_sprefs showSimplePrefs]; - } - else - [o_prefs showPrefs]; + [o_sprefs showSimplePrefs]; } - (IBAction)checkForUpdate:(id)sender