X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fplaylist%2Fengine.c;h=d710b207ad45da0b230fea3ab5e060c20830bfc1;hb=560105460d6436d8fb7270a30c53167d7b10bd6e;hp=376c482a046dcb8c70c2dba636c4799531ac4f10;hpb=18efcf5c6416d6c8b927ea2beef6f3069fac71f4;p=vlc diff --git a/src/playlist/engine.c b/src/playlist/engine.c index 376c482a04..d710b207ad 100644 --- a/src/playlist/engine.c +++ b/src/playlist/engine.c @@ -143,9 +143,11 @@ void playlist_Destroy( playlist_t *p_playlist ) playlist_MLDump( p_playlist ); vlc_thread_join( p_playlist->p_preparse ); + vlc_thread_join( p_playlist->p_secondary_preparse ); vlc_thread_join( p_playlist ); vlc_object_detach( p_playlist->p_preparse ); + vlc_object_detach( p_playlist->p_secondary_preparse ); var_Destroy( p_playlist, "intf-change" ); var_Destroy( p_playlist, "item-change" ); @@ -171,6 +173,7 @@ void playlist_Destroy( playlist_t *p_playlist ) vlc_mutex_destroy( &p_playlist->gc_lock ); vlc_object_destroy( p_playlist->p_preparse ); + vlc_object_destroy( p_playlist->p_secondary_preparse ); vlc_object_detach( p_playlist ); vlc_object_destroy( p_playlist ); @@ -449,7 +452,7 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj ) if( p_obj->i_waiting > 0 ) { - input_item_t *p_current = p_playlist->p_preparse->pp_waiting[0]; + input_item_t *p_current = p_obj->pp_waiting[0]; REMOVE_ELEM( p_obj->pp_waiting, p_obj->i_waiting, 0 ); vlc_mutex_unlock( &p_obj->object_lock ); PL_LOCK; @@ -478,8 +481,19 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj ) { var_SetInteger( p_playlist, "item-change", p_current->i_id ); + } vlc_gc_decref( p_current ); + /* Add to secondary preparse queue */ + PL_LOCK + vlc_mutex_lock( &p_playlist->p_secondary_preparse->object_lock ); + INSERT_ELEM( p_playlist->p_secondary_preparse->pp_waiting, + p_playlist->p_secondary_preparse->i_waiting, + p_playlist->p_secondary_preparse->i_waiting, + p_current ); + vlc_gc_incref( p_current ); + vlc_mutex_unlock( &p_playlist->p_secondary_preparse->object_lock ); + PL_UNLOCK } else { @@ -495,6 +509,34 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj ) vlc_mutex_unlock( &p_obj->object_lock ); } +/** Main loop for secondary preparser queue */ +void playlist_SecondaryPreparseLoop( playlist_preparse_t *p_obj ) +{ + playlist_t *p_playlist = (playlist_t *)p_obj->p_parent; + + vlc_mutex_lock( &p_obj->object_lock ); + + if( p_obj->i_waiting > 0 ) + { + input_item_t *p_current = p_obj->pp_waiting[0]; + REMOVE_ELEM( p_obj->pp_waiting, p_obj->i_waiting, 0 ); + vlc_mutex_unlock( &p_obj->object_lock ); + if( p_current ) + { + input_SecondaryPreparse( p_playlist, p_current ); + var_SetInteger( p_playlist, "item-change", + p_current->i_id ); + vlc_gc_decref( p_current ); + } + else + { + vlc_mutex_unlock( &p_playlist->object_lock ); + } + return; + } + vlc_mutex_unlock( &p_obj->object_lock ); +} + static void VariablesInit( playlist_t *p_playlist ) { vlc_value_t val;