📄 playlistinfo.m
字号:
[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{ playlist_t * p_playlist = pl_Yield( VLCIntf ); vlc_value_t val; if( !p_item ) goto error; meta_export_t p_export; p_export.p_item = p_item; /* we can write meta data only in a file */ vlc_mutex_lock( &p_item->lock ); int i_type = p_item->i_type; vlc_mutex_unlock( &p_item->lock ); if( i_type != ITEM_TYPE_FILE ) goto error; char *psz_uri_orig = input_item_GetURI( p_item ); char *psz_uri = psz_uri_orig; if( !strncmp( psz_uri, "file://", 7 ) ) psz_uri += 7; /* strlen("file://") = 7 */ p_export.psz_file = strndup( psz_uri, PATH_MAX ); free( psz_uri_orig ); #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 ) ); PL_LOCK; p_playlist->p_private = &p_export; module_t *p_mod = module_Need( p_playlist, "meta writer", NULL, 0 ); if( p_mod ) module_Unneed( p_playlist, p_mod ); PL_UNLOCK; val.b_bool = true; var_Set( p_playlist, "intf-change", val ); [self updatePanelWithItem: p_item]; pl_Release( VLCIntf ); [o_saveMetaData_btn setEnabled: NO]; return;error: pl_Release( VLCIntf ); NSRunAlertPanel(_NS("Error while saving meta"), _NS("VLC was unable to save the meta data."), _NS("OK"), nil, nil);}- (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] getPlaylist] isSelectionEmpty]; } return TRUE;}@end@implementation VLCInfo (NSTableDataSource)- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item{ return (item == nil) ? [rootItem numberOfChildren] : [item numberOfChildren];}- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { return ([item numberOfChildren] > 0);}- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item{ return (item == nil) ? [rootItem childAtIndex:index] : (id)[item childAtIndex:index];}- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item{ if ([[tableColumn identifier] isEqualToString:@"0"]) { return (item == nil) ? @"" : (id)[item name]; } else { return (item == nil) ? @"" : (id)[item value]; }}@end@implementation VLCInfoTreeItem#define IsALeafNode ((id)-1)- (id)initWithName: (NSString *)o_item_name value: (NSString *)o_item_value ID: (int)i_id parent:(VLCInfoTreeItem *)o_parent_item{ self = [super init]; if( self != nil ) { o_name = [o_item_name copy]; o_value = [o_item_value copy]; i_object_id = i_id; o_parent = o_parent_item; p_item = [[[VLCMain sharedInstance] getInfo] item]; o_children = nil; } return( self );}- (id)init{ return [self initWithName:@"main" value:@"" ID:-1 parent:nil];}- (void)dealloc{ if( o_children != IsALeafNode ) [o_children release]; [o_name release]; [o_value release]; if( p_item ) vlc_gc_decref( p_item ); [super dealloc];}/* Creates and returns the array of children * Loads children incrementally */- (NSArray *)children{ if( !p_item ) return nil; if (o_children == NULL) { int i; if( i_object_id == -1 ) { vlc_mutex_lock( &p_item->lock ); o_children = [[NSMutableArray alloc] initWithCapacity: p_item->i_categories]; for (i = 0 ; i < p_item->i_categories ; i++) { NSString * name = [NSString stringWithUTF8String: p_item->pp_categories[i]->psz_name]; VLCInfoTreeItem * item = [[VLCInfoTreeItem alloc] initWithName:name value:@"" ID:i parent:self]; [item autorelease]; [o_children addObject:item]; } vlc_mutex_unlock( &p_item->lock ); } else if( o_parent->i_object_id == -1 ) { vlc_mutex_lock( &p_item->lock ); info_category_t * cat = p_item->pp_categories[i_object_id]; o_children = [[NSMutableArray alloc] initWithCapacity: cat->i_infos]; for (i = 0 ; i < cat->i_infos ; i++) { NSString * name = [NSString stringWithUTF8String: cat->pp_infos[i]->psz_name]; NSString * value = [NSString stringWithUTF8String: cat->pp_infos[i]->psz_value ? : ""]; VLCInfoTreeItem * item = [[VLCInfoTreeItem alloc] initWithName:name value:value ID:i parent:self]; [item autorelease]; [o_children addObject:item]; } vlc_mutex_unlock( &p_item->lock ); } else { o_children = IsALeafNode; } } return o_children;}- (NSString *)name{ return [[o_name retain] autorelease];}- (NSString *)value{ return [[o_value retain] autorelease];}- (void)refresh{ if( p_item ) vlc_gc_decref( p_item ); p_item = [[[VLCMain sharedInstance] getInfo] item]; if( o_children != NULL ) { [o_children release]; o_children = NULL; }}- (VLCInfoTreeItem *)childAtIndex:(int)i_index { return [[self children] objectAtIndex:i_index];}- (int)numberOfChildren { id i_tmp = [self children]; return ( i_tmp == IsALeafNode ) ? (-1) : (int)[i_tmp count];}@end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -