+
+ /* reload the advanced table */
+ [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]];
+ else
+ [theItem setStringValue: @""];
+}
+
+- (void)updateStatistics:(NSTimer*)theTimer
+{
+ 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 kB", (float)(p_item->p_stats->i_read_bytes)/1000]];
+ [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 kB", (float)(p_item->p_stats->i_demux_read_bytes)/1000]];
+ [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 kB",
+ (float)(p_item->p_stats->i_sent_bytes)/1000]];
+ [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
+{
+ [o_saveMetaData_btn setEnabled: YES];
+}
+
+- (IBAction)saveMetaData:(id)sender
+{
+ if( !p_item ) goto error;
+
+ #define utf8( o_blub ) \
+ [[o_blub stringValue] UTF8String]
+
+ input_item_SetName( p_item, utf8( o_title_txt ) );
+ input_item_SetTitle( p_item, utf8( o_title_txt ) );
+ input_item_SetArtist( p_item, utf8( o_author_txt ) );
+ input_item_SetAlbum( p_item, utf8( o_collection_txt ) );
+ input_item_SetGenre( p_item, utf8( o_genre_txt ) );
+ input_item_SetTrackNum( p_item, utf8( o_seqNum_txt ) );
+ input_item_SetDate( p_item, utf8( o_date_txt ) );
+ input_item_SetCopyright( p_item, utf8( o_copyright_txt ) );
+ input_item_SetPublisher( p_item, utf8( o_publisher_txt ) );
+ input_item_SetDescription( p_item, utf8( o_description_txt ) );
+ input_item_SetLanguage( p_item, utf8( o_language_txt ) );
+
+ playlist_t * p_playlist = pl_Hold( VLCIntf );
+ input_item_WriteMeta( VLC_OBJECT(p_playlist), p_item );
+
+ var_SetBool( p_playlist, "intf-change", true );
+ [self updatePanelWithItem: p_item];
+
+ pl_Release( VLCIntf );
+ [o_saveMetaData_btn setEnabled: NO];
+ return;
+
+error:
+ NSRunAlertPanel(_NS("Error while saving meta"),
+ _NS("VLC was unable to save the meta data."),
+ _NS("OK"), nil, nil);
+}
+
+- (IBAction)downloadCoverArt:(id)sender
+{
+ playlist_t * p_playlist = pl_Hold( VLCIntf );
+ if( p_item) playlist_AskForArtEnqueue( p_playlist, p_item );
+ pl_Release( VLCIntf );
+}
+
+- (input_item_t *)item
+{
+ if( p_item ) vlc_gc_incref( p_item );
+ return p_item;
+}
+
+@end
+
+@implementation VLCInfo (NSMenuValidation)
+
+- (BOOL)validateMenuItem:(NSMenuItem *)o_mi
+{
+ BOOL bEnabled = TRUE;
+
+ if( [[o_mi title] isEqualToString: _NS("Information")] )
+ {
+ return ![[[VLCMain sharedInstance] playlist] isSelectionEmpty];
+ }
+
+ return TRUE;