servicemp3.cpp: dont apply ac3/pcm delay when no video is running
[enigma2.git] / lib / service / servicemp3.cpp
index c95609a31dde231c498ead998c34a804c9708182..0f604b84e109a4383fe128606a98a005a64f05b0 100644 (file)
@@ -1604,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);
@@ -1631,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