From 655374882ca10d6811feeb63f9e8b7029e785299 Mon Sep 17 00:00:00 2001 From: Pierre d'Herbemont Date: Wed, 19 Aug 2009 16:51:54 +0200 Subject: [PATCH] media_list_player: Use stop() so that we don't lock twice. --- src/control/media_list_player.c | 35 ++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/control/media_list_player.c b/src/control/media_list_player.c index 883d4ecb3b..808d1cb445 100644 --- a/src/control/media_list_player.c +++ b/src/control/media_list_player.c @@ -76,6 +76,7 @@ static inline void vlc_assert_locked(vlc_mutex_t *mutex) */ static void next(libvlc_media_list_player_t * p_mlp, libvlc_exception_t * p_e); +static void stop(libvlc_media_list_player_t * p_mlp, libvlc_exception_t * p_e); /* * Private functions @@ -210,15 +211,19 @@ mlist_item_deleted(const libvlc_event_t * p_event, void * p_user_data) { libvlc_media_list_player_t * p_mlp = p_user_data; libvlc_media_list_t * p_emitting_mlist = p_event->p_obj; - libvlc_media_t * p_current_md; - p_current_md = libvlc_media_list_item_at_path(p_mlp->p_mlist, p_mlp->current_playing_item_path); + libvlc_media_t * p_current_md = NULL; + + lock(p_mlp); + if (p_mlp->current_playing_item_path) + p_current_md = libvlc_media_list_item_at_path(p_mlp->p_mlist, p_mlp->current_playing_item_path); if (p_event->u.media_list_item_deleted.item == p_current_md && p_emitting_mlist == p_mlp->p_mlist) { /* We are playing this item, let's stop */ - libvlc_media_list_player_stop(p_mlp, NULL); + stop(p_mlp, NULL); } + unlock(p_mlp); } @@ -296,6 +301,9 @@ set_current_playing_item(libvlc_media_list_player_t * p_mlp, libvlc_media_list_p p_mlp->current_playing_item_path = path; } + if (!path) + return; + libvlc_media_t * p_md; p_md = libvlc_media_list_item_at_path(p_mlp->p_mlist, path); if (!p_md) @@ -508,11 +516,13 @@ void libvlc_media_list_player_play_item(libvlc_media_list_player_t * p_mlp, libv } /************************************************************************** - * Stop (Public) + * Stop (Private) + * + * Lock must be held. **************************************************************************/ -void libvlc_media_list_player_stop(libvlc_media_list_player_t * p_mlp, libvlc_exception_t * p_e) +static void stop(libvlc_media_list_player_t * p_mlp, libvlc_exception_t * p_e) { - lock(p_mlp); + assert_locked(p_mlp); if (p_mlp->p_mi && p_mlp->current_playing_item_path) { @@ -524,11 +534,22 @@ void libvlc_media_list_player_stop(libvlc_media_list_player_t * p_mlp, libvlc_ex free(p_mlp->current_playing_item_path); p_mlp->current_playing_item_path = NULL; +} + +/************************************************************************** + * Stop (Public) + **************************************************************************/ +void libvlc_media_list_player_stop(libvlc_media_list_player_t * p_mlp, libvlc_exception_t * p_e) +{ + lock(p_mlp); + stop(p_mlp, p_e); unlock(p_mlp); } /************************************************************************** * Next (Private) + * + * Lock must be held. **************************************************************************/ static void next(libvlc_media_list_player_t * p_mlp, libvlc_exception_t * p_e) { @@ -554,7 +575,7 @@ static void next(libvlc_media_list_player_t * p_mlp, libvlc_exception_t * p_e) if (!path) { libvlc_media_list_unlock(p_mlp->p_mlist); - libvlc_media_list_player_stop(p_mlp, p_e); + stop(p_mlp, p_e); return; } -- 2.39.2