vlc | branch: master | Rafaël Carré <[email protected]> | Mon May 30 23:31:56 2011 -0400| [7da5f011b79440badc677a1be2eb64e8911c431b] | committer: Rafaël Carré
ncurses: make sure playlist box shows title when available Also protect concurrent access to p_sys between main thread and libvlc callbacks fixes: #4827 > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7da5f011b79440badc677a1be2eb64e8911c431b --- modules/gui/ncurses.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 45 insertions(+), 3 deletions(-) diff --git a/modules/gui/ncurses.c b/modules/gui/ncurses.c index 0674f6e..5dbdb25 100644 --- a/modules/gui/ncurses.c +++ b/modules/gui/ncurses.c @@ -1,7 +1,7 @@ /***************************************************************************** * ncurses.c : NCurses interface for vlc ***************************************************************************** - * Copyright © 2001-2010 the VideoLAN team + * Copyright © 2001-2011 the VideoLAN team * $Id$ * * Authors: Sam Hocevar <[email protected]> @@ -214,6 +214,7 @@ struct intf_sys_t struct pl_item_t **pp_plist; int i_plist_entries; bool b_need_update; + vlc_mutex_t pl_lock; bool b_plidx_follow; playlist_item_t *p_node; /* current node */ @@ -447,7 +448,7 @@ static void PlaylistRebuild(intf_thread_t *p_intf) PL_UNLOCK; } -static int PlaylistChanged(vlc_object_t *p_this, const char *psz_variable, +static int ItemChanged(vlc_object_t *p_this, const char *psz_variable, vlc_value_t oval, vlc_value_t nval, void *param) { VLC_UNUSED(p_this); VLC_UNUSED(psz_variable); @@ -455,10 +456,27 @@ static int PlaylistChanged(vlc_object_t *p_this, const char *psz_variable, intf_thread_t *p_intf = (intf_thread_t *)param; intf_sys_t *p_sys = p_intf->p_sys; + + vlc_mutex_lock(&p_sys->pl_lock); + p_sys->b_need_update = true; + vlc_mutex_unlock(&p_sys->pl_lock); + + return VLC_SUCCESS; +} + +static int PlaylistChanged(vlc_object_t *p_this, const char *psz_variable, + vlc_value_t oval, vlc_value_t nval, void *param) +{ + VLC_UNUSED(p_this); VLC_UNUSED(psz_variable); + VLC_UNUSED(oval); VLC_UNUSED(nval); + intf_thread_t *p_intf = (intf_thread_t *)param; + intf_sys_t *p_sys = p_intf->p_sys; playlist_item_t *p_node = playlist_CurrentPlayingItem(pl_Get(p_intf)); + vlc_mutex_lock(&p_sys->pl_lock); p_sys->b_need_update = true; p_sys->p_node = p_node ? p_node->p_parent : NULL; + vlc_mutex_unlock(&p_sys->pl_lock); return VLC_SUCCESS; } @@ -506,8 +524,12 @@ static inline bool IsIndex(intf_sys_t *p_sys, playlist_t *p_playlist, int i) PL_ASSERT_LOCKED; - if (p_item->i_children == 0 && p_item == p_sys->p_node) + vlc_mutex_lock(&p_sys->pl_lock); + if (p_item->i_children == 0 && p_item == p_sys->p_node) { + vlc_mutex_unlock(&p_sys->pl_lock); return true; + } + vlc_mutex_unlock(&p_sys->pl_lock); p_played_item = playlist_CurrentPlayingItem(p_playlist); if (p_played_item && p_item->p_input && p_played_item->p_input) @@ -996,11 +1018,13 @@ static int DrawPlaylist(intf_thread_t *p_intf) intf_sys_t *p_sys = p_intf->p_sys; playlist_t *p_playlist = pl_Get(p_intf); + vlc_mutex_lock(&p_sys->pl_lock); if (p_sys->b_need_update) { PlaylistRebuild(p_intf); p_sys->b_need_update = false; } + vlc_mutex_unlock(&p_sys->pl_lock); if (p_sys->b_plidx_follow) FindIndex(p_sys, p_playlist); @@ -1010,7 +1034,9 @@ static int DrawPlaylist(intf_thread_t *p_intf) char c; playlist_item_t *p_current_item; playlist_item_t *p_item = p_sys->pp_plist[i]->p_item; + vlc_mutex_lock(&p_sys->pl_lock); playlist_item_t *p_node = p_sys->p_node; + vlc_mutex_unlock(&p_sys->pl_lock); PL_LOCK; assert(p_item); @@ -1364,7 +1390,9 @@ static bool HandlePlaylistKey(intf_thread_t *p_intf, int key) playlist_RecursiveNodeSort(p_playlist, p_playlist->p_root_onelevel, SORT_TITLE_NODES_FIRST, (key == 'o')? ORDER_NORMAL : ORDER_REVERSE); + vlc_mutex_lock(&p_sys->pl_lock); p_sys->b_need_update = true; + vlc_mutex_unlock(&p_sys->pl_lock); return true; case 'g': @@ -1386,7 +1414,9 @@ static bool HandlePlaylistKey(intf_thread_t *p_intf, int key) else playlist_NodeDelete(p_playlist, p_item, true , false); PL_UNLOCK; + vlc_mutex_lock(&p_sys->pl_lock); p_sys->b_need_update = true; + vlc_mutex_unlock(&p_sys->pl_lock); return true; } @@ -1408,7 +1438,9 @@ static bool HandlePlaylistKey(intf_thread_t *p_intf, int key) } else { + vlc_mutex_lock(&p_sys->pl_lock); p_sys->p_node = p_parent; + vlc_mutex_unlock(&p_sys->pl_lock); p_item = NULL; } @@ -1418,7 +1450,9 @@ static bool HandlePlaylistKey(intf_thread_t *p_intf, int key) else { /* We only want to set the current node */ playlist_Stop(p_playlist); + vlc_mutex_lock(&p_sys->pl_lock); p_sys->p_node = p_pl_item->p_item; + vlc_mutex_unlock(&p_sys->pl_lock); } p_sys->b_plidx_follow = true; @@ -1468,7 +1502,9 @@ static bool HandleBrowseKey(intf_thread_t *p_intf, int key) return true; playlist_t *p_playlist = pl_Get(p_intf); + vlc_mutex_lock(&p_sys->pl_lock); playlist_item_t *p_parent = p_sys->p_node; + vlc_mutex_unlock(&p_sys->pl_lock); if (!p_parent) { playlist_item_t *p_item; @@ -1529,7 +1565,9 @@ static void HandleEditBoxKey(intf_thread_t *p_intf, int key, int box) } playlist_t *p_playlist = pl_Get(p_intf); + vlc_mutex_lock(&p_sys->pl_lock); playlist_item_t *p_parent = p_sys->p_node, *p_current; + vlc_mutex_unlock(&p_sys->pl_lock); PL_LOCK; if (!p_parent) @@ -1820,6 +1858,7 @@ static void Run(intf_thread_t *p_intf) int canc = vlc_savecancel(); var_AddCallback(p_playlist, "intf-change", PlaylistChanged, p_intf); + var_AddCallback(p_playlist, "item-change", ItemChanged, p_intf); var_AddCallback(p_playlist, "playlist-item-append", PlaylistChanged, p_intf); while (vlc_object_alive(p_intf) && !p_sys->b_exit) @@ -1830,6 +1869,7 @@ static void Run(intf_thread_t *p_intf) } var_DelCallback(p_playlist, "intf-change", PlaylistChanged, p_intf); + var_DelCallback(p_playlist, "item-change", ItemChanged, p_intf); var_DelCallback(p_playlist, "playlist-item-append", PlaylistChanged, p_intf); vlc_restorecancel(canc); } @@ -1855,6 +1895,7 @@ static int Open(vlc_object_t *p_this) msg_cb_data->p_sys = p_sys; vlc_mutex_init(&p_sys->msg_lock); + vlc_mutex_init(&p_sys->pl_lock); p_sys->i_msgs = 0; memset(p_sys->msgs, 0, sizeof p_sys->msgs); p_sys->p_sub = msg_Subscribe(p_intf->p_libvlc, MsgCallback, msg_cb_data); @@ -1916,6 +1957,7 @@ static void Close(vlc_object_t *p_this) msg_Unsubscribe(p_sys->p_sub); vlc_mutex_destroy(&p_sys->msg_lock); + vlc_mutex_destroy(&p_sys->pl_lock); for(unsigned i = 0; i < sizeof p_sys->msgs / sizeof *p_sys->msgs; i++) if (p_sys->msgs[i]) msg_Free(p_sys->msgs[i]); _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
