[vlc-commits] macosx/playlist: ensure that changes to the model are dispatched to the main thread

Felix Paul Kühne git at videolan.org
Fri Feb 1 12:07:34 CET 2019


vlc | branch: master | Felix Paul Kühne <felix at feepk.net> | Fri Feb  1 12:07:07 2019 +0100| [9b5902e281494bc89b6f0c3d5d2141dcaaad58e4] | committer: Felix Paul Kühne

macosx/playlist: ensure that changes to the model are dispatched to the main thread

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

 modules/gui/macosx/UI/VLCPlaylistTableCellView.xib |  3 +
 modules/gui/macosx/VLCPlaylistController.m         | 86 +++++++++++++---------
 modules/gui/macosx/VLCPlaylistItem.m               |  6 ++
 modules/gui/macosx/VLCPlaylistModel.h              |  4 +-
 modules/gui/macosx/VLCPlaylistModel.m              | 10 +--
 5 files changed, 68 insertions(+), 41 deletions(-)

diff --git a/modules/gui/macosx/UI/VLCPlaylistTableCellView.xib b/modules/gui/macosx/UI/VLCPlaylistTableCellView.xib
index eab65dcab2..c68cf25a5b 100644
--- a/modules/gui/macosx/UI/VLCPlaylistTableCellView.xib
+++ b/modules/gui/macosx/UI/VLCPlaylistTableCellView.xib
@@ -29,6 +29,9 @@
                 </imageView>
                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3Ha-ZH-fa9">
                     <rect key="frame" x="353" y="24" width="37" height="17"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="33" id="0cB-ga-0Uw"/>
+                    </constraints>
                     <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="N0j-xB-3t9">
                         <font key="font" usesAppearanceFont="YES"/>
                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
diff --git a/modules/gui/macosx/VLCPlaylistController.m b/modules/gui/macosx/VLCPlaylistController.m
index 47f00d3c00..525cc09bfd 100644
--- a/modules/gui/macosx/VLCPlaylistController.m
+++ b/modules/gui/macosx/VLCPlaylistController.m
@@ -22,6 +22,7 @@
 
 #import "VLCPlaylistController.h"
 #import "VLCPlaylistModel.h"
+#import "VLCPlaylistItem.h"
 #import "VLCPlaylistDataSource.h"
 #import "VLCMain.h"
 #import <vlc_interface.h>
@@ -37,8 +38,8 @@ NSString *VLCPlaybackHasNextChanged = @"VLCPlaybackHasNextChanged";
     vlc_playlist_listener_id *_playlistListenerID;
 }
 
-- (void)playlistResetWithItems:(vlc_playlist_item_t *const *)items count:(size_t)numberOfItems;
-- (void)playlistAdded:(vlc_playlist_item_t *const *)items atIndex:(size_t)insertionIndex count:(size_t)numberOfItems;
+- (void)playlistResetWithItems:(NSArray *)items count:(size_t)numberOfItems;
+- (void)playlistAdded:(NSArray *)items atIndex:(size_t)insertionIndex count:(size_t)numberOfItems;
 - (void)playlistRemovedItemsAtIndex:(size_t)index count:(size_t)numberOfItems;
 - (void)playlistUpdatedForIndex:(size_t)firstUpdatedIndex items:(vlc_playlist_item_t *const *)items count:(size_t)numberOfItems;
 - (void)playlistPlaybackRepeatUpdated:(enum vlc_playlist_playback_repeat)currentRepeatMode;
@@ -58,8 +59,15 @@ cb_playlist_items_reset(vlc_playlist_t *playlist,
                         size_t numberOfItems,
                         void *p_data)
 {
-    VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
-    [playlistController playlistResetWithItems:items count:numberOfItems];
+    NSMutableArray *array = [NSMutableArray arrayWithCapacity:numberOfItems];
+    for (size_t i = 0; i < numberOfItems; i++) {
+        VLCPlaylistItem *item = [[VLCPlaylistItem alloc] initWithPlaylistItem:items[i]];
+        [array addObject:item];
+    }
+    dispatch_async(dispatch_get_main_queue(), ^{
+        VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
+        [playlistController playlistResetWithItems:items count:numberOfItems];
+    });
 }
 
 static void
@@ -69,8 +77,15 @@ cb_playlist_items_added(vlc_playlist_t *playlist,
                         size_t numberOfAddedItems,
                         void *p_data)
 {
-    VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
-    [playlistController playlistAdded:items atIndex:insertionIndex count:numberOfAddedItems];
+    NSMutableArray *array = [NSMutableArray arrayWithCapacity:numberOfAddedItems];
+    for (size_t i = 0; i < numberOfAddedItems; i++) {
+        VLCPlaylistItem *item = [[VLCPlaylistItem alloc] initWithPlaylistItem:items[i]];
+        [array addObject:item];
+    }
+    dispatch_async(dispatch_get_main_queue(), ^{
+        VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
+        [playlistController playlistAdded:array atIndex:insertionIndex count:numberOfAddedItems];
+    });
 }
 
 static void
@@ -79,8 +94,10 @@ cb_playlist_items_removed(vlc_playlist_t *playlist,
                           size_t count,
                           void *p_data)
 {
-    VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
-    [playlistController playlistRemovedItemsAtIndex:index count:count];
+    dispatch_async(dispatch_get_main_queue(), ^{
+        VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
+        [playlistController playlistRemovedItemsAtIndex:index count:count];
+    });
 }
 
 static void
@@ -90,8 +107,10 @@ cb_playlist_items_updated(vlc_playlist_t *playlist,
                           size_t numberOfUpdatedItems,
                           void *p_data)
 {
-    VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
-    [playlistController playlistUpdatedForIndex:firstUpdatedIndex items:items count:numberOfUpdatedItems];
+    dispatch_async(dispatch_get_main_queue(), ^{
+        VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
+        [playlistController playlistUpdatedForIndex:firstUpdatedIndex items:items count:numberOfUpdatedItems];
+    });
 }
 
 static void
@@ -115,8 +134,10 @@ cb_playlist_current_item_changed(vlc_playlist_t *playlist,
                                  ssize_t index,
                                  void *p_data)
 {
-    VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
-    [playlistController currentPlaylistItemChanged:index];
+    dispatch_async(dispatch_get_main_queue(), ^{
+        VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
+        [playlistController currentPlaylistItemChanged:index];
+    });
 }
 
 static void
@@ -124,8 +145,10 @@ cb_playlist_has_prev_changed(vlc_playlist_t *playlist,
                              bool has_prev,
                              void *p_data)
 {
-    VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
-    [playlistController playlistHasPreviousItem:has_prev];
+    dispatch_async(dispatch_get_main_queue(), ^{
+        VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
+        [playlistController playlistHasPreviousItem:has_prev];
+    });
 }
 
 static void
@@ -133,8 +156,10 @@ cb_playlist_has_next_changed(vlc_playlist_t *playlist,
                              bool has_next,
                              void *p_data)
 {
-    VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
-    [playlistController playlistHasNextItem:has_next];
+    dispatch_async(dispatch_get_main_queue(), ^{
+        VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
+        [playlistController playlistHasNextItem:has_next];
+    });
 }
 
 static const struct vlc_playlist_callbacks playlist_callbacks = {
@@ -183,23 +208,18 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
 
 #pragma mark - callback forwarders
 
-- (void)playlistResetWithItems:(vlc_playlist_item_t *const *)items count:(size_t)numberOfItems
+- (void)playlistResetWithItems:(NSArray *)items count:(size_t)numberOfItems
 {
-    for (size_t i = 0; i < numberOfItems; i++) {
-        [_playlistModel addItem:items[i]];
-    }
+    [_playlistModel addItems:items];
 
-    [_playlistDataSource performSelectorOnMainThread:@selector(playlistUpdated) withObject:nil waitUntilDone:NO];
+    [_playlistDataSource playlistUpdated];
 }
 
-- (void)playlistAdded:(vlc_playlist_item_t *const *)items atIndex:(size_t)insertionIndex count:(size_t)numberOfItems
+- (void)playlistAdded:(NSArray *)items atIndex:(size_t)insertionIndex count:(size_t)numberOfItems
 {
-    for (size_t i = 0; i < numberOfItems; i++) {
-        [_playlistModel addItem:items[i] atIndex:insertionIndex];
-        insertionIndex++;
-    }
+    [_playlistModel addItems:items atIndex:insertionIndex];
 
-    [_playlistDataSource performSelectorOnMainThread:@selector(playlistUpdated) withObject:nil waitUntilDone:NO];
+    [_playlistDataSource playlistUpdated];
 }
 
 - (void)playlistRemovedItemsAtIndex:(size_t)index count:(size_t)numberOfItems
@@ -207,7 +227,7 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
     NSRange range = NSMakeRange(index, numberOfItems);
     [_playlistModel removeItemsInRange:range];
 
-    [_playlistDataSource performSelectorOnMainThread:@selector(playlistUpdated) withObject:nil waitUntilDone:NO];
+    [_playlistDataSource playlistUpdated];
 }
 
 - (void)playlistUpdatedForIndex:(size_t)firstUpdatedIndex items:(vlc_playlist_item_t *const *)items count:(size_t)numberOfItems
@@ -216,7 +236,7 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
     for (size_t i = firstUpdatedIndex; i < firstUpdatedIndex + numberOfItems; i++) {
         [_playlistModel updateItemAtIndex:i];
     }
-    [_playlistDataSource performSelectorOnMainThread:@selector(playlistUpdated) withObject:nil waitUntilDone:NO];
+    [_playlistDataSource playlistUpdated];
 }
 
 - (void)playlistPlaybackRepeatUpdated:(enum vlc_playlist_playback_repeat)currentRepeatMode
@@ -234,7 +254,7 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
 - (void)currentPlaylistItemChanged:(size_t)index
 {
     _currentPlaylistIndex = index;
-    [_playlistDataSource performSelectorOnMainThread:@selector(playlistUpdated) withObject:nil waitUntilDone:NO];
+    [_playlistDataSource playlistUpdated];
 }
 
 - (void)playlistHasPreviousItem:(BOOL)hasPrevious
@@ -289,9 +309,9 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
             actualInsertionIndex = vlc_playlist_Count(_p_playlist);
         }
         ret = vlc_playlist_Insert(_p_playlist,
-                                      actualInsertionIndex,
-                                      &p_input,
-                                      1);
+                                  actualInsertionIndex,
+                                  &p_input,
+                                  1);
 
         if (ret != VLC_SUCCESS) {
             msg_Err(p_intf, "failed to insert input item at insertion index: %zu", insertionIndex);
diff --git a/modules/gui/macosx/VLCPlaylistItem.m b/modules/gui/macosx/VLCPlaylistItem.m
index c881709bef..8d5b3db5fe 100644
--- a/modules/gui/macosx/VLCPlaylistItem.m
+++ b/modules/gui/macosx/VLCPlaylistItem.m
@@ -32,11 +32,17 @@
     self = [super init];
     if (self) {
         _playlistItem = p_item;
+        vlc_playlist_item_Hold(_playlistItem);
         [self updateRepresentation];
     }
     return self;
 }
 
+- (void)dealloc
+{
+    vlc_playlist_item_Release(_playlistItem);
+}
+
 - (NSString *)description
 {
     return [NSString stringWithFormat:@"item %p, title: %@ duration %lli", &_playlistItem, _title, _duration];
diff --git a/modules/gui/macosx/VLCPlaylistModel.h b/modules/gui/macosx/VLCPlaylistModel.h
index 601c5af44d..c6ce2c22dd 100644
--- a/modules/gui/macosx/VLCPlaylistModel.h
+++ b/modules/gui/macosx/VLCPlaylistModel.h
@@ -35,8 +35,8 @@ NS_ASSUME_NONNULL_BEGIN
 
 - (void)dropExistingData;
 - (VLCPlaylistItem *)playlistItemAtIndex:(NSInteger)index;
-- (void)addItem:(vlc_playlist_item_t *)item;
-- (void)addItem:(vlc_playlist_item_t *)item atIndex:(size_t)index;
+- (void)addItems:(NSArray *)array;
+- (void)addItems:(NSArray *)array atIndex:(size_t)index;
 - (void)removeItemsInRange:(NSRange)range;
 - (void)updateItemAtIndex:(size_t)index;
 
diff --git a/modules/gui/macosx/VLCPlaylistModel.m b/modules/gui/macosx/VLCPlaylistModel.m
index 5b9246d869..26dce6403d 100644
--- a/modules/gui/macosx/VLCPlaylistModel.m
+++ b/modules/gui/macosx/VLCPlaylistModel.m
@@ -63,16 +63,14 @@
     return _playlistArray[index];
 }
 
-- (void)addItem:(vlc_playlist_item_t *)item
+- (void)addItems:(NSArray *)array
 {
-    VLCPlaylistItem *playlistItem = [[VLCPlaylistItem alloc] initWithPlaylistItem:item];
-    [_playlistArray addObject:playlistItem];
+    [_playlistArray addObjectsFromArray:array];
 }
 
-- (void)addItem:(vlc_playlist_item_t *)item atIndex:(size_t)index
+- (void)addItems:(NSArray *)array atIndex:(size_t)index
 {
-    VLCPlaylistItem *playlistItem = [[VLCPlaylistItem alloc] initWithPlaylistItem:item];
-    [_playlistArray insertObject:playlistItem atIndex:index];
+    [_playlistArray insertObjects:array atIndexes:[NSIndexSet indexSetWithIndex:index]];
 }
 
 - (void)removeItemsInRange:(NSRange)range



More information about the vlc-commits mailing list