vlc | branch: master | Felix Paul Kühne <[email protected]> | Wed Sep 25 21:02:16 2019 +0200| [2c84f5693d026517b2bf26b25d1097edd6a4320f] | committer: Felix Paul Kühne
macosx: perform library operations on the background thread The media library module may raise blocking VLC core question dialogs, which will lead to a deadlock when the primary dispatch is performed on the main thread. For data consistency, objc data reflections are handled on the MT only. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2c84f5693d026517b2bf26b25d1097edd6a4320f --- modules/gui/macosx/library/VLCLibraryController.m | 8 +- modules/gui/macosx/library/VLCLibraryModel.m | 168 ++++++++++++---------- 2 files changed, 102 insertions(+), 74 deletions(-) diff --git a/modules/gui/macosx/library/VLCLibraryController.m b/modules/gui/macosx/library/VLCLibraryController.m index 64e80e7ce3..5b1c72c6a2 100644 --- a/modules/gui/macosx/library/VLCLibraryController.m +++ b/modules/gui/macosx/library/VLCLibraryController.m @@ -80,9 +80,13 @@ float kVLCDefaultThumbnailPosition = .15; } VLCPlayerController *playerController = aNotification.object; if (playerController.playerState == VLC_PLAYER_STATE_PLAYING) { - vlc_ml_pause_background(_p_libraryInstance); + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{ + vlc_ml_pause_background(self->_p_libraryInstance); + }); } else { - vlc_ml_resume_background(_p_libraryInstance); + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{ + vlc_ml_resume_background(self->_p_libraryInstance); + }); } } diff --git a/modules/gui/macosx/library/VLCLibraryModel.m b/modules/gui/macosx/library/VLCLibraryModel.m index 0e37d3c7e2..ed9a61fbd1 100644 --- a/modules/gui/macosx/library/VLCLibraryModel.m +++ b/modules/gui/macosx/library/VLCLibraryModel.m @@ -136,19 +136,23 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event) - (void)updateCachedListOfAudioMedia { - vlc_ml_media_list_t *p_media_list = vlc_ml_list_audio_media(_p_mediaLibrary, NULL); - if (!p_media_list) { - return; - } + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{ + vlc_ml_media_list_t *p_media_list = vlc_ml_list_audio_media(self->_p_mediaLibrary, NULL); + if (!p_media_list) { + return; + } - NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_media_list->i_nb_items]; - for (size_t x = 0; x < p_media_list->i_nb_items; x++) { - VLCMediaLibraryMediaItem *mediaItem = [[VLCMediaLibraryMediaItem alloc] initWithMediaItem:&p_media_list->p_items[x]]; - [mutableArray addObject:mediaItem]; - } - _cachedAudioMedia = [mutableArray copy]; - vlc_ml_media_list_release(p_media_list); - [_defaultNotificationCenter postNotificationName:VLCLibraryModelAudioMediaListUpdated object:self]; + NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_media_list->i_nb_items]; + for (size_t x = 0; x < p_media_list->i_nb_items; x++) { + VLCMediaLibraryMediaItem *mediaItem = [[VLCMediaLibraryMediaItem alloc] initWithMediaItem:&p_media_list->p_items[x]]; + [mutableArray addObject:mediaItem]; + } + vlc_ml_media_list_release(p_media_list); + dispatch_async(dispatch_get_main_queue(), ^{ + self->_cachedAudioMedia = [mutableArray copy]; + [self->_defaultNotificationCenter postNotificationName:VLCLibraryModelAudioMediaListUpdated object:self]; + }); + }); } - (NSArray<VLCMediaLibraryMediaItem *> *)listOfAudioMedia @@ -169,15 +173,19 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event) - (void)updateCachedListOfArtists { - vlc_ml_artist_list_t *p_artist_list = vlc_ml_list_artists(_p_mediaLibrary, NULL, NO); - NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_artist_list->i_nb_items]; - for (size_t x = 0; x < p_artist_list->i_nb_items; x++) { - VLCMediaLibraryArtist *artist = [[VLCMediaLibraryArtist alloc] initWithArtist:&p_artist_list->p_items[x]]; - [mutableArray addObject:artist]; - } - _cachedArtists = [mutableArray copy]; - vlc_ml_artist_list_release(p_artist_list); - [_defaultNotificationCenter postNotificationName:VLCLibraryModelArtistListUpdated object:self]; + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{ + vlc_ml_artist_list_t *p_artist_list = vlc_ml_list_artists(self->_p_mediaLibrary, NULL, NO); + NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_artist_list->i_nb_items]; + for (size_t x = 0; x < p_artist_list->i_nb_items; x++) { + VLCMediaLibraryArtist *artist = [[VLCMediaLibraryArtist alloc] initWithArtist:&p_artist_list->p_items[x]]; + [mutableArray addObject:artist]; + } + vlc_ml_artist_list_release(p_artist_list); + dispatch_async(dispatch_get_main_queue(), ^{ + self->_cachedArtists = [mutableArray copy]; + [self->_defaultNotificationCenter postNotificationName:VLCLibraryModelArtistListUpdated object:self]; + }); + }); } - (NSArray<VLCMediaLibraryArtist *> *)listOfArtists @@ -198,15 +206,19 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event) - (void)updateCachedListOfAlbums { - vlc_ml_album_list_t *p_album_list = vlc_ml_list_albums(_p_mediaLibrary, NULL); - NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_album_list->i_nb_items]; - for (size_t x = 0; x < p_album_list->i_nb_items; x++) { - VLCMediaLibraryAlbum *album = [[VLCMediaLibraryAlbum alloc] initWithAlbum:&p_album_list->p_items[x]]; - [mutableArray addObject:album]; - } - _cachedAlbums = [mutableArray copy]; - vlc_ml_album_list_release(p_album_list); - [_defaultNotificationCenter postNotificationName:VLCLibraryModelArtistListUpdated object:self]; + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{ + vlc_ml_album_list_t *p_album_list = vlc_ml_list_albums(self->_p_mediaLibrary, NULL); + NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_album_list->i_nb_items]; + for (size_t x = 0; x < p_album_list->i_nb_items; x++) { + VLCMediaLibraryAlbum *album = [[VLCMediaLibraryAlbum alloc] initWithAlbum:&p_album_list->p_items[x]]; + [mutableArray addObject:album]; + } + vlc_ml_album_list_release(p_album_list); + dispatch_async(dispatch_get_main_queue(), ^{ + self->_cachedAlbums = [mutableArray copy]; + [self->_defaultNotificationCenter postNotificationName:VLCLibraryModelArtistListUpdated object:self]; + }); + }); } - (NSArray<VLCMediaLibraryAlbum *> *)listOfAlbums @@ -227,15 +239,19 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event) - (void)updateCachedListOfGenres { - vlc_ml_genre_list_t *p_genre_list = vlc_ml_list_genres(_p_mediaLibrary, NULL); - NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_genre_list->i_nb_items]; - for (size_t x = 0; x < p_genre_list->i_nb_items; x++) { - VLCMediaLibraryGenre *genre = [[VLCMediaLibraryGenre alloc] initWithGenre:&p_genre_list->p_items[x]]; - [mutableArray addObject:genre]; - } - _cachedGenres = [mutableArray copy]; - vlc_ml_genre_list_release(p_genre_list); - [_defaultNotificationCenter postNotificationName:VLCLibraryModelArtistListUpdated object:self]; + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{ + vlc_ml_genre_list_t *p_genre_list = vlc_ml_list_genres(self->_p_mediaLibrary, NULL); + NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_genre_list->i_nb_items]; + for (size_t x = 0; x < p_genre_list->i_nb_items; x++) { + VLCMediaLibraryGenre *genre = [[VLCMediaLibraryGenre alloc] initWithGenre:&p_genre_list->p_items[x]]; + [mutableArray addObject:genre]; + } + vlc_ml_genre_list_release(p_genre_list); + dispatch_async(dispatch_get_main_queue(), ^{ + self->_cachedGenres = [mutableArray copy]; + [self->_defaultNotificationCenter postNotificationName:VLCLibraryModelArtistListUpdated object:self]; + }); + }); } - (NSArray<VLCMediaLibraryMediaItem *> *)listOfGenres @@ -258,23 +274,27 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event) - (void)updateCachedListOfVideoMedia { - vlc_ml_query_params_t queryParameters; - memset(&queryParameters, 0, sizeof(vlc_ml_query_params_t)); - queryParameters.i_nbResults = 20; - queryParameters.i_sort = _sortCriteria; - queryParameters.b_desc = _sortDescending; - vlc_ml_media_list_t *p_media_list = vlc_ml_list_video_media(_p_mediaLibrary, &queryParameters); - if (p_media_list == NULL) { - return; - } - NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_media_list->i_nb_items]; - for (size_t x = 0; x < p_media_list->i_nb_items; x++) { - VLCMediaLibraryMediaItem *mediaItem = [[VLCMediaLibraryMediaItem alloc] initWithMediaItem:&p_media_list->p_items[x]]; - [mutableArray addObject:mediaItem]; - } - _cachedVideoMedia = [mutableArray copy]; - vlc_ml_media_list_release(p_media_list); - [_defaultNotificationCenter postNotificationName:VLCLibraryModelVideoMediaListUpdated object:self]; + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{ + vlc_ml_query_params_t queryParameters; + memset(&queryParameters, 0, sizeof(vlc_ml_query_params_t)); + queryParameters.i_nbResults = 20; + queryParameters.i_sort = self->_sortCriteria; + queryParameters.b_desc = self->_sortDescending; + vlc_ml_media_list_t *p_media_list = vlc_ml_list_video_media(self->_p_mediaLibrary, &queryParameters); + if (p_media_list == NULL) { + return; + } + NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_media_list->i_nb_items]; + for (size_t x = 0; x < p_media_list->i_nb_items; x++) { + VLCMediaLibraryMediaItem *mediaItem = [[VLCMediaLibraryMediaItem alloc] initWithMediaItem:&p_media_list->p_items[x]]; + [mutableArray addObject:mediaItem]; + } + vlc_ml_media_list_release(p_media_list); + dispatch_async(dispatch_get_main_queue(), ^{ + self->_cachedVideoMedia = [mutableArray copy]; + [self->_defaultNotificationCenter postNotificationName:VLCLibraryModelVideoMediaListUpdated object:self]; + }); + }); } - (NSArray<VLCMediaLibraryMediaItem *> *)listOfVideoMedia @@ -289,22 +309,26 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event) - (void)updateCachedListOfRecentMedia { - vlc_ml_query_params_t queryParameters; - memset(&queryParameters, 0, sizeof(vlc_ml_query_params_t)); - queryParameters.i_nbResults = 20; - // we don't set the sorting criteria here as they are not applicable to history - vlc_ml_media_list_t *p_media_list = vlc_ml_list_history(_p_mediaLibrary, &queryParameters); - if (p_media_list == NULL) { - return; - } - NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_media_list->i_nb_items]; - for (size_t x = 0; x < p_media_list->i_nb_items; x++) { - VLCMediaLibraryMediaItem *mediaItem = [[VLCMediaLibraryMediaItem alloc] initWithMediaItem:&p_media_list->p_items[x]]; - [mutableArray addObject:mediaItem]; - } - _cachedRecentMedia = [mutableArray copy]; - vlc_ml_media_list_release(p_media_list); - [_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentMediaListUpdated object:self]; + dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{ + vlc_ml_query_params_t queryParameters; + memset(&queryParameters, 0, sizeof(vlc_ml_query_params_t)); + queryParameters.i_nbResults = 20; + // we don't set the sorting criteria here as they are not applicable to history + vlc_ml_media_list_t *p_media_list = vlc_ml_list_history(self->_p_mediaLibrary, &queryParameters); + if (p_media_list == NULL) { + return; + } + NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_media_list->i_nb_items]; + for (size_t x = 0; x < p_media_list->i_nb_items; x++) { + VLCMediaLibraryMediaItem *mediaItem = [[VLCMediaLibraryMediaItem alloc] initWithMediaItem:&p_media_list->p_items[x]]; + [mutableArray addObject:mediaItem]; + } + vlc_ml_media_list_release(p_media_list); + dispatch_async(dispatch_get_main_queue(), ^{ + self->_cachedRecentMedia = [mutableArray copy]; + [self->_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentMediaListUpdated object:self]; + }); + }); } - (size_t)numberOfRecentMedia _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
