[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