X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmisc%2Flua%2Flibs%2Fplaylist.c;h=ff65f3e3e27bc6872bf6ebeef9f109ca23f7debc;hb=7ca4e3eb624251feb1f97cfc25104cce473e04a0;hp=5f16040714222167ce4bdd1194324dd3b6dd0ea8;hpb=95addd57388b78fdfb6a58c90437085de8bbbc33;p=vlc diff --git a/modules/misc/lua/libs/playlist.c b/modules/misc/lua/libs/playlist.c index 5f16040714..ff65f3e3e2 100644 --- a/modules/misc/lua/libs/playlist.c +++ b/modules/misc/lua/libs/playlist.c @@ -54,11 +54,16 @@ playlist_t *vlclua_get_playlist_internal( lua_State *L ) return pl_Yield( p_this ); } +void vlclua_release_playlist_internal( playlist_t *p_playlist ) +{ + vlc_object_release( p_playlist ); +} + static int vlclua_playlist_prev( lua_State * L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); playlist_Prev( p_playlist ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 0; } @@ -66,7 +71,7 @@ static int vlclua_playlist_next( lua_State * L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); playlist_Next( p_playlist ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 0; } @@ -75,15 +80,17 @@ static int vlclua_playlist_skip( lua_State * L ) int i_skip = luaL_checkint( L, 1 ); playlist_t *p_playlist = vlclua_get_playlist_internal( L ); playlist_Skip( p_playlist, i_skip ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 0; } static int vlclua_playlist_play( lua_State * L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); + vlc_object_lock( p_playlist ); playlist_Play( p_playlist ); - vlc_object_release( p_playlist ); + vlc_object_unlock( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 0; } @@ -91,7 +98,7 @@ static int vlclua_playlist_pause( lua_State * L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); playlist_Pause( p_playlist ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 0; } @@ -99,7 +106,7 @@ static int vlclua_playlist_stop( lua_State * L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); playlist_Stop( p_playlist ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 0; } @@ -107,8 +114,8 @@ static int vlclua_playlist_clear( lua_State * L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); playlist_Stop( p_playlist ); /* Isn't this already implied by Clear? */ - playlist_Clear( p_playlist, false ); - vlc_object_release( p_playlist ); + playlist_Clear( p_playlist, pl_Unlocked ); + vlclua_release_playlist_internal( p_playlist ); return 0; } @@ -116,7 +123,7 @@ static int vlclua_playlist_repeat( lua_State * L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); int i_ret = vlclua_var_toggle_or_set( L, p_playlist, "repeat" ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return i_ret; } @@ -124,7 +131,7 @@ static int vlclua_playlist_loop( lua_State * L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); int i_ret = vlclua_var_toggle_or_set( L, p_playlist, "loop" ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return i_ret; } @@ -132,7 +139,7 @@ static int vlclua_playlist_random( lua_State * L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); int i_ret = vlclua_var_toggle_or_set( L, p_playlist, "random" ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return i_ret; } @@ -140,11 +147,13 @@ static int vlclua_playlist_goto( lua_State * L ) { int i_id = luaL_checkint( L, 1 ); playlist_t *p_playlist = vlclua_get_playlist_internal( L ); + vlc_object_lock( p_playlist ); int i_ret = playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, true, NULL, playlist_ItemGetById( p_playlist, i_id, true ) ); - vlc_object_release( p_playlist ); + vlc_object_unlock( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return vlclua_push_ret( L, i_ret ); } @@ -155,7 +164,7 @@ static int vlclua_playlist_add( lua_State *L ) playlist_t *p_playlist = vlclua_get_playlist_internal( L ); i_count = vlclua_playlist_add_internal( p_this, L, p_playlist, NULL, true ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); lua_pushinteger( L, i_count ); return 1; } @@ -167,7 +176,7 @@ static int vlclua_playlist_enqueue( lua_State *L ) playlist_t *p_playlist = vlclua_get_playlist_internal( L ); i_count = vlclua_playlist_add_internal( p_this, L, p_playlist, NULL, false ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); lua_pushinteger( L, i_count ); return 1; } @@ -176,7 +185,8 @@ static void push_playlist_item( lua_State *L, playlist_item_t *p_item ); static void push_playlist_item( lua_State *L, playlist_item_t *p_item ) { input_item_t *p_input = p_item->p_input; - int i_flags = p_item->i_flags; + int i_flags = 0; + i_flags = p_item->i_flags; lua_newtable( L ); lua_pushinteger( L, p_item->i_id ); lua_setfield( L, -2, "id" ); @@ -226,6 +236,7 @@ static void push_playlist_item( lua_State *L, playlist_item_t *p_item ) static int vlclua_playlist_get( lua_State *L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); + vlc_object_lock( p_playlist ); int b_category = luaL_optboolean( L, 2, 1 ); /* Default to tree playlist (discared when 1st argument is a playlist_item's id) */ playlist_item_t *p_item = NULL; @@ -235,7 +246,8 @@ static int vlclua_playlist_get( lua_State *L ) p_item = playlist_ItemGetById( p_playlist, i_id, true ); if( !p_item ) { - vlc_object_release( p_playlist ); + vlc_object_unlock( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 0; /* Should we return an error instead? */ } } @@ -268,7 +280,8 @@ static int vlclua_playlist_get( lua_State *L ) } if( !p_item ) { - vlc_object_release( p_playlist ); + vlc_object_unlock( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 0; /* Should we return an error instead? */ } } @@ -279,7 +292,8 @@ static int vlclua_playlist_get( lua_State *L ) : p_playlist->p_root_onelevel; } push_playlist_item( L, p_item ); - vlc_object_release( p_playlist ); + vlc_object_unlock( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 1; } @@ -290,9 +304,11 @@ static int vlclua_playlist_search( lua_State *L ) int b_category = luaL_optboolean( L, 2, 1 ); /* default to category */ playlist_item_t *p_item = b_category ? p_playlist->p_root_category : p_playlist->p_root_onelevel; + vlc_object_lock( p_playlist ); playlist_LiveSearchUpdate( p_playlist, p_item, psz_string ); + vlc_object_unlock( p_playlist ); push_playlist_item( L, p_item ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 1; } @@ -300,7 +316,7 @@ static int vlclua_playlist_current( lua_State *L ) { playlist_t *p_playlist = vlclua_get_playlist_internal( L ); lua_pushinteger( L, var_GetInteger( p_playlist, "playlist-current" ) ); - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 1; } @@ -339,19 +355,20 @@ static int vlclua_playlist_sort( lua_State *L ) int i_type = luaL_optboolean( L, 2, 0 ) ? ORDER_REVERSE : ORDER_NORMAL; int b_category = luaL_optboolean( L, 3, 1 ); /* default to category */ playlist_t *p_playlist = vlclua_get_playlist_internal( L ); + vlc_object_lock( p_playlist ); playlist_item_t *p_root = b_category ? p_playlist->p_local_category : p_playlist->p_local_onelevel; int i_ret = playlist_RecursiveNodeSort( p_playlist, p_root, i_mode, i_type ); - vlc_object_release( p_playlist ); + vlc_object_unlock( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return vlclua_push_ret( L, i_ret ); } /* FIXME: split this in 3 different functions? */ static int vlclua_playlist_status( lua_State *L ) { - intf_thread_t *p_intf = (intf_thread_t *)vlclua_get_this( L ); - playlist_t *p_playlist = pl_Yield( p_intf ); + playlist_t *p_playlist = vlclua_get_playlist_internal( L ); /* int i_count = 0; lua_settop( L, 0 );*/ @@ -362,7 +379,7 @@ static int vlclua_playlist_status( lua_State *L ) lua_pushstring( L, psz_uri ); free( psz_uri ); lua_pushnumber( L, config_GetInt( p_intf, "volume" ) );*/ - vlc_mutex_lock( &p_playlist->object_lock ); + vlc_object_lock( p_playlist ); switch( p_playlist->status.i_status ) { case PLAYLIST_STOPPED: @@ -378,14 +395,14 @@ static int vlclua_playlist_status( lua_State *L ) lua_pushstring( L, "unknown" ); break; } - vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_unlock( p_playlist ); /*i_count += 3;*/ } else { lua_pushstring( L, "stopped" ); } - vlc_object_release( p_playlist ); + vlclua_release_playlist_internal( p_playlist ); return 1; }