servicemp3.cpp: dont apply ac3/pcm delay when no video is running
[enigma2.git] / lib / service / servicemp3.cpp
index 62755ad55cb97ebfb73a5ecc59ce87076b30b804..0f604b84e109a4383fe128606a98a005a64f05b0 100644 (file)
@@ -37,6 +37,7 @@ eServiceFactoryMP3::eServiceFactoryMP3()
                extensions.push_back("vob");
                extensions.push_back("wav");
                extensions.push_back("wave");
+               extensions.push_back("m4v");
                extensions.push_back("mkv");
                extensions.push_back("avi");
                extensions.push_back("divx");
@@ -241,7 +242,7 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
                sourceinfo.containertype = ctAVI;
                sourceinfo.is_video = TRUE;
        }
-       else if ( strcasecmp(ext, ".mp4") == 0 || strcasecmp(ext, ".mov") == 0)
+       else if ( strcasecmp(ext, ".mp4") == 0 || strcasecmp(ext, ".mov") == 0 || strcasecmp(ext, ".m4v") == 0)
        {
                sourceinfo.containertype = ctMP4;
                sourceinfo.is_video = TRUE;
@@ -1603,23 +1604,33 @@ int eServiceMP3::getPCMDelay()
 
 void eServiceMP3::setAC3Delay(int delay)
 {
+       ac3_delay = delay;
        if (!m_gst_playbin || m_state != stRunning)
                return;
        else
        {
                GstElement *sink;
-               std::string config_delay;
                int config_delay_int = delay;
-               if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0)
-                       config_delay_int += atoi(config_delay.c_str());
+               g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL);
+
+               if (sink)
+               {
+                       std::string config_delay;
+                       if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0)
+                               config_delay_int += atoi(config_delay.c_str());
+                       gst_object_unref(sink);
+               }
+               else
+               {
+                       eDebug("dont apply ac3 delay when no video is running!");
+                       config_delay_int = 0;
+               }
 
                g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
 
-               if (!sink)
-                       return;
-               else {
+               if (sink)
+               {
                        gchar *name = gst_element_get_name(sink);
-
                        if (strstr(name, "dvbaudiosink"))
                                eTSMPEGDecoder::setHwAC3Delay(config_delay_int);
                        g_free(name);
@@ -1630,26 +1641,37 @@ void eServiceMP3::setAC3Delay(int delay)
 
 void eServiceMP3::setPCMDelay(int delay)
 {
+       pcm_delay = delay;
        if (!m_gst_playbin || m_state != stRunning)
                return;
        else
        {
                GstElement *sink;
-               std::string config_delay;
                int config_delay_int = delay;
-               if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0)
-                       config_delay_int += atoi(config_delay.c_str());
+               g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL);
+
+               if (sink)
+               {
+                       std::string config_delay;
+                       if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0)
+                               config_delay_int += atoi(config_delay.c_str());
+                       gst_object_unref(sink);
+               }
+               else
+               {
+                       eDebug("dont apply pcm delay when no video is running!");
+                       config_delay_int = 0;
+               }
 
                g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
 
-               if (!sink)
-                       return;
-               else {
+               if (sink)
+               {
                        gchar *name = gst_element_get_name(sink);
-
                        if (strstr(name, "dvbaudiosink"))
                                eTSMPEGDecoder::setHwPCMDelay(config_delay_int);
-                       else {
+                       else
+                       {
                                // this is realy untested..and not used yet
                                gint64 offset = config_delay_int;
                                offset *= 1000000; // milli to nano