]> git.sesse.net Git - vlc/commitdiff
freebox: Bring back freebox SD in C.
authorPierre d'Herbemont <pdherbemont@free.fr>
Mon, 15 Feb 2010 16:47:40 +0000 (17:47 +0100)
committerPierre d'Herbemont <pdherbemont@free.fr>
Mon, 15 Feb 2010 16:47:40 +0000 (17:47 +0100)
lua version doesn't support adding subitems and passing the option over to subitems.
One day the lua libs will be ready to offer feature parity for luafreebox and
this one will be able to go away. But not yet.

modules/misc/lua/vlc.c
modules/services_discovery/Modules.am
modules/services_discovery/freebox.c [new file with mode: 0644]

index 9084739a37d31ba2f8830c38d1bd44bda4aa95ee..7d9dae3bb03c4a1d64ec097b67d4d60d1e669e98 100644 (file)
@@ -126,7 +126,7 @@ vlc_module_begin ()
 
     add_submodule ()
         set_description( N_("Freebox TV") )
-        add_shortcut( "freebox" )
+        add_shortcut( "luafreebox" )
         set_capability( "services_discovery", 0 )
         set_callbacks( Open_LuaSD, Close_LuaSD )
 
index bb603292f841b24612e2faeaf401f51c5506f400..33f186691a513f95e75d43d18c8ae157018b68cc 100644 (file)
@@ -1,3 +1,4 @@
+SOURCES_freebox = freebox.c
 SOURCES_sap = sap.c
 SOURCES_upnp_cc = upnp_cc.cpp
 SOURCES_upnp_intel = upnp_intel.cpp upnp_intel.hpp
@@ -19,5 +20,6 @@ EXTRA_LTLIBRARIES += \
 libvlc_LTLIBRARIES += \
        libmediadirs_plugin.la \
        libpodcast_plugin.la \
+       libfreebox_plugin.la \
        libsap_plugin.la \
        $(LTLIBxcb_apps)
diff --git a/modules/services_discovery/freebox.c b/modules/services_discovery/freebox.c
new file mode 100644 (file)
index 0000000..7619aeb
--- /dev/null
@@ -0,0 +1,141 @@
+/*****************************************************************************
+ * freebox.c:  Shoutcast services discovery module
+ *****************************************************************************
+ * Copyright (C) 2005-2007 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Sigmund Augdal Helberg <dnumgis@videolan.org>
+ *          Antoine Cellerier <dionoea -@T- videolan -d.t- org>
+ *          Pierre d'Herbemont <pdherbemont # videolan.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Includes
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_services_discovery.h>
+
+/*****************************************************************************
+ * Module descriptor
+ *****************************************************************************/
+
+static int  Open( vlc_object_t * );
+static void Close( vlc_object_t * );
+
+static int vlc_sd_probe_Open( vlc_object_t * );
+
+vlc_module_begin ()
+    set_category( CAT_PLAYLIST )
+    set_subcategory( SUBCAT_PLAYLIST_SD )
+
+    set_shortname( "Freebox")
+    set_description( N_("Freebox TV") )
+    set_capability( "services_discovery", 0 )
+    set_callbacks( Open, Close )
+    add_shortcut( "freebox" )
+
+    VLC_SD_PROBE_SUBMODULE
+vlc_module_end ()
+
+
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
+
+static void *Run( void * );
+struct services_discovery_sys_t
+{
+    vlc_thread_t thread;
+};
+
+/*****************************************************************************
+ * Open: initialize and create stuff
+ *****************************************************************************/
+static int Open(vlc_object_t *this)
+{
+    services_discovery_t *sd = (services_discovery_t *)this;
+    sd->p_sys = malloc(sizeof(*(sd->p_sys)));
+    if (sd->p_sys == NULL)
+        return VLC_ENOMEM;
+
+    if (vlc_clone(&sd->p_sys->thread, Run, sd, VLC_THREAD_PRIORITY_LOW))
+    {
+        free(sd->p_sys);
+        return VLC_EGENERIC;
+    }
+    return VLC_SUCCESS;
+}
+
+/*****************************************************************************
+ * ItemAdded:
+ *****************************************************************************/
+static void ItemAdded(const vlc_event_t * event, void *user_data)
+{
+    services_discovery_t *sd = user_data;
+    input_item_t *child = event->u.input_item_subitem_added.p_new_child;
+    input_item_AddOption(child, "deinterlace=1", VLC_INPUT_OPTION_TRUSTED);
+    services_discovery_AddItem(sd, child, NULL);
+}
+
+
+/*****************************************************************************
+ * Run:
+ *****************************************************************************/
+static void *Run(void *data)
+{
+    services_discovery_t *sd = data;
+    int canc = vlc_savecancel();
+
+    const char * const name = "Freebox TV";
+    const char * const url = "http://mafreebox.freebox.fr/freeboxtv/playlist.m3u";
+    input_item_t *input = input_item_New(sd, url, vlc_gettext(name));
+    input_item_AddOption(input, "no-playlist-autostart", VLC_INPUT_OPTION_TRUSTED);
+
+    /* Read every subitems, and add them in ItemAdded */
+    vlc_event_manager_t *em = &input->event_manager;
+    vlc_event_attach(em, vlc_InputItemSubItemAdded, ItemAdded, sd);
+    input_Read(sd, input);
+    vlc_event_detach(em, vlc_InputItemSubItemAdded, ItemAdded, sd);
+
+    vlc_gc_decref(input);
+
+    vlc_restorecancel(canc);
+    return NULL;
+}
+
+/*****************************************************************************
+ * Close:
+ *****************************************************************************/
+static void Close(vlc_object_t *this)
+{
+    services_discovery_t *sd = (services_discovery_t *)this;
+    services_discovery_sys_t *sys = sd->p_sys;
+    vlc_join(sys->thread, NULL);
+    free(sys);
+}
+
+static int vlc_sd_probe_Open(vlc_object_t *obj)
+{
+    VLC_UNUSED(obj);
+    return VLC_PROBE_CONTINUE;
+}