/*****************************************************************************
* ncurses.c : NCurses interface for vlc
*****************************************************************************
- * Copyright © 2001-2010 the VideoLAN team
+ * Copyright © 2001-2011 the VideoLAN team
* $Id$
*
* Authors: Sam Hocevar <sam@zoy.org>
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 */
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);
VLC_UNUSED(oval); VLC_UNUSED(nval);
+ 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;
}
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)
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);
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);
if (p_input && !p_input->b_dead)
{
vlc_value_t val;
+ char *psz_path, *psz_uri;
- char *psz_uri = input_item_GetURI(input_GetItem(p_input));
- mvnprintw(y++, 0, COLS, _(" Source : %s"), psz_uri);
+ psz_uri = input_item_GetURI(input_GetItem(p_input));
+ psz_path = make_path(psz_uri);
+
+ mvnprintw(y++, 0, COLS, _(" Source : %s"), psz_path?psz_path:psz_uri);
free(psz_uri);
+ free(psz_path);
var_Get(p_input, "state", &val);
switch(val.i_int)
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':
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;
}
}
else
{
+ vlc_mutex_lock(&p_sys->pl_lock);
p_sys->p_node = p_parent;
+ vlc_mutex_unlock(&p_sys->pl_lock);
p_item = NULL;
}
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;
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;
}
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)
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)
}
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);
}
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);
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]);