+void playlist_Activate( playlist_t *p_playlist )
+{
+ /* */
+ playlist_private_t *p_sys = pl_priv(p_playlist);
+
+ /* Fetcher */
+ p_sys->p_fetcher = playlist_fetcher_New( p_playlist );
+ if( !p_sys->p_fetcher )
+ msg_Err( p_playlist, "cannot create playlist fetcher" );
+
+ /* Preparse */
+ p_sys->p_preparser = playlist_preparser_New( p_playlist, p_sys->p_fetcher );
+ if( !p_sys->p_preparser )
+ msg_Err( p_playlist, "cannot create playlist preparser" );
+
+ /* Start the playlist thread */
+ if( vlc_clone( &p_sys->thread, Thread, p_playlist,
+ VLC_THREAD_PRIORITY_LOW ) )
+ {
+ msg_Err( p_playlist, "cannot spawn playlist thread" );
+ }
+ msg_Dbg( p_playlist, "Activated" );
+}
+
+void playlist_Deactivate( playlist_t *p_playlist )
+{
+ /* */
+ playlist_private_t *p_sys = pl_priv(p_playlist);
+
+ msg_Dbg( p_playlist, "Deactivate" );
+
+ PL_LOCK;
+ vlc_object_kill( p_playlist );
+ vlc_cond_signal( &p_sys->signal );
+ PL_UNLOCK;
+
+ vlc_join( p_sys->thread, NULL );
+ assert( !p_sys->p_input );
+
+ PL_LOCK;
+ playlist_preparser_t *p_preparser = p_sys->p_preparser;
+ playlist_fetcher_t *p_fetcher = p_sys->p_fetcher;
+
+ p_sys->p_preparser = NULL;
+ p_sys->p_fetcher = NULL;
+ PL_UNLOCK;
+
+ if( p_preparser )
+ playlist_preparser_Delete( p_preparser );
+ if( p_fetcher )
+ playlist_fetcher_Delete( p_fetcher );
+
+ /* release input resources */
+ if( p_sys->p_input_resource )
+ input_resource_Delete( p_sys->p_input_resource );
+ p_sys->p_input_resource = NULL;
+
+ if( var_InheritBool( p_playlist, "media-library" ) )
+ playlist_MLDump( p_playlist );
+
+ PL_LOCK;
+
+ /* Release the current node */
+ set_current_status_node( p_playlist, NULL );
+
+ /* Release the current item */
+ set_current_status_item( p_playlist, NULL );
+
+ PL_UNLOCK;
+
+ msg_Dbg( p_playlist, "Deactivated" );
+}
+
+/* */
+
+/* Input Callback */
+static int InputEvent( vlc_object_t *p_this, char const *psz_cmd,
+ vlc_value_t oldval, vlc_value_t newval, void *p_data )