From 52157ae334127f4a20b6b4557b09fc44b4a5ed1f Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Tue, 23 Dec 2008 16:26:51 +0100 Subject: [PATCH] Fixed preparsing/art fetching locking. --- include/vlc_playlist.h | 4 ++-- modules/gui/macosx/playlist.m | 4 ++-- modules/gui/macosx/playlistinfo.m | 4 ++-- modules/gui/qt4/components/interface_widgets.cpp | 12 +++++++++++- modules/gui/qt4/components/interface_widgets.hpp | 4 ++-- modules/gui/wxwidgets/dialogs/playlist.cpp | 2 +- src/control/media.c | 4 ++-- src/playlist/control.c | 12 ++++++------ src/playlist/item.c | 2 +- src/playlist/thread.c | 2 +- 10 files changed, 30 insertions(+), 20 deletions(-) diff --git a/include/vlc_playlist.h b/include/vlc_playlist.h index 11cf3e6d0a..1b0d34866a 100644 --- a/include/vlc_playlist.h +++ b/include/vlc_playlist.h @@ -264,10 +264,10 @@ VLC_EXPORT( input_thread_t *, playlist_CurrentInput, ( playlist_t *p_playlist ) VLC_EXPORT( void, playlist_Clear, ( playlist_t *, bool ) ); /** Enqueue an input item for preparsing */ -VLC_EXPORT( int, playlist_PreparseEnqueue, (playlist_t *, input_item_t *) ); +VLC_EXPORT( int, playlist_PreparseEnqueue, (playlist_t *, input_item_t *, bool b_locked ) ); /** Request the art for an input item to be fetched */ -VLC_EXPORT( int, playlist_AskForArtEnqueue, (playlist_t *, input_item_t *) ); +VLC_EXPORT( int, playlist_AskForArtEnqueue, (playlist_t *, input_item_t *, bool b_locked ) ); /* Playlist sorting */ VLC_EXPORT( int, playlist_TreeMove, ( playlist_t *, playlist_item_t *, playlist_item_t *, int ) ); diff --git a/modules/gui/macosx/playlist.m b/modules/gui/macosx/playlist.m index 1ab42bbf39..e47cd30102 100644 --- a/modules/gui/macosx/playlist.m +++ b/modules/gui/macosx/playlist.m @@ -836,7 +836,7 @@ { if( p_item->i_children == -1 ) { - playlist_PreparseEnqueue( p_playlist, p_item->p_input ); + playlist_PreparseEnqueue( p_playlist, p_item->p_input, pl_Unlocked ); } else { @@ -872,7 +872,7 @@ if( p_item && p_item->i_children == -1 ) { - playlist_AskForArtEnqueue( p_playlist, p_item->p_input ); + playlist_AskForArtEnqueue( p_playlist, p_item->p_input, pl_Unlocked ); } } vlc_object_release( p_playlist ); diff --git a/modules/gui/macosx/playlistinfo.m b/modules/gui/macosx/playlistinfo.m index 8822305883..a32e6dafb9 100644 --- a/modules/gui/macosx/playlistinfo.m +++ b/modules/gui/macosx/playlistinfo.m @@ -249,7 +249,7 @@ static VLCInfo *_o_sharedInstance = nil; if( !input_item_IsPreparsed( p_item ) ) { playlist_t * p_playlist = pl_Hold( VLCIntf ); - playlist_PreparseEnqueue( p_playlist, p_item ); + playlist_PreparseEnqueue( p_playlist, p_item, pl_Unlocked ); pl_Release( VLCIntf ); } @@ -428,7 +428,7 @@ error: - (IBAction)downloadCoverArt:(id)sender { playlist_t * p_playlist = pl_Hold( VLCIntf ); - if( p_item) playlist_AskForArtEnqueue( p_playlist, p_item ); + if( p_item) playlist_AskForArtEnqueue( p_playlist, p_item, pl_Unlocked ); pl_Release( VLCIntf ); } diff --git a/modules/gui/qt4/components/interface_widgets.cpp b/modules/gui/qt4/components/interface_widgets.cpp index 2d471043c4..69b2ace122 100644 --- a/modules/gui/qt4/components/interface_widgets.cpp +++ b/modules/gui/qt4/components/interface_widgets.cpp @@ -447,12 +447,22 @@ CoverArtLabel::CoverArtLabel( QWidget *parent, doUpdate(); } +CoverArtLabel::~CoverArtLabel() +{ + playlist_t *p_playlist = pl_Hold( p_this ); + var_DelCallback( p_playlist, "item-change", downloadCoverCallback, this ); + pl_Release( p_this ); + + if( p_input ) + vlc_gc_decref( p_input ); +}; + void CoverArtLabel::downloadCover() { if( p_input ) { playlist_t *p_playlist = pl_Hold( p_this ); - playlist_AskForArtEnqueue( p_playlist, p_input ); + playlist_AskForArtEnqueue( p_playlist, p_input, pl_Unlocked ); pl_Release( p_this ); } } diff --git a/modules/gui/qt4/components/interface_widgets.hpp b/modules/gui/qt4/components/interface_widgets.hpp index 09ec2675ff..746b147950 100644 --- a/modules/gui/qt4/components/interface_widgets.hpp +++ b/modules/gui/qt4/components/interface_widgets.hpp @@ -196,8 +196,8 @@ public: CoverArtLabel( QWidget *parent, vlc_object_t *p_this, input_item_t *p_input = NULL ); - virtual ~CoverArtLabel() - { if( p_input ) vlc_gc_decref( p_input ); } + virtual ~CoverArtLabel(); + private: input_item_t *p_input; vlc_object_t *p_this; diff --git a/modules/gui/wxwidgets/dialogs/playlist.cpp b/modules/gui/wxwidgets/dialogs/playlist.cpp index e72387dda8..d819a1924b 100644 --- a/modules/gui/wxwidgets/dialogs/playlist.cpp +++ b/modules/gui/wxwidgets/dialogs/playlist.cpp @@ -1511,7 +1511,7 @@ void Playlist::Preparse() { if( p_popup_item->i_children == -1 ) { - playlist_PreparseEnqueue( p_playlist, p_popup_item->p_input ); + playlist_PreparseEnqueue( p_playlist, p_popup_item->p_input, pl_Unlocked ); } else { diff --git a/src/control/media.c b/src/control/media.c index 0192227e88..34f61aa805 100644 --- a/src/control/media.c +++ b/src/control/media.c @@ -216,7 +216,7 @@ static void preparse_if_needed( libvlc_media_t *p_md ) { playlist_PreparseEnqueue( libvlc_priv (p_md->p_libvlc_instance->p_libvlc_int)->p_playlist, - p_md->p_input_item ); + p_md->p_input_item, pl_Unlocked ); p_md->b_preparsed = true; } } @@ -436,7 +436,7 @@ char * libvlc_media_get_meta( libvlc_media_t *p_md, { playlist_AskForArtEnqueue( libvlc_priv(p_md->p_libvlc_instance->p_libvlc_int)->p_playlist, - p_md->p_input_item ); + p_md->p_input_item, pl_Unlocked ); } /* Should be integrated in core */ diff --git a/src/playlist/control.c b/src/playlist/control.c index 8aa576029b..f340d58bbe 100644 --- a/src/playlist/control.c +++ b/src/playlist/control.c @@ -186,27 +186,27 @@ static int PlaylistVAControl( playlist_t * p_playlist, int i_query, va_list args *****************************************************************************/ /** Enqueue an item for preparsing */ int playlist_PreparseEnqueue( playlist_t *p_playlist, - input_item_t *p_item ) + input_item_t *p_item, bool b_locked ) { playlist_private_t *p_sys = pl_priv(p_playlist); - PL_LOCK; + PL_LOCK_IF( !b_locked ); if( p_sys->p_preparser ) playlist_preparser_Push( p_sys->p_preparser, p_item ); - PL_UNLOCK; + PL_UNLOCK_IF( !b_locked ); return VLC_SUCCESS; } int playlist_AskForArtEnqueue( playlist_t *p_playlist, - input_item_t *p_item ) + input_item_t *p_item, bool b_locked ) { playlist_private_t *p_sys = pl_priv(p_playlist); - PL_LOCK; + PL_LOCK_IF( !b_locked ); if( p_sys->p_fetcher ) playlist_fetcher_Push( p_sys->p_fetcher, p_item ); - PL_UNLOCK; + PL_UNLOCK_IF( !b_locked ); return VLC_SUCCESS; } diff --git a/src/playlist/item.c b/src/playlist/item.c index 28ad321f81..55ed4da0eb 100644 --- a/src/playlist/item.c +++ b/src/playlist/item.c @@ -849,7 +849,7 @@ static void GoAndPreparse( playlist_t *p_playlist, int i_mode, ( i_mode & PLAYLIST_SPREPARSE && ( EMPTY_STR( psz_artist ) || ( EMPTY_STR( psz_album ) ) ) ) ) ) - playlist_PreparseEnqueue( p_playlist, p_item_cat->p_input ); + playlist_PreparseEnqueue( p_playlist, p_item_cat->p_input, pl_Locked ); /* If we already have it, signal it */ else if( !EMPTY_STR( psz_artist ) && !EMPTY_STR( psz_album ) ) input_item_SetPreparsed( p_item_cat->p_input, true ); diff --git a/src/playlist/thread.c b/src/playlist/thread.c index f05bcee572..f7d8dde733 100644 --- a/src/playlist/thread.c +++ b/src/playlist/thread.c @@ -298,7 +298,7 @@ static int PlayItem( playlist_t *p_playlist, playlist_item_t *p_item ) if( !b_has_art || strncmp( psz_arturl, "attachment://", 13 ) ) { PL_DEBUG( "requesting art for %s", psz_name ); - playlist_AskForArtEnqueue( p_playlist, p_input ); + playlist_AskForArtEnqueue( p_playlist, p_input, pl_Locked ); } free( psz_arturl ); free( psz_name ); -- 2.39.2