]> git.sesse.net Git - vlc/blobdiff - modules/services_discovery/upnp_intel.cpp
Fix comment.
[vlc] / modules / services_discovery / upnp_intel.cpp
index d745e9b59bdefd9d98d21c88bb331b62e6633d7f..0f0cbbd776b71e9ca318d649c35476ee25891d9b 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
- * Upnp_intell.cpp :  UPnP discovery module (Intel SDK)
+ * Upnp_intel.cpp :  UPnP discovery module (Intel SDK)
  *****************************************************************************
- * Copyright (C) 2004-2006 the VideoLAN team
+ * Copyright (C) 2004-2008 the VideoLAN team
  * $Id$
  *
  * Authors: RĂ©mi Denis-Courmont <rem # videolan.org> (original plugin)
@@ -42,7 +42,8 @@
 # include "config.h"
 #endif
 
-#include <vlc/vlc.h>
+#include <vlc_common.h>
+#include <vlc_plugin.h>
 #include <vlc_playlist.h>
 
 
@@ -50,6 +51,7 @@
 
 struct services_discovery_sys_t
 {
+    playlist_t *p_playlist;
     playlist_item_t *p_node_cat;
     playlist_item_t *p_node_one;
 };
@@ -254,12 +256,16 @@ private:
 static int Open( vlc_object_t* );
 static void Close( vlc_object_t* );
 static void Run( services_discovery_t *p_sd );
+static playlist_t *pl_Get( services_discovery_t *p_sd )
+{
+    return p_sd->p_sys->p_playlist;
+}
 
 // Module descriptor
 
 vlc_module_begin();
 set_shortname( "UPnP" );
-set_description( _( "Universal Plug'n'Play discovery ( Intel SDK )" ) );
+set_description( N_( "Universal Plug'n'Play discovery ( Intel SDK )" ) );
 set_category( CAT_PLAYLIST );
 set_subcategory( SUBCAT_PLAYLIST_SD );
 set_capability( "services_discovery", 0 );
@@ -286,11 +292,14 @@ static int Open( vlc_object_t *p_this )
 
     p_sd->pf_run = Run;
     p_sd->p_sys = p_sys;
+    p_sys->p_playlist = pl_Yield( p_sd );
 
     /* Create our playlist node */
+    vlc_object_lock( p_sys->p_playlist );
     playlist_NodesPairCreate( pl_Get( p_sd ), _("Devices"),
                               &p_sys->p_node_cat, &p_sys->p_node_one,
                               true );
+    vlc_object_unlock( p_sys->p_playlist );
 
     return VLC_SUCCESS;
 }
@@ -300,11 +309,13 @@ static void Close( vlc_object_t *p_this )
     services_discovery_t *p_sd = ( services_discovery_t* )p_this;
     services_discovery_sys_t *p_sys = p_sd->p_sys;
 
+    vlc_object_lock( p_sys->p_playlist );
     playlist_NodeDelete( pl_Get( p_sd ), p_sys->p_node_one, true,
                          true );
     playlist_NodeDelete( pl_Get( p_sd ), p_sys->p_node_cat, true,
                          true );
-
+    vlc_object_unlock( p_sys->p_playlist );
+    pl_Release( p_sd );
     free( p_sys );
 }
 
@@ -340,7 +351,7 @@ static void Run( services_discovery_t* p_sd )
     }
 
     msg_Dbg( p_sd, "UPnP discovery started" );
-    while( !p_sd->b_die )
+    while( vlc_object_alive (p_sd) )
     {
         msleep( 500 );
     }
@@ -620,8 +631,10 @@ MediaServer::~MediaServer()
 {
     if ( _contents )
     {
+        vlc_object_lock( _cookie->serviceDiscovery->p_sys->p_playlist );
         playlist_NodeDelete( pl_Get( _cookie->serviceDiscovery ) ,
                              _playlistNode, true, true );
+        vlc_object_unlock( _cookie->serviceDiscovery->p_sys->p_playlist );
     }
 
     delete _contents;
@@ -874,7 +887,7 @@ void MediaServer::_buildPlaylist( Container* parent )
         /* FIXME: playlist_AddInput() can fail */
         playlist_BothAddInput( p_playlist, p_input, parentNode,
                                PLAYLIST_APPEND, PLAYLIST_END, &i_cat, NULL,
-                               false );
+                               pl_Unlocked );
         vlc_gc_decref( p_input );
         /* TODO: do this better by storing ids */
         playlist_item_t *p_node = playlist_ItemGetById( p_playlist, i_cat, false );
@@ -918,9 +931,12 @@ bool MediaServerList::addServer( MediaServer* s )
     _list.push_back( s );
 
     char* name = strdup( s->getFriendlyName() );
-    playlist_item_t* node = playlist_NodeCreate( pl_Get( _cookie->serviceDiscovery ),
-                                                 name,
-                                          _cookie->serviceDiscovery->p_sys->p_node_cat, 0, NULL );
+    vlc_object_lock( _cookie->serviceDiscovery->p_sys->p_playlist );
+    playlist_item_t* node = playlist_NodeCreate(
+                                pl_Get( _cookie->serviceDiscovery ), name,
+                                _cookie->serviceDiscovery->p_sys->p_node_cat,
+                                0, NULL );
+    vlc_object_unlock( _cookie->serviceDiscovery->p_sys->p_playlist );
     free( name );
     s->setPlaylistNode( node );