Commit e5d609fd authored by Felix Paul Kühne's avatar Felix Paul Kühne

macosx: remove 2 interface update timers (2 threads), 1 additional interface...

macosx: remove 2 interface update timers (2 threads), 1 additional interface update thread and replaced everything by callbacks
parent 4e33295f
......@@ -179,9 +179,6 @@ static VLCCoreInteraction *_o_sharedInstance = nil;
//vout_OSDMessage( VLCIntf, SPU_DEFAULT_CHANNEL, "%s", _( "Random Off" ) );
config_PutInt( p_playlist, "random", 0 );
}
VLCIntf->p_sys->b_playmode_update = true;
VLCIntf->p_sys->b_intf_update = true;
}
- (void)repeatAll
......@@ -194,9 +191,6 @@ static VLCCoreInteraction *_o_sharedInstance = nil;
config_PutInt( p_playlist, "loop", YES );
//vout_OSDMessage( VLCIntf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat All" ) );
VLCIntf->p_sys->b_playmode_update = true;
VLCIntf->p_sys->b_intf_update = true;
}
- (void)repeatOne
......@@ -209,9 +203,6 @@ static VLCCoreInteraction *_o_sharedInstance = nil;
config_PutInt( p_playlist, "loop", NO );
//vout_OSDMessage( VLCIntf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat One" ) );
VLCIntf->p_sys->b_playmode_update = true;
VLCIntf->p_sys->b_intf_update = true;
}
- (void)repeatOff
......@@ -224,9 +215,6 @@ static VLCCoreInteraction *_o_sharedInstance = nil;
config_PutInt( p_playlist, "loop", NO );
//vout_OSDMessage( VLCIntf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat Off" ) );
VLCIntf->p_sys->b_playmode_update = true;
VLCIntf->p_sys->b_intf_update = true;
}
// CAVE: [o_main manageVolumeSlider]
......
......@@ -207,6 +207,7 @@
- (IBAction)intfOpenCapture:(id)sender;
- (IBAction)setPlaybackRate:(id)sender;
- (void)updatePlaybackRate;
- (IBAction)showWizard:(id)sender;
- (IBAction)showVideoEffects:(id)sender;
......@@ -228,6 +229,10 @@
- (void)setPlay;
- (void)setPause;
- (void)setRepeatOne;
- (void)setRepeatAll;
- (void)setRepeatOff;
- (void)setShuffle;
- (IBAction)toggleVar:(id)sender;
- (int)toggleVarThread:(id)_o_data;
......
......@@ -549,6 +549,14 @@ static VLCMainMenu *_o_sharedInstance = nil;
[o_mi_rate_fld setStringValue: [NSString stringWithFormat:@"%ix", i]];
}
- (void)updatePlaybackRate
{
int i = [[VLCCoreInteraction sharedInstance] playbackRate];
if (i == 0)
i = 1;
[o_mi_rate_fld setStringValue: [NSString stringWithFormat:@"%ix", i]];
[o_mi_rate_sld setIntValue: i];
}
#pragma mark -
#pragma mark Panels
......@@ -721,6 +729,32 @@ static VLCMainMenu *_o_sharedInstance = nil;
[o_vmi_play setTitle: _NS("Pause")];
}
- (void)setRepeatOne
{
[o_mi_repeat setState: NSOnState];
[o_mi_loop setState: NSOffState];
}
- (void)setRepeatAll
{
[o_mi_repeat setState: NSOffState];
[o_mi_loop setState: NSOnState];
}
- (void)setRepeatOff
{
[o_mi_repeat setState: NSOffState];
[o_mi_loop setState: NSOffState];
}
- (void)setShuffle
{
bool b_value;
playlist_t *p_playlist = pl_Get( VLCIntf );
b_value = var_GetBool( p_playlist, "random" );
[o_mi_random setState: b_value];
}
#pragma mark -
#pragma mark Dynamic menu creation and validation
......
......@@ -95,7 +95,12 @@
- (void)updateTimeSlider;
- (void)updateVolumeSlider;
- (void)updateWindow;
- (void)updateTitle;
- (void)setPause;
- (void)setPlay;
- (void)setRepeatOne;
- (void)setRepeatAll;
- (void)setRepeatOff;
- (void)setShuffle;
@end
\ No newline at end of file
......@@ -255,6 +255,24 @@ static VLCMainWindow *_o_sharedInstance = nil;
}
}
- (void)setRepeatOne
{
[o_repeat_btn setImage: o_repeat_one_img];
[o_repeat_btn setAlternateImage: o_repeat_one_pressed_img];
}
- (void)setRepeatAll
{
[o_repeat_btn setImage: o_repeat_all_img];
[o_repeat_btn setAlternateImage: o_repeat_all_pressed_img];
}
- (void)setRepeatOff
{
[o_repeat_btn setImage: o_repeat_img];
[o_repeat_btn setAlternateImage: o_repeat_pressed_img];
}
- (IBAction)repeat:(id)sender
{
vlc_value_t looping,repeating;
......@@ -268,36 +286,28 @@ static VLCMainWindow *_o_sharedInstance = nil;
{
/* was: no repeating at all, switching to Repeat One */
[[VLCCoreInteraction sharedInstance] repeatOne];
[o_repeat_btn setImage: o_repeat_one_img];
[o_repeat_btn setAlternateImage: o_repeat_one_pressed_img];
[self setRepeatOne];
}
else if( repeating.b_bool && !looping.b_bool )
{
/* was: Repeat One, switching to Repeat All */
[[VLCCoreInteraction sharedInstance] repeatAll];
[o_repeat_btn setImage: o_repeat_all_img];
[o_repeat_btn setAlternateImage: o_repeat_all_pressed_img];
[self setRepeatAll];
}
else
{
/* was: Repeat All or bug in VLC, switching to Repeat Off */
[[VLCCoreInteraction sharedInstance] repeatOff];
[o_repeat_btn setImage: o_repeat_img];
[o_repeat_btn setAlternateImage: o_repeat_pressed_img];
[self setRepeatOff];
}
}
- (IBAction)shuffle:(id)sender
- (void)setShuffle
{
[[VLCCoreInteraction sharedInstance] shuffle];
vlc_value_t val;
bool b_value;
playlist_t *p_playlist = pl_Get( VLCIntf );
var_Get( p_playlist, "random", &val );
if(val.b_bool) {
b_value = var_GetBool( p_playlist, "random" );
if(b_value) {
[o_shuffle_btn setImage: o_shuffle_on_img];
[o_shuffle_btn setAlternateImage: o_shuffle_on_pressed_img];
}
......@@ -308,6 +318,12 @@ static VLCMainWindow *_o_sharedInstance = nil;
}
}
- (IBAction)shuffle:(id)sender
{
[[VLCCoreInteraction sharedInstance] shuffle];
[self setShuffle];
}
- (IBAction)timeSliderAction:(id)sender
{
float f_updated;
......@@ -383,35 +399,32 @@ static VLCMainWindow *_o_sharedInstance = nil;
#pragma mark Update interface and respond to foreign events
- (void)updateTimeSlider
{
if ([o_time_sld isEnabled])
input_thread_t * p_input;
p_input = pl_CurrentInput( VLCIntf );
if( p_input )
{
input_thread_t * p_input;
p_input = pl_CurrentInput( VLCIntf );
if( p_input )
vlc_value_t time;
NSString * o_time;
vlc_value_t pos;
char psz_time[MSTRTIME_MAX_SIZE];
float f_updated;
var_Get( p_input, "position", &pos );
f_updated = 10000. * pos.f_float;
[o_time_sld setFloatValue: f_updated];
var_Get( p_input, "time", &time );
mtime_t dur = input_item_GetDuration( input_GetItem( p_input ) );
if( b_time_remaining && dur != -1 )
{
vlc_value_t time;
NSString * o_time;
vlc_value_t pos;
char psz_time[MSTRTIME_MAX_SIZE];
float f_updated;
var_Get( p_input, "position", &pos );
f_updated = 10000. * pos.f_float;
[o_time_sld setFloatValue: f_updated];
var_Get( p_input, "time", &time );
mtime_t dur = input_item_GetDuration( input_GetItem( p_input ) );
if( b_time_remaining && dur != -1 )
{
o_time = [NSString stringWithFormat: @"-%s", secstotimestr( psz_time, ((dur - time.i_time) / 1000000))];
}
else
o_time = [NSString stringWithUTF8String: secstotimestr( psz_time, (time.i_time / 1000000) )];
[o_time_fld setStringValue: o_time];
// [[[[VLCMain sharedInstance] controls] fspanel] setStreamPos: f_updated andTime: o_time];
o_time = [NSString stringWithFormat: @"-%s", secstotimestr( psz_time, ((dur - time.i_time) / 1000000))];
}
else
o_time = [NSString stringWithUTF8String: secstotimestr( psz_time, (time.i_time / 1000000) )];
[o_time_fld setStringValue: o_time];
// [[[[VLCMain sharedInstance] controls] fspanel] setStreamPos: f_updated andTime: o_time];
}
}
......@@ -432,6 +445,29 @@ static VLCMainWindow *_o_sharedInstance = nil;
}
}
- (void)updateTitle
{
input_thread_t * p_input;
p_input = pl_CurrentInput( VLCIntf );
if( p_input )
{
NSString *aString;
input_item_t * p_item = input_GetItem( p_input );
char * name = input_item_GetNowPlaying( p_item );
if( !name )
name = input_item_GetName( p_item );
aString = [NSString stringWithUTF8String:name];
free(name);
[self setTitle: aString];
[[[[VLCMain sharedInstance] controls] fspanel] setStreamTitle: aString];
}
}
- (void)updateWindow
{
bool b_input = false;
......@@ -483,10 +519,9 @@ static VLCMainWindow *_o_sharedInstance = nil;
[o_bwd_btn setEnabled: (b_seekable || b_plmul || b_chapters)];
[[VLCMainMenu sharedInstance] setRateControlsEnabled: b_control];
[o_time_sld setFloatValue: 0.0];
[o_time_sld setEnabled: b_seekable];
[o_time_fld setStringValue: @"0:00:00"];
[[[[VLCMain sharedInstance] controls] fspanel] setStreamPos: 0 andTime: @"0:00:00"];
[self updateTimeSlider];
[[[[VLCMain sharedInstance] controls] fspanel] setSeekable: b_seekable];
}
......
......@@ -33,11 +33,6 @@
{
IBOutlet id o_main;
IBOutlet id o_volumeslider;
IBOutlet id o_btn_repeat;
IBOutlet id o_btn_shuffle;
IBOutlet id o_specificTime_cancel_btn;
IBOutlet id o_specificTime_enter_fld;
IBOutlet id o_specificTime_goTo_lbl;
......@@ -51,16 +46,12 @@
}
- (IBAction)play:(id)sender;
- (IBAction)stop:(id)sender;
- (IBAction)faster:(id)sender;
- (IBAction)slower:(id)sender;
- (IBAction)normalSpeed:(id)sender;
- (IBAction)prev:(id)sender;
- (IBAction)next:(id)sender;
- (IBAction)random:(id)sender;
- (IBAction)repeat:(id)sender;
- (IBAction)loop:(id)sender;
- (IBAction)repeatButtonAction:(id)sender;
- (IBAction)quitAfterPlayback:(id)sender;
- (IBAction)forward:(id)sender;
......
......@@ -80,21 +80,6 @@
[[VLCCoreInteraction sharedInstance] stop];
}
- (IBAction)faster:(id)sender
{
[[VLCCoreInteraction sharedInstance] faster];
}
- (IBAction)slower:(id)sender
{
[[VLCCoreInteraction sharedInstance] slower];
}
- (IBAction)normalSpeed:(id)sender
{
[[VLCCoreInteraction sharedInstance] normalSpeed];
}
- (IBAction)prev:(id)sender
{
[[VLCCoreInteraction sharedInstance] previous];
......@@ -108,57 +93,8 @@
- (IBAction)random:(id)sender
{
[[VLCCoreInteraction sharedInstance] shuffle];
vlc_value_t val;
playlist_t *p_playlist = pl_Get( VLCIntf );
var_Get( p_playlist, "random", &val );
if(val.b_bool) {
[o_btn_shuffle setImage: [NSImage imageNamed:@"shuffle-on"]];
[o_btn_shuffle setAlternateImage: [NSImage imageNamed:@"shuffle-blue-pressed"]];
}
else
{
[o_btn_shuffle setImage: [NSImage imageNamed:@"shuffle"]];
[o_btn_shuffle setAlternateImage: [NSImage imageNamed:@"shuffle-pressed"]];
}
}
- (IBAction)repeatButtonAction:(id)sender
{
vlc_value_t looping,repeating;
intf_thread_t * p_intf = VLCIntf;
playlist_t * p_playlist = pl_Get( p_intf );
var_Get( p_playlist, "repeat", &repeating );
var_Get( p_playlist, "loop", &looping );
if( !repeating.b_bool && !looping.b_bool )
{
/* was: no repeating at all, switching to Repeat One */
[[VLCCoreInteraction sharedInstance] repeatOne];
[o_btn_repeat setImage: [NSImage imageNamed:@"repeat-one"]];
[o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat-one-pressed"]];
}
else if( repeating.b_bool && !looping.b_bool )
{
/* was: Repeat One, switching to Repeat All */
[[VLCCoreInteraction sharedInstance] repeatAll];
[o_btn_repeat setImage: [NSImage imageNamed:@"repeat-all"]];
[o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat-all-pressed"]];
}
else
{
/* was: Repeat All or bug in VLC, switching to Repeat Off */
[[VLCCoreInteraction sharedInstance] repeatOff];
[o_btn_repeat setImage: [NSImage imageNamed:@"repeat"]];
[o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat-pressed"]];
}
}
- (IBAction)repeat:(id)sender
{
vlc_value_t val;
......@@ -202,7 +138,6 @@
[[VLCCoreInteraction sharedInstance] backward];
}
- (IBAction)volumeUp:(id)sender
{
[[VLCCoreInteraction sharedInstance] volumeUp];
......
......@@ -66,16 +66,6 @@ aout_instance_t *getAout(void);
*****************************************************************************/
struct intf_sys_t
{
/* special actions */
int i_play_status;
int i_old_play_status;
/* interface update */
bool b_intf_update;
bool b_playlist_update;
bool b_playmode_update;
bool b_current_title_update;
/* menus handlers */
bool b_input_update;
bool b_aout_update;
......@@ -141,12 +131,6 @@ struct intf_sys_t
input_state_e cachedInputState;
/* the manage thread */
pthread_t manage_thread;
/* The timer that update the interface */
NSTimer * interfaceTimer;
NSURLConnection * crashLogURLConnection;
AppleRemote * o_remote;
......@@ -187,15 +171,20 @@ struct intf_sys_t
- (NSString *)VLCKeyToString:(NSString *)theString;
- (unsigned int)VLCModifiersToCocoa:(NSString *)theString;
- (void)updateCurrentlyUsedHotkeys;
- (void)PlaylistItemChanged;
- (void)playbackStatusUpdated;
- (void)playbackModeUpdated;
- (void)updateVolume;
- (void)updatePlaybackPosition;
- (void)updateTitle;
- (void)playlistUpdated;
- (void)updateInfoandMetaPanel;
- (void)updateMainWindow;
- (void)initStrings;
- (BOOL)application:(NSApplication *)o_app openFile:(NSString *)o_filename;
- (void)manage;
- (void)manageIntf:(NSTimer *)o_timer;
- (void)updateMessageDisplay;
- (void)playStatusUpdated:(int) i_status;
- (IBAction)showController:(id)sender;
- (IBAction)crashReporterAction:(id)sender;
......
This diff is collapsed.
......@@ -124,7 +124,7 @@
- (IBAction)searchItem:(id)sender;
- (void)playlistUpdated;
- (void)playModeUpdated;
- (void)outlineViewSelectionDidChange:(NSNotification *)notification;
- (void)sortNode:(int)i_mode;
- (void)updateRowSelection;
......
......@@ -521,25 +521,6 @@
[self outlineViewSelectionDidChange: nil];
}
- (void)playModeUpdated
{
//FIXME this is broken, re-write with VLCMainWindow!
NSLog( @"playModeUpdated is broken, re-write with VLCMainWindow!" );
/*
playlist_t *p_playlist = pl_Get( VLCIntf );
bool loop = var_GetBool( p_playlist, "loop" );
bool repeat = var_GetBool( p_playlist, "repeat" );
if( repeat )
[[[VLCMain sharedInstance] controls] repeatOne];
else if( loop )
[[[VLCMain sharedInstance] controls] repeatAll];
else
[[[VLCMain sharedInstance] controls] repeatOff];
[[[VLCMain sharedInstance] controls] shuffle];*/
}
- (void)outlineViewSelectionDidChange:(NSNotification *)notification
{
// FIXME: unsafe
......@@ -1481,8 +1462,7 @@
id o_playing_item;
PL_LOCK;
o_playing_item = [o_outline_dict objectForKey:
[NSString stringWithFormat:@"%p", playlist_CurrentPlayingItem( p_playlist )]];
o_playing_item = [o_outline_dict objectForKey: [NSString stringWithFormat:@"%p", playlist_CurrentPlayingItem( p_playlist )]];
PL_UNLOCK;
return o_playing_item;
......
......@@ -98,11 +98,9 @@
VLCInfoTreeItem * rootItem;
input_item_t * p_item;
NSTimer * o_statUpdateTimer;
}
- (void)initPanel;
- (void)stopTimers;
- (IBAction)metaFieldChanged:(id)sender;
- (IBAction)saveMetaData:(id)sender;
......@@ -111,7 +109,7 @@
- (void)updatePanelWithItem:(input_item_t *)_p_item;
- (input_item_t *)item;
- (void)setMeta: (char *)meta forLabel: (id)theItem;
- (void)updateStatistics: (NSTimer*)theTimer;
- (void)updateStatistics;
+ (VLCInfo *)sharedInstance;
@end
......
......@@ -57,7 +57,6 @@ static VLCInfo *_o_sharedInstance = nil;
if( _o_sharedInstance != nil )
{
p_item = NULL;
o_statUpdateTimer = nil;
[self updatePanelWithItem: NULL];
rootItem = [[VLCInfoTreeItem alloc] init];
}
......@@ -124,61 +123,16 @@ static VLCInfo *_o_sharedInstance = nil;
[self updatePanelWithItem:p_item];
}
- (void)stopTimers
{
/* make sure that the timer is released in any case */
if( o_statUpdateTimer && [o_statUpdateTimer isValid] )
[o_statUpdateTimer invalidate];
[rootItem release];
[o_statUpdateTimer release];
o_statUpdateTimer = nil;
}
- (void)dealloc
{
/* make sure that the timer is released in any case */
if( o_statUpdateTimer && [o_statUpdateTimer isValid] )
[o_statUpdateTimer invalidate];
[o_statUpdateTimer release];
[rootItem release];
if( p_item ) vlc_gc_decref( p_item );
[super dealloc];
}
- (void)windowDidBecomeKey:(NSNotification *)notification
{
BOOL b_stats = config_GetInt(VLCIntf, "stats");
if( b_stats )
{
if( o_statUpdateTimer )
{
[o_statUpdateTimer invalidate];
[o_statUpdateTimer release];
o_statUpdateTimer = nil;
}
o_statUpdateTimer = [NSTimer scheduledTimerWithTimeInterval: 1
target: self selector: @selector(updateStatistics:)
userInfo: nil repeats: YES];
[o_statUpdateTimer fire];
[o_statUpdateTimer retain];
}
}
- (BOOL)windowShouldClose:(id)sender
{
if( [o_statUpdateTimer isValid] )
[o_statUpdateTimer invalidate];
if( o_statUpdateTimer )
[o_statUpdateTimer release];
o_statUpdateTimer = nil;
return YES;
}
- (void)initPanel
{
BOOL b_stats = config_GetInt(VLCIntf, "stats");
......@@ -305,7 +259,7 @@ static VLCInfo *_o_sharedInstance = nil;
[o_outline_view reloadData];
/* update the stats once to display p_item change faster */
[self updateStatistics: nil];
[self updateStatistics];
}
- (void)setMeta: (char *)psz_meta forLabel: (id)theItem
......@@ -316,47 +270,50 @@ static VLCInfo *_o_sharedInstance = nil;
[theItem setStringValue: @""];
}
- (void)updateStatistics:(NSTimer*)theTimer
- (void)updateStatistics
{
if( !p_item || !p_item->p_stats )
if ([o_info_window isVisible])
{
[self initMediaPanelStats];
return;
}
if( !p_item || !p_item->p_stats )
{
[self initMediaPanelStats];
return;
}
vlc_mutex_lock( &p_item->p_stats->lock );
/* input */
[o_read_bytes_txt setStringValue: [NSString stringWithFormat:
@"%8.0f KiB", (float)(p_item->p_stats->i_read_bytes)/1024]];
[o_input_bitrate_txt setStringValue: [NSString stringWithFormat:
@"%6.0f kb/s", (float)(p_item->p_stats->f_input_bitrate)*8000]];
[o_demux_bytes_txt setStringValue: [NSString stringWithFormat:
@"%8.0f KiB", (float)(p_item->p_stats->i_demux_read_bytes)/1024]];
[o_demux_bitrate_txt setStringValue: [NSString stringWithFormat:
@"%6.0f kb/s", (float)(p_item->p_stats->f_demux_bitrate)*8000]];
/* Video */
[o_video_decoded_txt setIntValue: p_item->p_stats->i_decoded_video];
[o_displayed_txt setIntValue: p_item->p_stats->i_displayed_pictures];
[o_lost_frames_txt setIntValue: p_item->p_stats->i_lost_pictures];
float f_fps = 0;
/* FIXME: input_Control( p_item, INPUT_GET_VIDEO_FPS, &f_fps ); */
[o_fps_txt setFloatValue: f_fps];
/* Sout */
[o_sent_packets_txt setIntValue: p_item->p_stats->i_sent_packets];
[o_sent_bytes_txt setStringValue: [NSString stringWithFormat: @"%8.0f KiB",
(float)(p_item->p_stats->i_sent_bytes)/1024]];
[o_sent_bitrate_txt setStringValue: [NSString stringWithFormat:
@"%6.0f kb/s", (float)(p_item->p_stats->f_send_bitrate*8)*1000]];
/* Audio */
[o_audio_decoded_txt setIntValue: p_item->p_stats->i_decoded_audio];
[o_played_abuffers_txt setIntValue: p_item->p_stats->i_played_abuffers];
[o_lost_abuffers_txt setIntValue: p_item->p_stats->i_lost_abuffers];
vlc_mutex_unlock( &p_item->p_stats->lock );
vlc_mutex_lock( &p_item->p_stats->lock );
/* input */
[o_read_bytes_txt setStringValue: [NSString stringWithFormat:
@"%8.0f KiB", (float)(p_item->p_stats->i_read_bytes)/1024]];
[o_input_bitrate_txt setStringValue: [NSString stringWithFormat:
@"%6.0f kb/s", (float)(p_item->p_stats->f_input_bitrate)*8000]];
[o_demux_bytes_txt setStringValue: [NSString stringWithFormat:
@"%8.0f KiB", (float)(p_item->p_stats->i_demux_read_bytes)/1024]];
[o_demux_bitrate_txt setStringValue: [NSString stringWithFormat:
@"%6.0f kb/s", (float)(p_item->p_stats->f_demux_bitrate)*8000]];
/* Video */
[o_video_decoded_txt setIntValue: p_item->p_stats->i_decoded_video];
[o_displayed_txt setIntValue: p_item->p_stats->i_displayed_pictures];
[o_lost_frames_txt setIntValue: p_item->p_stats->i_lost_pictures];
float f_fps = 0;
/* FIXME: input_Control( p_item, INPUT_GET_VIDEO_FPS, &f_fps ); */
[o_fps_txt setFloatValue: f_fps];
/* Sout */
[o_sent_packets_txt setIntValue: p_item->p_stats->i_sent_packets];
[o_sent_bytes_txt setStringValue: [NSString stringWithFormat: @"%8.0f KiB",
(float)(p_item->p_stats->i_sent_bytes)/1024]];
[o_sent_bitrate_txt setStringValue: [NSString stringWithFormat:
@"%6.0f kb/s", (float)(p_item->p_stats->f_send_bitrate*8)*1000]];
/* Audio */
[o_audio_decoded_txt setIntValue: p_item->p_stats->i_decoded_audio];
[o_played_abuffers_txt setIntValue: p_item->p_stats->i_played_abuffers];
[o_lost_abuffers_txt setIntValue: p_item->p_stats->i_lost_abuffers];
vlc_mutex_unlock( &p_item->p_stats->lock );
}
}
- (IBAction)metaFieldChanged:(id)sender
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment