X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fplaylistinfo.m;h=30ab5796f18eb576ae642a37aaa21405333c645f;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=34511e5856368433276cefb090eb8d545755cc66;hpb=c934307dcad522891981c338c12a0778a2ef419a;p=vlc diff --git a/modules/gui/macosx/playlistinfo.m b/modules/gui/macosx/playlistinfo.m index 34511e5856..30ab5796f1 100644 --- a/modules/gui/macosx/playlistinfo.m +++ b/modules/gui/macosx/playlistinfo.m @@ -1,7 +1,7 @@ /***************************************************************************** r playlistinfo.m: MacOS X interface module ***************************************************************************** - * Copyright (C) 2002-2006 the VideoLAN team + * Copyright (C) 2002-2007 the VideoLAN team * $Id$ * * Authors: Benjamin Pracht @@ -58,7 +58,7 @@ [o_author_lbl setStringValue: _NS("Author")]; [o_btn_ok setTitle: _NS("OK")]; [o_btn_cancel setTitle: _NS("Cancel")]; - + [[o_tab_view tabViewItemAtIndex: 0] setLabel: _NS("General")]; [[o_tab_view tabViewItemAtIndex: 1] setLabel: _NS("Advanced Information")]; [[o_tab_view tabViewItemAtIndex: 2] setLabel: _NS("Statistics")]; @@ -75,24 +75,24 @@ [o_language_lbl setStringValue: _NS(VLC_META_LANGUAGE)]; [o_nowPlaying_lbl setStringValue: _NS(VLC_META_NOW_PLAYING)]; [o_publisher_lbl setStringValue: _NS(VLC_META_PUBLISHER)]; - + /* statistics */ [o_input_box setTitle: _NS("Input")]; [o_read_bytes_lbl setStringValue: _NS("Read at media")]; [o_input_bitrate_lbl setStringValue: _NS("Input bitrate")]; [o_demux_bytes_lbl setStringValue: _NS("Demuxed")]; [o_demux_bitrate_lbl setStringValue: _NS("Stream bitrate")]; - + [o_video_box setTitle: _NS("Video")]; [o_video_decoded_lbl setStringValue: _NS("Decoded blocks")]; [o_displayed_lbl setStringValue: _NS("Displayed frames")]; [o_lost_frames_lbl setStringValue: _NS("Lost frames")]; - + [o_sout_box setTitle: _NS("Streaming")]; [o_sent_packets_lbl setStringValue: _NS("Sent packets")]; [o_sent_bytes_lbl setStringValue: _NS("Sent bytes")]; [o_sent_bitrate_lbl setStringValue: _NS("Send rate")]; - + [o_audio_box setTitle: _NS("Audio")]; [o_audio_decoded_lbl setStringValue: _NS("Decoded blocks")]; [o_played_abuffers_lbl setStringValue: _NS("Played buffers")]; @@ -101,12 +101,26 @@ - (void)dealloc { - /* make sure that it is released in any case */ + /* make sure that the timer is released in any case */ + if( [o_statUpdateTimer isValid] ) + [o_statUpdateTimer invalidate]; + if ( o_statUpdateTimer ) [o_statUpdateTimer release]; + [super dealloc]; } +#if GC_ENABLED +- (void)finalize +{ + /* since dealloc isn't called with enabled GC on 10.5, we need this to prevent core crashes */ + if( [o_statUpdateTimer isValid] ) + [o_statUpdateTimer invalidate]; + [super finalize]; +} +#endif + - (IBAction)togglePlaylistInfoPanel:(id)sender { if( [o_info_window isVisible] ) @@ -131,36 +145,32 @@ else { intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - - if( p_playlist ) - { - p_item = p_playlist->status.p_item; - vlc_object_release( p_playlist ); - } - - BOOL b_stats = config_GetInt(VLCIntf, "stats"); - if( b_stats ) - { - o_statUpdateTimer = [NSTimer scheduledTimerWithTimeInterval: 1 \ - target: self selector: @selector(updateStatistics:) \ - userInfo: nil repeats: YES]; - [o_statUpdateTimer fire]; - [o_statUpdateTimer retain]; - } - else - { - if( [o_tab_view numberOfTabViewItems] > 2 ) - [o_tab_view removeTabViewItem: [o_tab_view tabViewItemAtIndex: 2]]; - } + playlist_t * p_playlist = pl_Yield( p_intf ); + p_item = p_playlist->status.p_item; + vlc_object_release( p_playlist ); + [self initPanel:sender]; } } - (void)initPanel:(id)sender { + BOOL b_stats = config_GetInt(VLCIntf, "stats"); + if( b_stats ) + { + o_statUpdateTimer = [NSTimer scheduledTimerWithTimeInterval: 1 + target: self selector: @selector(updateStatistics:) + userInfo: nil repeats: YES]; + [o_statUpdateTimer fire]; + [o_statUpdateTimer retain]; + } + else + { + if( [o_tab_view numberOfTabViewItems] > 2 ) + [o_tab_view removeTabViewItem: [o_tab_view tabViewItemAtIndex: 2]]; + } + [self updatePanel]; [o_info_window makeKeyAndOrderFront: sender]; } @@ -169,72 +179,60 @@ { /* make sure that we got the current item and not an outdated one */ intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); + playlist_t * p_playlist = pl_Yield( p_intf ); - if( p_playlist ) - { - p_item = p_playlist->status.p_item; - vlc_object_release( p_playlist ); - } + p_item = p_playlist->status.p_item; + vlc_object_release( p_playlist ); /* check whether our item is valid, because we would crash if not */ if(! [self isItemInPlaylist: p_item] ) return; - char *psz_temp; - vlc_mutex_lock( &p_item->input.lock ); - - /* fill uri / title / author info */ - if( p_item->input.psz_uri ) + /* fill uri info */ + char *psz_uri = input_item_GetURI( p_item->p_input ); + if( psz_uri ) { [o_uri_txt setStringValue: - ([NSString stringWithUTF8String:p_item->input.psz_uri] == nil ) ? - [NSString stringWithCString:p_item->input.psz_uri] : - [NSString stringWithUTF8String:p_item->input.psz_uri]]; - } - - if( p_item->input.psz_name ) - { - [o_title_txt setStringValue: - ([NSString stringWithUTF8String:p_item->input.psz_name] == nil ) ? - [NSString stringWithCString:p_item->input.psz_name] : - [NSString stringWithUTF8String:p_item->input.psz_name]]; + ([NSString stringWithUTF8String:psz_uri] == nil ) ? + [NSString stringWithCString:psz_uri] : + [NSString stringWithUTF8String:psz_uri]]; } - vlc_mutex_unlock( &p_item->input.lock ); + free( psz_uri ); - psz_temp = vlc_input_item_GetInfo( &p_item->input, _("Meta-information"), _("Artist") ); - - if( psz_temp ) - { - [o_author_txt setStringValue: [NSString stringWithUTF8String: psz_temp]]; - free( psz_temp ); - } +#define SET( foo, bar ) \ + char *psz_##foo = input_item_Get##bar ( p_item->p_input ); \ + [self setMeta: psz_##foo forlabel: o_##foo##_txt]; \ + free( psz_##foo ); /* fill the other fields */ - [self setMeta: VLC_META_GENRE forLabel: o_genre_txt]; - [self setMeta: VLC_META_COPYRIGHT forLabel: o_copyright_txt]; - [self setMeta: VLC_META_COLLECTION forLabel: o_collection_txt]; - [self setMeta: VLC_META_SEQ_NUM forLabel: o_seqNum_txt]; - [self setMeta: VLC_META_DESCRIPTION forLabel: o_description_txt]; - [self setMeta: VLC_META_RATING forLabel: o_rating_txt]; - [self setMeta: VLC_META_DATE forLabel: o_date_txt]; - [self setMeta: VLC_META_LANGUAGE forLabel: o_language_txt]; - [self setMeta: VLC_META_NOW_PLAYING forLabel: o_nowPlaying_txt]; - [self setMeta: VLC_META_PUBLISHER forLabel: o_publisher_txt]; + SET( title, Title ); + SET( author, Artist ); + SET( collection, Album ); + SET( seqNum, TrackNum ); + SET( genre, Genre ); + SET( copyright, Copyright ); + SET( rating, Rating ); + SET( publisher, Publisher ); + SET( nowPlaying, NowPlaying ); + SET( language, Language ); + SET( date, Date ); + +#undef SET /* reload the advanced table */ [[VLCInfoTreeItem rootItem] refresh]; [o_outline_view reloadData]; - /* updating the stats isn't our job, but is done by the timer if needed */ + /* update the stats once to display p_item change faster */ + [self updateStatistics: nil]; } -- (void)setMeta: (char *)meta forLabel: (id)theItem +- (void)setMeta: (char *)psz_meta forLabel: (id)theItem { - char *psz_meta = vlc_input_item_GetInfo( &p_item->input, \ - _(VLC_META_INFO_CAT), _(meta) ); if( psz_meta != NULL && *psz_meta) - [theItem setStringValue: [NSString stringWithUTF8String: psz_meta]]; + [theItem setStringValue: + ([NSString stringWithUTF8String:psz_meta] == nil ) ? + [NSString stringWithCString:psz_meta] : + [NSString stringWithUTF8String:psz_meta]]; else [theItem setStringValue: @"-"]; } @@ -245,43 +243,43 @@ { /* we can only do that if there's a valid input around */ - vlc_mutex_lock( &p_item->input.p_stats->lock ); + vlc_mutex_lock( &p_item->p_input->p_stats->lock ); /* input */ - [o_read_bytes_txt setStringValue: [NSString stringWithFormat: \ - @"%8.0f kB", (float)(p_item->input.p_stats->i_read_bytes)/1000]]; - [o_input_bitrate_txt setStringValue: [NSString stringWithFormat: \ - @"%6.0f kb/s", (float)(p_item->input.p_stats->f_input_bitrate)*8000]]; - [o_demux_bytes_txt setStringValue: [NSString stringWithFormat: \ - @"%8.0f kB", (float)(p_item->input.p_stats->i_demux_read_bytes)/1000]]; - [o_demux_bitrate_txt setStringValue: [NSString stringWithFormat: \ - @"%6.0f kb/s", (float)(p_item->input.p_stats->f_demux_bitrate)*8000]]; + [o_read_bytes_txt setStringValue: [NSString stringWithFormat: + @"%8.0f kB", (float)(p_item->p_input->p_stats->i_read_bytes)/1000]]; + [o_input_bitrate_txt setStringValue: [NSString stringWithFormat: + @"%6.0f kb/s", (float)(p_item->p_input->p_stats->f_input_bitrate)*8000]]; + [o_demux_bytes_txt setStringValue: [NSString stringWithFormat: + @"%8.0f kB", (float)(p_item->p_input->p_stats->i_demux_read_bytes)/1000]]; + [o_demux_bitrate_txt setStringValue: [NSString stringWithFormat: + @"%6.0f kb/s", (float)(p_item->p_input->p_stats->f_demux_bitrate)*8000]]; /* Video */ - [o_video_decoded_txt setStringValue: [NSString stringWithFormat: @"%5i", \ - p_item->input.p_stats->i_decoded_video]]; - [o_displayed_txt setStringValue: [NSString stringWithFormat: @"%5i", \ - p_item->input.p_stats->i_displayed_pictures]]; - [o_lost_frames_txt setStringValue: [NSString stringWithFormat: @"%5i", \ - p_item->input.p_stats->i_lost_pictures]]; + [o_video_decoded_txt setStringValue: [NSString stringWithFormat: @"%5i", + p_item->p_input->p_stats->i_decoded_video]]; + [o_displayed_txt setStringValue: [NSString stringWithFormat: @"%5i", + p_item->p_input->p_stats->i_displayed_pictures]]; + [o_lost_frames_txt setStringValue: [NSString stringWithFormat: @"%5i", + p_item->p_input->p_stats->i_lost_pictures]]; /* Sout */ - [o_sent_packets_txt setStringValue: [NSString stringWithFormat: @"%5i", \ - p_item->input.p_stats->i_sent_packets]]; - [o_sent_bytes_txt setStringValue: [NSString stringWithFormat: @"%8.0f kB", \ - (float)(p_item->input.p_stats->i_sent_bytes)/1000]]; - [o_sent_bitrate_txt setStringValue: [NSString stringWithFormat: \ - @"%6.0f kb/s", (float)(p_item->input.p_stats->f_send_bitrate*8)*1000]]; + [o_sent_packets_txt setStringValue: [NSString stringWithFormat: @"%5i", + p_item->p_input->p_stats->i_sent_packets]]; + [o_sent_bytes_txt setStringValue: [NSString stringWithFormat: @"%8.0f kB", + (float)(p_item->p_input->p_stats->i_sent_bytes)/1000]]; + [o_sent_bitrate_txt setStringValue: [NSString stringWithFormat: + @"%6.0f kb/s", (float)(p_item->p_input->p_stats->f_send_bitrate*8)*1000]]; /* Audio */ - [o_audio_decoded_txt setStringValue: [NSString stringWithFormat: @"%5i", \ - p_item->input.p_stats->i_decoded_audio]]; - [o_played_abuffers_txt setStringValue: [NSString stringWithFormat: @"%5i", \ - p_item->input.p_stats->i_played_abuffers]]; - [o_lost_abuffers_txt setStringValue: [NSString stringWithFormat: @"%5i", \ - p_item->input.p_stats->i_lost_abuffers]]; - - vlc_mutex_unlock( &p_item->input.p_stats->lock ); + [o_audio_decoded_txt setStringValue: [NSString stringWithFormat: @"%5i", + p_item->p_input->p_stats->i_decoded_audio]]; + [o_played_abuffers_txt setStringValue: [NSString stringWithFormat: @"%5i", + p_item->p_input->p_stats->i_played_abuffers]]; + [o_lost_abuffers_txt setStringValue: [NSString stringWithFormat: @"%5i", + p_item->p_input->p_stats->i_lost_abuffers]]; + + vlc_mutex_unlock( &p_item->p_input->p_stats->lock ); } } @@ -295,19 +293,18 @@ - (IBAction)infoOk:(id)sender { intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); + playlist_t * p_playlist = pl_Yield( p_intf ); vlc_value_t val; if( [self isItemInPlaylist: p_item] ) { - vlc_mutex_lock( &p_item->input.lock ); + input_item_SetName( p_item->p_input, (char*) + [[o_title_txt stringValue] UTF8String] ); + input_item_SetURI( p_item->p_input, (char*) + [[o_uri_txt stringValue] UTF8String] ); + input_item_SetArtist( p_item->p_input, (char*) + [[o_author_txt stringValue] UTF8String] ); - p_item->input.psz_uri = strdup( [[o_uri_txt stringValue] UTF8String] ); - p_item->input.psz_name = strdup( [[o_title_txt stringValue] UTF8String] ); - vlc_mutex_unlock( &p_item->input.lock ); - vlc_input_item_AddInfo( &p_item->input, _("Meta-information"), _("Artist"), [[o_author_txt stringValue] UTF8String]); - val.b_bool = VLC_TRUE; var_Set( p_playlist, "intf-change", val ); } @@ -324,18 +321,12 @@ - (BOOL)isItemInPlaylist:(playlist_item_t *)p_local_item { intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); + playlist_t * p_playlist = pl_Yield( p_intf ); int i; - if( p_playlist == NULL ) - { - return NO; - } - - for( i = 0 ; i < p_playlist->i_all_size ; i++ ) + for( i = 0 ; i < p_playlist->all_items.i_size ; i++ ) { - if( p_playlist->pp_all_items[i] == p_local_item ) + if( ARRAY_VAL( p_playlist->all_items, i ) == p_local_item ) { vlc_object_release( p_playlist ); return YES; @@ -347,11 +338,12 @@ - (BOOL)windowShouldClose:(id)sender { - if( o_statUpdateTimer ) - { + if( [o_statUpdateTimer isValid] ) [o_statUpdateTimer invalidate]; + + if( o_statUpdateTimer ) [o_statUpdateTimer release]; - } + return YES; } @@ -394,7 +386,7 @@ - (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item { - return (item == nil) ? [[VLCInfoTreeItem rootItem] childAtIndex:index] : [item childAtIndex:index]; + return (item == nil) ? [[VLCInfoTreeItem rootItem] childAtIndex:index] : (id)[item childAtIndex:index]; } - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item @@ -437,7 +429,8 @@ static VLCInfoTreeItem *o_root_item = nil; } + (VLCInfoTreeItem *)rootItem { - if (o_root_item == nil) o_root_item = [[VLCInfoTreeItem alloc] initWithName:@"main" value: @"" ID: 0 parent:nil]; + if( o_root_item == nil ) + o_root_item = [[VLCInfoTreeItem alloc] initWithName:@"main" value: @"" ID: 0 parent:nil]; return o_root_item; } @@ -460,37 +453,37 @@ static VLCInfoTreeItem *o_root_item = nil; { if( self == o_root_item ) { - vlc_mutex_lock( &p_item->input.lock ); + vlc_mutex_lock( &p_item->p_input->lock ); o_children = [[NSMutableArray alloc] initWithCapacity: - p_item->input.i_categories]; - for (i = 0 ; i < p_item->input.i_categories ; i++) + p_item->p_input->i_categories]; + for (i = 0 ; i < p_item->p_input->i_categories ; i++) { [o_children addObject:[[VLCInfoTreeItem alloc] initWithName: [NSString stringWithUTF8String: - p_item->input.pp_categories[i]->psz_name] + p_item->p_input->pp_categories[i]->psz_name] value: @"" ID: i parent: self]]; } - vlc_mutex_unlock( &p_item->input.lock ); + vlc_mutex_unlock( &p_item->p_input->lock ); } else if( o_parent == o_root_item ) { - vlc_mutex_lock( &p_item->input.lock ); + vlc_mutex_lock( &p_item->p_input->lock ); o_children = [[NSMutableArray alloc] initWithCapacity: - p_item->input.pp_categories[i_object_id]->i_infos]; + p_item->p_input->pp_categories[i_object_id]->i_infos]; - for (i = 0 ; i < p_item->input.pp_categories[i_object_id]->i_infos ; i++) + for (i = 0 ; i < p_item->p_input->pp_categories[i_object_id]->i_infos ; i++) { [o_children addObject:[[VLCInfoTreeItem alloc] initWithName: [NSString stringWithUTF8String: - p_item->input.pp_categories[i_object_id]->pp_infos[i]->psz_name] + p_item->p_input->pp_categories[i_object_id]->pp_infos[i]->psz_name] value: [NSString stringWithUTF8String: - p_item->input.pp_categories[i_object_id]->pp_infos[i]->psz_value] + p_item->p_input->pp_categories[i_object_id]->pp_infos[i]->psz_value] ID: i parent: self]]; } - vlc_mutex_unlock( &p_item->input.lock ); + vlc_mutex_unlock( &p_item->p_input->lock ); } else {