Merge branch 'master' of git.opendreambox.org:/git/enigma2
[enigma2.git] / lib / service / servicemp3.cpp
index 1778e5bba4ecec03bea78de5d44808c98ecd1441..19b7735b2888b7b8cbe9750bbdd30e55da297567 100644 (file)
@@ -27,6 +27,7 @@ eServiceFactoryMP3::eServiceFactoryMP3()
        if (sc)
        {
                std::list<std::string> extensions;
+               extensions.push_back("mp2");
                extensions.push_back("mp3");
                extensions.push_back("ogg");
                extensions.push_back("mpg");
@@ -174,14 +175,13 @@ int eStaticServiceMP3Info::getLength(const eServiceReference &ref)
 
 eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eApp, 1)
 {
+       m_seekTimeout = eTimer::create(eApp);
        m_stream_tags = 0;
-       m_audioStreams.clear();
-       m_subtitleStreams.clear();
        m_currentAudioStream = 0;
        m_currentSubtitleStream = 0;
        m_subtitle_widget = 0;
        m_currentTrickRatio = 0;
-       CONNECT(m_seekTimeout.timeout, eServiceMP3::seekTimeoutCB);
+       CONNECT(m_seekTimeout->timeout, eServiceMP3::seekTimeoutCB);
        CONNECT(m_pump.recv_msg, eServiceMP3::gstPoll);
        GstElement *source = 0;
        
@@ -227,11 +227,29 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp
        if (!m_gst_pipeline)
                m_error_message = "failed to create GStreamer pipeline!\n";
 
-       if ( sourceinfo.containertype == ctCDA )
+       if ( sourceinfo.is_streaming )
+       {
+               eDebug("play webradio!");
+               source = gst_element_factory_make ("neonhttpsrc", "http-source");
+               if (source)
+               {
+                       g_object_set (G_OBJECT (source), "location", filename, NULL);
+                       g_object_set (G_OBJECT (source), "automatic-redirect", TRUE, NULL);
+               }
+               else
+                       m_error_message = "GStreamer plugin neonhttpsrc not available!\n";
+       }
+       else if ( sourceinfo.containertype == ctCDA )
        {
                source = gst_element_factory_make ("cdiocddasrc", "cda-source");
                if (source)
+               {
                        g_object_set (G_OBJECT (source), "device", "/dev/cdroms/cdrom0", NULL);
+                       int track = atoi(filename+18);
+                       eDebug("play audio CD track #%i",track);
+                       if (track > 0)
+                               g_object_set (G_OBJECT (source), "track", track, NULL);
+               }
                else
                        sourceinfo.containertype = ctNone;
        }
@@ -243,21 +261,6 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp
                else
                        m_error_message = "GStreamer can't open filesrc " + (std::string)filename + "!\n";
        }
-       else if ( sourceinfo.is_streaming ) 
-       {
-               source = gst_element_factory_make ("neonhttpsrc", "http-source");
-               if (source)
-                       g_object_set (G_OBJECT (source), "automatic-redirect", TRUE, NULL);
-               else
-                       m_error_message = "GStreamer plugin neonhttpsrc not available!\n";
-       }
-       else
-       { 
-               int track = atoi(filename+18);
-               eDebug("play audio CD track #%i",track);
-               if (track > 0)
-                       g_object_set (G_OBJECT (source), "track", track, NULL);
-       }
        if ( sourceinfo.is_video )
        {
                        /* filesrc -> mpegdemux -> | queue_audio -> dvbaudiosink
@@ -274,31 +277,31 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp
                queue_audio = gst_element_factory_make("queue", "queue_audio");
                queue_video = gst_element_factory_make("queue", "queue_video");
 
-               char demux_type[14];
+               std::string demux_type;
                switch (sourceinfo.containertype)
                {
                        case ctMPEGTS:
-                               strcat(demux_type, "flutsdemux");
+                               demux_type = "flutsdemux";
                                break;
                        case ctMPEGPS:
                        case ctVCD:
-                               strcat(demux_type, "flupsdemux");
+                               demux_type = "flupsdemux";
                                break;
                        case ctMKV:
-                               strcat(demux_type, "matroskademux");
+                               demux_type = "matroskademux";
                                break;
                        case ctAVI:
-                               strcat(demux_type, "avidemux");
+                               demux_type = "avidemux";
                                break;
                        case ctMP4:
-                               strcat(demux_type, "qtdemux");
+                               demux_type = "qtdemux";
                                break;
                        default:
                                break;
                }
-               videodemux = gst_element_factory_make(demux_type, "videodemux");
+               videodemux = gst_element_factory_make(demux_type.c_str(), "videodemux");
                if (!videodemux)
-                       m_error_message = "GStreamer plugin " + (std::string)demux_type + " not available!\n";
+                       m_error_message = "GStreamer plugin " + demux_type + " not available!\n";
 
                switch_audio = gst_element_factory_make ("input-selector", "switch_audio");
                if (!switch_audio)
@@ -527,9 +530,9 @@ RESULT eServiceMP3::setFastForward(int ratio)
 {
        m_currentTrickRatio = ratio;
        if (ratio)
-               m_seekTimeout.start(1000, 0);
+               m_seekTimeout->start(1000, 0);
        else
-               m_seekTimeout.stop();
+               m_seekTimeout->stop();
        return 0;
 }
 
@@ -543,13 +546,13 @@ void eServiceMP3::seekTimeoutCB()
        if (ppos < 0)
        {
                ppos = 0;
-               m_seekTimeout.stop();
+               m_seekTimeout->stop();
        }
        if (ppos > len)
        {
                ppos = 0;
                stop();
-               m_seekTimeout.stop();
+               m_seekTimeout->stop();
                return;
        }
        seekTo(ppos);