/** * Destroy the playlist. * * Delete all items in the playlist and free the playlist structure. * \param p_playlist the playlist structure to destroy */ void playlist_Destroy( playlist_t * p_playlist ) { p_playlist->b_die = 1; vlc_thread_join( p_playlist ); var_Destroy( p_playlist, "intf-change" ); var_Destroy( p_playlist, "item-change" ); var_Destroy( p_playlist, "playlist-current" ); var_Destroy( p_playlist, "intf-popmenu" ); var_Destroy( p_playlist, "intf-show" ); var_Destroy( p_playlist, "prevent-skip" ); var_Destroy( p_playlist, "play-and-stop" ); var_Destroy( p_playlist, "random" ); var_Destroy( p_playlist, "repeat" ); var_Destroy( p_playlist, "loop" ); while( p_playlist->i_groups > 0 ) { playlist_DeleteGroup( p_playlist, p_playlist->pp_groups[0]->i_id ); } while( p_playlist->i_size > 0 ) { playlist_Delete( p_playlist, 0 ); } vlc_object_destroy( p_playlist ); }
int playlist_LockDelete( playlist_t * p_playlist, int i_id ) { int i_ret; vlc_mutex_lock( &p_playlist->object_lock ); i_ret = playlist_Delete( p_playlist, i_id ); vlc_mutex_unlock( &p_playlist->object_lock ); return i_ret; }
/** * Clear all playlist items * * \param p_playlist the playlist to be cleared. * \return returns 0 */ int playlist_Clear( playlist_t * p_playlist ) { int i; for( i = p_playlist->i_size; i > 0 ; i-- ) { playlist_Delete( p_playlist, p_playlist->pp_items[0]->input.i_id ); } for( i = 0 ; i< p_playlist->i_views; i++ ) { playlist_ViewEmpty( p_playlist, i, VLC_TRUE ); } return VLC_SUCCESS; }
/** * Clear all playlist items * * \param p_playlist the playlist to be cleared. * \return returns 0 */ int playlist_Clear( playlist_t * p_playlist ) { while( p_playlist->i_groups > 0 ) { playlist_DeleteGroup( p_playlist, p_playlist->pp_groups[0]->i_id ); } while( p_playlist->i_size > 0 ) { playlist_Delete( p_playlist, 0 ); } p_playlist->i_index = -1; p_playlist->i_size = 0; p_playlist->pp_items = NULL; p_playlist->i_groups = 0; p_playlist->pp_groups = NULL; return 0; }
/***************************************************************************** * RunThread: main playlist thread *****************************************************************************/ static void RunThread ( playlist_t *p_playlist ) { vlc_object_t *p_obj; vlc_value_t val; mtime_t i_vout_destroyed_date = 0; mtime_t i_sout_destroyed_date = 0; playlist_item_t *p_autodelete_item = 0; /* Tell above that we're ready */ vlc_thread_ready( p_playlist ); while( !p_playlist->b_die ) { vlc_mutex_lock( &p_playlist->object_lock ); /* If there is an input, check that it doesn't need to die. */ if( p_playlist->p_input ) { /* This input is dead. Remove it ! */ if( p_playlist->p_input->b_dead ) { input_thread_t *p_input; p_input = p_playlist->p_input; p_playlist->p_input = NULL; /* Release the playlist lock, because we may get stuck * in input_DestroyThread() for some time. */ vlc_mutex_unlock( &p_playlist->object_lock ); /* Destroy input */ input_DestroyThread( p_input ); /* Unlink current input * (_after_ input_DestroyThread for vout garbage collector) */ vlc_object_detach( p_input ); /* Destroy object */ vlc_object_destroy( p_input ); i_vout_destroyed_date = 0; i_sout_destroyed_date = 0; /* Check for autodeletion */ if( p_autodelete_item ) { playlist_ItemDelete( p_autodelete_item ); p_autodelete_item = 0; } continue; } /* This input is dying, let him do */ else if( p_playlist->p_input->b_die ) { ; } /* This input has finished, ask him to die ! */ else if( p_playlist->p_input->b_error || p_playlist->p_input->b_eof ) { input_StopThread( p_playlist->p_input ); if( p_playlist->pp_items[p_playlist->i_index]->b_autodeletion ) { /* This ain't pretty but hey it works */ p_autodelete_item = p_playlist->pp_items[p_playlist->i_index]; p_playlist->pp_items[p_playlist->i_index] = playlist_ItemNew( p_playlist, p_autodelete_item->input.psz_uri, 0); vlc_mutex_unlock( &p_playlist->object_lock ); p_playlist->i_status = PLAYLIST_STOPPED; playlist_Delete( p_playlist, p_playlist->i_index ); p_playlist->i_status = PLAYLIST_RUNNING; vlc_mutex_lock( &p_playlist->object_lock ); } SkipItem( p_playlist, 1 ); vlc_mutex_unlock( &p_playlist->object_lock ); continue; } else if( p_playlist->p_input->i_state != INIT_S ) { vlc_mutex_unlock( &p_playlist->object_lock ); i_vout_destroyed_date = ObjectGarbageCollector( p_playlist, VLC_OBJECT_VOUT, i_vout_destroyed_date ); i_sout_destroyed_date = ObjectGarbageCollector( p_playlist, VLC_OBJECT_SOUT, i_sout_destroyed_date ); vlc_mutex_lock( &p_playlist->object_lock ); } } else if( p_playlist->i_status != PLAYLIST_STOPPED ) { /* Start another input. Let's check if that item has * been forced. In that case, we override random (by not skipping) * and play-and-stop */ vlc_bool_t b_forced; var_Get( p_playlist, "prevent-skip", &val ); b_forced = val.b_bool; if( val.b_bool == VLC_FALSE ) { SkipItem( p_playlist, 0 ); } /* Reset forced status */ val.b_bool = VLC_FALSE; var_Set( p_playlist, "prevent-skip", val ); /* Check for play-and-stop */ var_Get( p_playlist, "play-and-stop", &val ); if( val.b_bool == VLC_FALSE || b_forced == VLC_TRUE ) { PlayItem( p_playlist ); } } else if( p_playlist->i_status == PLAYLIST_STOPPED ) { vlc_mutex_unlock( &p_playlist->object_lock ); i_sout_destroyed_date = ObjectGarbageCollector( p_playlist, VLC_OBJECT_SOUT, mdate() ); i_vout_destroyed_date = ObjectGarbageCollector( p_playlist, VLC_OBJECT_VOUT, mdate() ); vlc_mutex_lock( &p_playlist->object_lock ); } vlc_mutex_unlock( &p_playlist->object_lock ); msleep( INTF_IDLE_SLEEP ); } /* If there is an input, kill it */ while( 1 ) { vlc_mutex_lock( &p_playlist->object_lock ); if( p_playlist->p_input == NULL ) { vlc_mutex_unlock( &p_playlist->object_lock ); break; } if( p_playlist->p_input->b_dead ) { input_thread_t *p_input; /* Unlink current input */ p_input = p_playlist->p_input; p_playlist->p_input = NULL; vlc_mutex_unlock( &p_playlist->object_lock ); /* Destroy input */ input_DestroyThread( p_input ); /* Unlink current input (_after_ input_DestroyThread for vout * garbage collector)*/ vlc_object_detach( p_input ); /* Destroy object */ vlc_object_destroy( p_input ); continue; } else if( p_playlist->p_input->b_die ) { /* This input is dying, leave him alone */ ; } else if( p_playlist->p_input->b_error || p_playlist->p_input->b_eof ) { input_StopThread( p_playlist->p_input ); vlc_mutex_unlock( &p_playlist->object_lock ); continue; } else { p_playlist->p_input->b_eof = 1; } vlc_mutex_unlock( &p_playlist->object_lock ); msleep( INTF_IDLE_SLEEP ); } /* close all remaining sout */ while( ( p_obj = vlc_object_find( p_playlist, VLC_OBJECT_SOUT, FIND_CHILD ) ) ) { vlc_object_release( p_obj ); sout_DeleteInstance( (sout_instance_t*)p_obj ); } /* close all remaining vout */ while( ( p_obj = vlc_object_find( p_playlist, VLC_OBJECT_VOUT, FIND_CHILD ) ) ) { vlc_object_detach( p_obj ); vlc_object_release( p_obj ); vout_Destroy( (vout_thread_t *)p_obj ); } }