[vlc-commits] macosx/player controller: expose title management

Felix Paul Kühne git at videolan.org
Mon Mar 11 01:09:01 CET 2019


vlc | branch: master | Felix Paul Kühne <felix at feepk.net> | Sun Mar 10 23:20:01 2019 +0100| [b04b75381ed9eefa3257d6fad6d9b7663ef87308] | committer: Felix Paul Kühne

macosx/player controller: expose title management

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b04b75381ed9eefa3257d6fad6d9b7663ef87308
---

 modules/gui/macosx/playlist/VLCPlayerController.h | 36 ++++++++++
 modules/gui/macosx/playlist/VLCPlayerController.m | 83 ++++++++++++++++++++++-
 2 files changed, 117 insertions(+), 2 deletions(-)

diff --git a/modules/gui/macosx/playlist/VLCPlayerController.h b/modules/gui/macosx/playlist/VLCPlayerController.h
index aba0b0710d..62e7c84313 100644
--- a/modules/gui/macosx/playlist/VLCPlayerController.h
+++ b/modules/gui/macosx/playlist/VLCPlayerController.h
@@ -81,6 +81,18 @@ extern NSString *VLCPlayerTimeAndPositionChanged;
 extern NSString *VLCPlayerLengthChanged;
 
 /**
+ * Listen to VLCPlayerTitleSelectionChanged to be notified if the selected title of the current media changes
+ * @note the affected player object will be the object of the notification
+ */
+extern NSString *VLCPlayerTitleSelectionChanged;
+
+/**
+ * Listen to VLCPlayerTitleListChanged to be notified if the list of titles of the current media changes
+ * @note the affected player object will be the object of the notification
+ */
+extern NSString *VLCPlayerTitleListChanged;
+
+/**
  * Listen to VLCPlayerTeletextMenuAvailable to be notified if a teletext menu becomes (un-)available
  * @note the affected player object will be the object of the notification
  */
@@ -385,6 +397,30 @@ extern NSString *VLCPlayerMuteChanged;
 @property (readonly) vlc_tick_t length;
 
 /**
+ * set/get the currently selected title
+ * @note listen to VLCPlayerTitleSelectionChanged to be notified about changes to this property
+ */
+ at property (readwrite, nonatomic) size_t selectedTitleIndex;
+
+/**
+ * convinience method to get the current title
+ * @note this may return NULL if there is no title
+ */
+- (const struct vlc_player_title * _Nullable)selectedTitle;
+
+/**
+ * get the number of titles available for the currently playing media item
+ * @note listen to VLCPlayerTitleListChanged to be notified about changes to this property
+ */
+ at property (readonly) size_t numberOfTitlesOfCurrentMedia;
+
+/**
+ * get a vlc_player_title by the index
+ * @note listen to VLCPlayerTitleListChanged in case the list changes so previous indexes will no longer be valid anymore
+ */
+- (const struct vlc_player_title *)titleAtIndexForCurrentMedia:(size_t)index;
+
+/**
  * exposes whether a teletext menu is available or not
  * @note listen to VLCPlayerTeletextMenuAvailable to be notified about changes to this property
  */
diff --git a/modules/gui/macosx/playlist/VLCPlayerController.m b/modules/gui/macosx/playlist/VLCPlayerController.m
index 60174da831..bc69519645 100644
--- a/modules/gui/macosx/playlist/VLCPlayerController.m
+++ b/modules/gui/macosx/playlist/VLCPlayerController.m
@@ -33,6 +33,8 @@ NSString *VLCPlayerRateChanged = @"VLCPlayerRateChanged";
 NSString *VLCPlayerCapabilitiesChanged = @"VLCPlayerCapabilitiesChanged";
 NSString *VLCPlayerTimeAndPositionChanged = @"VLCPlayerTimeAndPositionChanged";
 NSString *VLCPlayerLengthChanged = @"VLCPlayerLengthChanged";
+NSString *VLCPlayerTitleSelectionChanged = @"VLCPlayerTitleSelectionChanged";
+NSString *VLCPlayerTitleListChanged = @"VLCPlayerTitleListChanged";
 NSString *VLCPlayerTeletextMenuAvailable = @"VLCPlayerTeletextMenuAvailable";
 NSString *VLCPlayerTeletextEnabled = @"VLCPlayerTeletextEnabled";
 NSString *VLCPlayerTeletextPageChanged = @"VLCPlayerTeletextPageChanged";
@@ -54,6 +56,7 @@ NSString *VLCPlayerMuteChanged = @"VLCPlayerMuteChanged";
     vlc_player_listener_id *_playerListenerID;
     vlc_player_aout_listener_id *_playerAoutListenerID;
     vlc_player_vout_listener_id *_playerVoutListenerID;
+    vlc_player_title_list *_currentTitleList;
     NSNotificationCenter *_defaultNotificationCenter;
 }
 
@@ -65,6 +68,8 @@ NSString *VLCPlayerMuteChanged = @"VLCPlayerMuteChanged";
 - (void)capabilitiesChanged:(int)newCapabilities;
 - (void)position:(float)position andTimeChanged:(vlc_tick_t)time;
 - (void)lengthChanged:(vlc_tick_t)length;
+- (void)titleListChanged:(vlc_player_title_list *)p_titles;
+- (void)selectedTitleChanged:(size_t)selectedTitle;
 - (void)teletextAvailibilityChanged:(BOOL)hasTeletextMenu;
 - (void)teletextEnabledChanged:(BOOL)teletextOn;
 - (void)teletextPageChanged:(unsigned int)page;
@@ -158,6 +163,31 @@ static void cb_player_length_changed(vlc_player_t *p_player, vlc_tick_t newLengt
     });
 }
 
+static void cb_player_titles_changed(vlc_player_t *p_player,
+                                     vlc_player_title_list *p_titles,
+                                     void *p_data)
+{
+    VLC_UNUSED(p_player);
+    vlc_player_title_list_Hold(p_titles);
+    dispatch_async(dispatch_get_main_queue(), ^{
+        VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data;
+        [playerController titleListChanged:p_titles];
+    });
+}
+
+static void cb_player_title_selection_changed(vlc_player_t *p_player,
+                                              const struct vlc_player_title *p_new_title,
+                                              size_t selectedIndex,
+                                              void *p_data)
+{
+    VLC_UNUSED(p_player);
+    VLC_UNUSED(p_new_title);
+    dispatch_async(dispatch_get_main_queue(), ^{
+        VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data;
+        [playerController selectedTitleChanged:selectedIndex];
+    });
+}
+
 static void cb_player_teletext_menu_availability_changed(vlc_player_t *p_player, bool hasTeletextMenu, void *p_data)
 {
     VLC_UNUSED(p_player);
@@ -275,8 +305,8 @@ static const struct vlc_player_cbs player_callbacks = {
     NULL, //cb_player_track_selection_changed,
     NULL, //cb_player_program_list_changed,
     NULL, //cb_player_program_selection_changed,
-    NULL, //cb_player_titles_changed,
-    NULL, //cb_player_title_selection_changed,
+    cb_player_titles_changed,
+    cb_player_title_selection_changed,
     NULL, //cb_player_chapter_selection_changed,
     cb_player_teletext_menu_availability_changed,
     cb_player_teletext_enabled_changed,
@@ -378,6 +408,9 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
 
 - (void)deinitialize
 {
+    if (_currentTitleList) {
+        vlc_player_title_list_Release(_currentTitleList);
+    }
     if (_p_player) {
         if (_playerListenerID) {
             vlc_player_Lock(_p_player);
@@ -659,6 +692,52 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
                                               object:self];
 }
 
+- (void)titleListChanged:(vlc_player_title_list *)p_titles
+{
+    if (_currentTitleList) {
+        vlc_player_title_list_Release(_currentTitleList);
+    }
+    /* the new list was already hold earlier */
+    _currentTitleList = p_titles;
+    [_defaultNotificationCenter postNotificationName:VLCPlayerTitleListChanged
+                                              object:self];
+}
+
+- (void)selectedTitleChanged:(size_t)selectedTitle
+{
+    _selectedTitleIndex = selectedTitle;
+    [_defaultNotificationCenter postNotificationName:VLCPlayerTitleSelectionChanged
+                                              object:self];
+}
+
+- (const struct vlc_player_title *)selectedTitle
+{
+    if (_selectedTitleIndex >= 0 && _selectedTitleIndex < [self numberOfTitlesOfCurrentMedia]) {
+        return vlc_player_title_list_GetAt(_currentTitleList, _selectedTitleIndex);
+    }
+    return NULL;
+}
+
+- (void)setSelectedTitleIndex:(size_t)selectedTitleIndex
+{
+    vlc_player_Lock(_p_player);
+    vlc_player_SelectTitleIdx(_p_player, selectedTitleIndex);
+    vlc_player_Unlock(_p_player);
+}
+
+- (const struct vlc_player_title *)titleAtIndexForCurrentMedia:(size_t)index
+{
+    return vlc_player_title_list_GetAt(_currentTitleList, index);
+}
+
+- (size_t)numberOfTitlesOfCurrentMedia
+{
+    if (!_currentTitleList) {
+        return 0;
+    }
+    return vlc_player_title_list_GetCount(_currentTitleList);
+}
+
 - (void)teletextAvailibilityChanged:(BOOL)hasTeletextMenu
 {
     _teletextMenuAvailable = hasTeletextMenu;



More information about the vlc-commits mailing list