X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fservices_discovery%2Fshout.c;h=4be2f1095d04f95091dc022877ee2c45dabdf148;hb=1a3b1a8f27df60a72615dfc1e18423ab5cf02a5e;hp=b66e9b0777ec1a6ed1d0633e858dc802da03efa7;hpb=12087b5571643095d90eb5ecc1825594d93e31da;p=vlc diff --git a/modules/services_discovery/shout.c b/modules/services_discovery/shout.c index b66e9b0777..4be2f1095d 100644 --- a/modules/services_discovery/shout.c +++ b/modules/services_discovery/shout.c @@ -27,7 +27,12 @@ * Includes *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #include /***************************************************************************** @@ -50,12 +55,12 @@ struct shout_item_t #define endItem( ) { NULL, NULL, { NULL }, NULL } #define item( title, url ) { url, title, { NULL }, NULL } #define itemWithOption( title, url, option ) { url, title, { option, NULL }, NULL } -#define itemWithChildren( title, children ) { "vlc:skip", title, { NULL }, children } +#define itemWithChildren( title, children ) { "vlc://nop", title, { NULL }, children } /* WARN: We support only two levels */ static const struct shout_item_t p_frenchtv_canalplus[] = { - item( N_("Les Guignols"), "http://www.canalplus.fr/index.php?pid=1784" ), + itemWithOption( N_("Les Guignols"), "http://www.canalplus.fr/index.php?pid=1784", "http-forward-cookies" ), endItem() }; @@ -67,7 +72,7 @@ static const struct shout_item_t p_frenchtv[] = { static const struct shout_item_t p_items[] = { item( N_("Shoutcast Radio"), "http/shout-winamp://www.shoutcast.com/sbin/newxml.phtml" ), item( N_("Shoutcast TV"), "http/shout-winamp://www.shoutcast.com/sbin/newtvlister.phtml?alltv=1" ), - itemWithOption ( N_("Freebox TV"), "http://mafreebox.freebox.fr/freeboxtv/playlist.m3u", "m3u-extvlcopt=1" ), + item( N_("Freebox TV"), "http://mafreebox.freebox.fr/freeboxtv/playlist.m3u" ), itemWithChildren(N_("French TV"), p_frenchtv ), endItem() }; @@ -102,28 +107,28 @@ vlc_module_begin(); add_obsolete_integer( "shoutcast-limit" ); set_shortname( "Shoutcast"); - set_description( _("Shoutcast radio listings") ); + set_description( N_("Shoutcast radio listings") ); set_capability( "services_discovery", 0 ); set_callbacks( OpenShoutRadio, Close ); add_shortcut( "shoutcast" ); add_submodule(); set_shortname( "ShoutcastTV" ); - set_description( _("Shoutcast TV listings") ); + set_description( N_("Shoutcast TV listings") ); set_capability( "services_discovery", 0 ); set_callbacks( OpenShoutTV, Close ); add_shortcut( "shoutcasttv" ); add_submodule(); set_shortname( "frenchtv"); - set_description( _("French TV") ); + set_description( N_("French TV") ); set_capability( "services_discovery", 0 ); set_callbacks( OpenFrenchTV, Close ); add_shortcut( "frenchtv" ); add_submodule(); set_shortname( "Freebox"); - set_description( _("Freebox TV listing (French ISP free.fr services)") ); + set_description( N_("Freebox TV listing (French ISP free.fr services)") ); set_capability( "services_discovery", 0 ); set_callbacks( OpenFreebox, Close ); add_shortcut( "freebox" ); @@ -135,8 +140,12 @@ vlc_module_end(); * Local prototypes *****************************************************************************/ -static void Run( services_discovery_t *p_sd ); - +static void *Run( void * ); +struct services_discovery_sys_t +{ + vlc_thread_t thread; + enum type_e i_type; +}; /***************************************************************************** * Open: initialize and create stuff @@ -145,8 +154,17 @@ static int Open( vlc_object_t *p_this, enum type_e i_type ) { services_discovery_t *p_sd = ( services_discovery_t* )p_this; services_discovery_SetLocalizedName( p_sd, _(p_items[i_type].psz_name) ); - p_sd->pf_run = Run; - p_sd->p_sys = (void *)i_type; + + p_sd->p_sys = malloc (sizeof (*(p_sd->p_sys))); + if (p_sd->p_sys == NULL) + return VLC_ENOMEM; + + p_sd->p_sys->i_type = i_type; + if (vlc_clone (&p_sd->p_sys->thread, Run, p_sd, VLC_THREAD_PRIORITY_LOW)) + { + free (p_sd->p_sys); + return VLC_EGENERIC; + } return VLC_SUCCESS; } @@ -169,14 +187,14 @@ static input_item_t * CreateInputItemFromShoutItem( services_discovery_t *p_sd, { int i; /* Create the item */ - input_item_t *p_input = input_ItemNewExt( p_sd, + input_item_t *p_input = input_item_NewExt( p_sd, p_item->psz_url, _(p_item->psz_name), 0, NULL, -1 ); /* Copy options */ for( i = 0; p_item->ppsz_options[i] != NULL; i++ ) - input_ItemAddOption( p_input, p_item->ppsz_options[i] ); - input_ItemAddOption( p_input, "no-playlist-autostart" ); + input_item_AddOption( p_input, p_item->ppsz_options[i] ); + input_item_AddOption( p_input, "no-playlist-autostart" ); return p_input; } @@ -196,7 +214,7 @@ static void AddSubitemsOfShoutItemURL( services_discovery_t *p_sd, /* Read every subitems, and add them in ItemAdded */ vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemAdded, ItemAdded, &category ); - input_Read( p_sd, p_input, VLC_TRUE ); + input_Read( p_sd, p_input, true ); vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemAdded, ItemAdded, &category ); @@ -206,15 +224,19 @@ static void AddSubitemsOfShoutItemURL( services_discovery_t *p_sd, /***************************************************************************** * Run: *****************************************************************************/ -static void Run( services_discovery_t *p_sd ) +static void *Run( void *data ) { - enum type_e i_type = (enum type_e)p_sd->p_sys; + services_discovery_t *p_sd = data; + services_discovery_sys_t *p_sys = p_sd->p_sys; + enum type_e i_type = p_sys->i_type; int i, j; + int canc = vlc_savecancel(); if( !p_items[i_type].p_children ) { AddSubitemsOfShoutItemURL( p_sd, &p_items[i_type], NULL ); - return; + vlc_restorecancel(canc); + return NULL; } for( i = 0; p_items[i_type].p_children[i].psz_name; i++ ) { @@ -233,6 +255,8 @@ static void Run( services_discovery_t *p_sd ) vlc_gc_decref( p_input ); } } + vlc_restorecancel(canc); + return NULL; } /***************************************************************************** @@ -240,4 +264,9 @@ static void Run( services_discovery_t *p_sd ) *****************************************************************************/ 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_join (p_sys->thread, NULL); + free (p_sys); }