#import "wizard.h"
#import "extended.h"
#import "bookmarks.h"
-#import "sfilters.h"
#import "interaction.h"
#import "embeddedwindow.h"
#import "update.h"
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;
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 );
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.
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
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 );
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:)
- (void)manage
{
playlist_t * p_playlist;
+ input_thread_t * p_input = NULL;
/* new thread requires a new pool */
NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init];
{
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 */
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 );
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];
//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];
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;
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:
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 )
- (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:)];
}
vlc_object_release( p_input );
}
- vlc_object_release( p_playlist );
+ pl_Release( p_intf );
}
- (void)refreshVoutDeviceMenu:(NSNotification *)o_notification
- (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 )];
[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];
}
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 );
[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
/* 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 */
[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 */
o_prefs= [[VLCPrefs alloc] init];
}
- if( sender == o_mi_sprefs )
- {
- [o_sprefs showSimplePrefs];
- }
- else
- [o_prefs showPrefs];
+ [o_sprefs showSimplePrefs];
}
- (IBAction)checkForUpdate:(id)sender