vlc | branch: master | Felix Paul Kühne <[email protected]> | Tue Apr 9 22:25:36 2019 +0200| [53abf4bbba34c90487b30591a3a05acd117ea078] | committer: Felix Paul Kühne
macosx/player controller: add program support > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=53abf4bbba34c90487b30591a3a05acd117ea078 --- modules/gui/macosx/playlist/VLCPlayerController.h | 53 +++++++++++ modules/gui/macosx/playlist/VLCPlayerController.m | 106 +++++++++++++++++++++- 2 files changed, 157 insertions(+), 2 deletions(-) diff --git a/modules/gui/macosx/playlist/VLCPlayerController.h b/modules/gui/macosx/playlist/VLCPlayerController.h index e021779d0c..3509c25d79 100644 --- a/modules/gui/macosx/playlist/VLCPlayerController.h +++ b/modules/gui/macosx/playlist/VLCPlayerController.h @@ -27,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN @class VLCInputStats; @class VLCTrackMetaData; +@class VLCProgramMetaData; /** * Listen to VLCPlayerCurrentMediaItemChanged to notified if the current media item changes for the player @@ -98,6 +99,18 @@ extern NSString *VLCPlayerTitleListChanged; extern NSString *VLCPlayerChapterSelectionChanged; /** + * Listen to VLCPlayerProgramSelectionChanged to be notified if the selected program of the current media changes + * @note the affected player object will be the object of the notification + */ +extern NSString *VLCPlayerProgramSelectionChanged; + +/** + * Listen to VLCPlayerProgramListChanged to be notified if the list of available programs of the current media changes + * @note the affected player object will be the object of the notification + */ +extern NSString *VLCPlayerProgramListChanged; + +/** * Listen to VLCPlayerABLoopStateChanged to be notified if the A→B loop state changes * @note the affected player object will be the object of the notification */ @@ -530,6 +543,35 @@ extern NSString *VLCPlayerMuteChanged; - (nullable const struct vlc_player_chapter *)chapterAtIndexForCurrentTitle:(size_t)index; /** + * returns the selected program ID, typically in the range 0 to 32,000 + * @warning the counter does not necessarily start at 0 nor are programs numbered consecutively + * @note listen to VLCPlayerProgramSelectionChanged to be notified about changes to this property + */ +@property (readonly) int selectedProgramID; + +/** + * select the program defined by the provided VLCProgramMetaData instance + * @note listen to VLCPlayerProgramSelectionChanged to be notified once the change takes effect + */ +- (void)selectProgram:(VLCProgramMetaData *)program; + +/** + * returns the number of programs available for the current media + * @note listen to VLCPlayerProgramListChanged to be notified about changes to this property + */ +@property (readonly) size_t numberOfPrograms; + +/** + * returns an instance of VLCProgramMetaData with details about the program at the specified index + */ +- (nullable VLCProgramMetaData *)programAtIndex:(size_t)index; + +/** + * returns an instance of VLCProgramMetaData with details about the program with the specified ID + */ +- (nullable VLCProgramMetaData *)programForID:(int)programID; + +/** * exposes whether a teletext menu is available or not * @note listen to VLCPlayerTeletextMenuAvailable to be notified about changes to this property */ @@ -831,4 +873,15 @@ extern NSString *VLCPlayerMuteChanged; @end +@interface VLCProgramMetaData : NSObject + +- (instancetype)initWithProgramStructure:(const struct vlc_player_program *)structure; + +@property (readonly) int group_id; +@property (readonly) NSString *name; +@property (readonly) BOOL selected; +@property (readonly) BOOL scrambled; + +@end + NS_ASSUME_NONNULL_END diff --git a/modules/gui/macosx/playlist/VLCPlayerController.m b/modules/gui/macosx/playlist/VLCPlayerController.m index e36494217c..614c0303e7 100644 --- a/modules/gui/macosx/playlist/VLCPlayerController.m +++ b/modules/gui/macosx/playlist/VLCPlayerController.m @@ -44,6 +44,8 @@ NSString *VLCPlayerLengthChanged = @"VLCPlayerLengthChanged"; NSString *VLCPlayerTitleSelectionChanged = @"VLCPlayerTitleSelectionChanged"; NSString *VLCPlayerTitleListChanged = @"VLCPlayerTitleListChanged"; NSString *VLCPlayerChapterSelectionChanged = @"VLCPlayerChapterSelectionChanged"; +NSString *VLCPlayerProgramSelectionChanged = @"VLCPlayerProgramSelectionChanged"; +NSString *VLCPlayerProgramListChanged = @"VLCPlayerProgramListChanged"; NSString *VLCPlayerABLoopStateChanged = @"VLCPlayerABLoopStateChanged"; NSString *VLCPlayerTeletextMenuAvailable = @"VLCPlayerTeletextMenuAvailable"; NSString *VLCPlayerTeletextEnabled = @"VLCPlayerTeletextEnabled"; @@ -107,6 +109,8 @@ NSString *VLCPlayerMuteChanged = @"VLCPlayerMuteChanged"; - (void)inputStatsUpdated:(VLCInputStats *)inputStats; - (void)trackSelectionChanged; - (void)trackListChanged; +- (void)programListChanged; +- (void)programSelectionChanged:(int)selectedID; - (void)ABLoopStateChanged:(enum vlc_player_abloop)abLoopState; - (void)stopActionChanged:(enum vlc_player_media_stopped_action)stoppedAction; - (void)metaDataChangedForInput:(input_item_t *)inputItem; @@ -376,6 +380,30 @@ static void cb_player_track_selection_changed(vlc_player_t *p_player, }); } +static void cb_player_program_list_changed(vlc_player_t *p_player, + enum vlc_player_list_action action, + const struct vlc_player_program *prgm, + void *p_data) +{ + VLC_UNUSED(p_player); VLC_UNUSED(action); VLC_UNUSED(prgm); + dispatch_async(dispatch_get_main_queue(), ^{ + VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data; + [playerController programListChanged]; + }); +} + +static void cb_player_program_selection_changed(vlc_player_t *p_player, + int unselected_id, + int selected_id, + void *p_data) +{ + VLC_UNUSED(p_player); VLC_UNUSED(unselected_id); + dispatch_async(dispatch_get_main_queue(), ^{ + VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data; + [playerController programSelectionChanged:selected_id]; + }); +} + static void cb_player_atobloop_changed(vlc_player_t *p_player, enum vlc_player_abloop new_state, vlc_tick_t time, float pos, @@ -435,8 +463,8 @@ static const struct vlc_player_cbs player_callbacks = { cb_player_length_changed, cb_player_track_list_changed, cb_player_track_selection_changed, - NULL, //cb_player_program_list_changed, - NULL, //cb_player_program_selection_changed, + cb_player_program_list_changed, + cb_player_program_selection_changed, cb_player_titles_changed, cb_player_title_selection_changed, cb_player_chapter_selection_changed, @@ -1408,6 +1436,59 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = { return [self tracksForCategory:SPU_ES]; } +- (void)programListChanged +{ + [_defaultNotificationCenter postNotificationName:VLCPlayerProgramListChanged + object:self]; +} + +- (void)programSelectionChanged:(int)selectedID +{ + _selectedProgramID = selectedID; + [_defaultNotificationCenter postNotificationName:VLCPlayerProgramSelectionChanged + object:self]; +} + +- (void)selectProgram:(VLCProgramMetaData *)program +{ + vlc_player_Lock(_p_player); + vlc_player_SelectProgram(_p_player, program.group_id); + vlc_player_Unlock(_p_player); +} + +- (size_t)numberOfPrograms +{ + size_t ret = 0; + vlc_player_Lock(_p_player); + ret = vlc_player_GetProgramCount(_p_player); + vlc_player_Unlock(_p_player); + return ret; +} + +- (nullable VLCProgramMetaData *)programAtIndex:(size_t)index +{ + VLCProgramMetaData *programMetaData = nil; + vlc_player_Lock(_p_player); + const struct vlc_player_program *program = vlc_player_GetProgramAt(_p_player, index); + if (program != NULL) { + programMetaData = [[VLCProgramMetaData alloc] initWithProgramStructure:program]; + } + vlc_player_Unlock(_p_player); + return programMetaData; +} + +- (nullable VLCProgramMetaData *)programForID:(int)programID +{ + VLCProgramMetaData *programMetaData = nil; + vlc_player_Lock(_p_player); + const struct vlc_player_program *program = vlc_player_GetProgram(_p_player, programID); + if (program != NULL) { + programMetaData = [[VLCProgramMetaData alloc] initWithProgramStructure:program]; + } + vlc_player_Unlock(_p_player); + return programMetaData; +} + - (void)ABLoopStateChanged:(enum vlc_player_abloop)abLoopState { _abLoopState = abLoopState; @@ -1629,3 +1710,24 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = { } @end + +@implementation VLCProgramMetaData + +- (instancetype)initWithProgramStructure:(const struct vlc_player_program *)structure +{ + self = [super init]; + if (structure != NULL) { + _group_id = structure->group_id; + _name = toNSStr(structure->name); + _selected = structure->selected; + _scrambled = structure->scrambled; + } + return self; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"%@: name: %@", [VLCProgramMetaData className], self.name]; +} + +@end _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
