[vlc-commits] macosx/player controller: add chapter support

Felix Paul Kühne git at videolan.org
Tue Apr 9 22:53:52 CEST 2019


vlc | branch: master | Felix Paul Kühne <felix at feepk.net> | Sun Apr  7 16:17:12 2019 +0200| [62f810a40a71780f6b37b649fee07d2f61785a39] | committer: Felix Paul Kühne

macosx/player controller: add chapter support

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

 modules/gui/macosx/playlist/VLCPlayerController.h | 32 +++++++++++
 modules/gui/macosx/playlist/VLCPlayerController.m | 67 ++++++++++++++++++++++-
 2 files changed, 98 insertions(+), 1 deletion(-)

diff --git a/modules/gui/macosx/playlist/VLCPlayerController.h b/modules/gui/macosx/playlist/VLCPlayerController.h
index b50c08f72e..e021779d0c 100644
--- a/modules/gui/macosx/playlist/VLCPlayerController.h
+++ b/modules/gui/macosx/playlist/VLCPlayerController.h
@@ -92,6 +92,12 @@ extern NSString *VLCPlayerTitleSelectionChanged;
 extern NSString *VLCPlayerTitleListChanged;
 
 /**
+ * Listen to VLCPlayerChapterSelectionChanged to be notified if the selected chapter of the current title changes
+ * @note the affected player object will be the object of the notification
+ */
+extern NSString *VLCPlayerChapterSelectionChanged;
+
+/**
  * 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
  */
@@ -498,6 +504,32 @@ extern NSString *VLCPlayerMuteChanged;
 - (const struct vlc_player_title *)titleAtIndexForCurrentMedia:(size_t)index;
 
 /**
+ * the index of the currently selected chapter within the current title
+ * @note listen to VLCPlayerChapterSelectionChanged to be notified about changes to this property
+ */
+ at property (readwrite, nonatomic) size_t selectedChapterIndex;
+
+/**
+ * select the next chapter of the current title
+ */
+- (void)selectNextChapter;
+
+/**
+ * select the previous chapter of the current title
+ */
+- (void)selectPreviousChapter;
+
+/**
+ * returns the number of chapters for the current title
+ */
+ at property (readonly) size_t numberOfChaptersForCurrentTitle;
+
+/**
+ * returns the chapter for the index within the current title
+ */
+- (nullable const struct vlc_player_chapter *)chapterAtIndexForCurrentTitle:(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 a4308243a7..e36494217c 100644
--- a/modules/gui/macosx/playlist/VLCPlayerController.m
+++ b/modules/gui/macosx/playlist/VLCPlayerController.m
@@ -43,6 +43,7 @@ NSString *VLCPlayerTimeAndPositionChanged = @"VLCPlayerTimeAndPositionChanged";
 NSString *VLCPlayerLengthChanged = @"VLCPlayerLengthChanged";
 NSString *VLCPlayerTitleSelectionChanged = @"VLCPlayerTitleSelectionChanged";
 NSString *VLCPlayerTitleListChanged = @"VLCPlayerTitleListChanged";
+NSString *VLCPlayerChapterSelectionChanged = @"VLCPlayerChapterSelectionChanged";
 NSString *VLCPlayerABLoopStateChanged = @"VLCPlayerABLoopStateChanged";
 NSString *VLCPlayerTeletextMenuAvailable = @"VLCPlayerTeletextMenuAvailable";
 NSString *VLCPlayerTeletextEnabled = @"VLCPlayerTeletextEnabled";
@@ -93,6 +94,7 @@ NSString *VLCPlayerMuteChanged = @"VLCPlayerMuteChanged";
 - (void)lengthChanged:(vlc_tick_t)length;
 - (void)titleListChanged:(vlc_player_title_list *)p_titles;
 - (void)selectedTitleChanged:(size_t)selectedTitle;
+- (void)selectedChapterChanged:(size_t)chapterIndex;
 - (void)teletextAvailibilityChanged:(BOOL)hasTeletextMenu;
 - (void)teletextEnabledChanged:(BOOL)teletextOn;
 - (void)teletextPageChanged:(unsigned int)page;
@@ -218,6 +220,21 @@ static void cb_player_title_selection_changed(vlc_player_t *p_player,
     });
 }
 
+static void cb_player_chapter_selection_changed(vlc_player_t *p_player,
+                                                const struct vlc_player_title *p_title, size_t title_idx,
+                                                const struct vlc_player_chapter *p_new_chapter, size_t new_chapter_idx,
+                                                void *p_data)
+{
+    VLC_UNUSED(p_player);
+    VLC_UNUSED(p_title);
+    VLC_UNUSED(title_idx);
+    VLC_UNUSED(p_new_chapter);
+    dispatch_async(dispatch_get_main_queue(), ^{
+        VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data;
+        [playerController selectedChapterChanged:new_chapter_idx];
+    });
+}
+
 static void cb_player_teletext_menu_availability_changed(vlc_player_t *p_player, bool hasTeletextMenu, void *p_data)
 {
     VLC_UNUSED(p_player);
@@ -422,7 +439,7 @@ static const struct vlc_player_cbs player_callbacks = {
     NULL, //cb_player_program_selection_changed,
     cb_player_titles_changed,
     cb_player_title_selection_changed,
-    NULL, //cb_player_chapter_selection_changed,
+    cb_player_chapter_selection_changed,
     cb_player_teletext_menu_availability_changed,
     cb_player_teletext_enabled_changed,
     cb_player_teletext_page_changed,
@@ -1095,6 +1112,54 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
     return vlc_player_title_list_GetCount(_currentTitleList);
 }
 
+- (void)selectedChapterChanged:(size_t)chapterIndex
+{
+    _selectedChapterIndex = chapterIndex;
+    [_defaultNotificationCenter postNotificationName:VLCPlayerChapterSelectionChanged
+                                              object:self];
+}
+
+- (void)setSelectedChapterIndex:(size_t)selectedChapterIndex
+{
+    vlc_player_Lock(_p_player);
+    vlc_player_SelectChapterIdx(_p_player, selectedChapterIndex);
+    vlc_player_Unlock(_p_player);
+}
+
+- (void)selectNextChapter
+{
+    vlc_player_Lock(_p_player);
+    vlc_player_SelectNextChapter(_p_player);
+    vlc_player_Unlock(_p_player);
+}
+
+- (void)selectPreviousChapter
+{
+    vlc_player_Lock(_p_player);
+    vlc_player_SelectPrevChapter(_p_player);
+    vlc_player_Unlock(_p_player);
+}
+
+- (size_t)numberOfChaptersForCurrentTitle
+{
+    const struct vlc_player_title *p_current_title = [self selectedTitle];
+    if (p_current_title == NULL) {
+        return 0;
+    }
+
+    return p_current_title->chapter_count;
+}
+
+- (const struct vlc_player_chapter *)chapterAtIndexForCurrentTitle:(size_t)index
+{
+    const struct vlc_player_title *p_current_title = [self selectedTitle];
+    if (p_current_title == NULL || !p_current_title->chapter_count) {
+        return NULL;
+    }
+
+    return &p_current_title->chapters[index];
+}
+
 - (void)teletextAvailibilityChanged:(BOOL)hasTeletextMenu
 {
     _teletextMenuAvailable = hasTeletextMenu;



More information about the vlc-commits mailing list