- if (p_playlist)
- {
- /*fill uri / title / author info */
- int i_item = [o_vlc_playlist selectedPlaylistItem];
- [o_uri_txt setStringValue:
- ([NSString stringWithUTF8String:p_playlist->
- pp_items[i_item]->input.psz_uri] == nil ) ?
- [NSString stringWithCString:p_playlist->
- pp_items[i_item]->input.psz_uri] :
- [NSString stringWithUTF8String:p_playlist->
- pp_items[i_item]->input.psz_uri]];
-
- [o_title_txt setStringValue:
- ([NSString stringWithUTF8String:p_playlist->
- pp_items[i_item]->input.psz_name] == nil ) ?
- [NSString stringWithCString:p_playlist->
- pp_items[i_item]->input.psz_name] :
- [NSString stringWithUTF8String:p_playlist->
- pp_items[i_item]->input.psz_name]];
-
- [o_author_txt setStringValue:[NSString stringWithUTF8String: playlist_GetInfo(p_playlist, i_item ,_("General"),_("Author") )]];
-
- [[VLCInfoTreeItem rootItem] refresh];
- [o_outline_view reloadData];
- vlc_object_release( p_playlist );
- }
- [o_info_window makeKeyAndOrderFront: sender];
+ 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];
+}
+
+- (void)updatePanel
+{
+ /* make sure that we got the current item and not an outdated one */
+ intf_thread_t * p_intf = VLCIntf;
+ playlist_t * p_playlist = pl_Yield( p_intf );
+
+ 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;
+
+ /* fill uri info */
+ char *psz_uri = input_item_GetURI( p_item->p_input );
+ if( psz_uri )
+ {
+ [o_uri_txt setStringValue:
+ ([NSString stringWithUTF8String:psz_uri] == nil ) ?
+ [NSString stringWithCString:psz_uri] :
+ [NSString stringWithUTF8String:psz_uri]];
+ }
+ free( psz_uri );
+
+#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 */
+ 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];
+
+ /* update the stats once to display p_item change faster */
+ [self updateStatistics: nil];
+}
+
+- (void)setMeta: (char *)psz_meta forLabel: (id)theItem
+{
+ if( psz_meta != NULL && *psz_meta)
+ [theItem setStringValue:
+ ([NSString stringWithUTF8String:psz_meta] == nil ) ?
+ [NSString stringWithCString:psz_meta] :
+ [NSString stringWithUTF8String:psz_meta]];
+ else
+ [theItem setStringValue: @"-"];
+}
+
+- (void)updateStatistics:(NSTimer*)theTimer
+{
+ if( [self isItemInPlaylist: p_item] )
+ {
+ /* we can only do that if there's a valid input around */
+
+ vlc_mutex_lock( &p_item->p_input->p_stats->lock );
+
+ /* input */
+ [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->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->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->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 );