diff options
| author | ghost <andreas.monzner@multimedia-labs.de> | 2009-12-22 16:08:24 +0100 |
|---|---|---|
| committer | ghost <andreas.monzner@multimedia-labs.de> | 2009-12-22 16:08:24 +0100 |
| commit | 864bab84ceacbaa2cf2814aa74f1379a0b9c8426 (patch) | |
| tree | 74126a81ce57f9b3ccd6fccd5d2ac5362018a59f /lib/service/servicemp3.cpp | |
| parent | 4e8904ef73e3ce5e275a1f5fbf369c4f9dab648e (diff) | |
| parent | 9ec56f0aae40fe0c4afb071df436eacf79ac10af (diff) | |
| download | enigma2-864bab84ceacbaa2cf2814aa74f1379a0b9c8426.tar.gz enigma2-864bab84ceacbaa2cf2814aa74f1379a0b9c8426.zip | |
Merge branch 'bug_271_ac3pcm_delay_servicemp3'
Diffstat (limited to 'lib/service/servicemp3.cpp')
| -rw-r--r-- | lib/service/servicemp3.cpp | 118 |
1 files changed, 110 insertions, 8 deletions
diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 34d09363..d3eaa262 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -2,20 +2,23 @@ /* note: this requires gstreamer 0.10.x and a big list of plugins. */ /* it's currently hardcoded to use a big-endian alsasink as sink. */ +#include <lib/base/ebase.h> #include <lib/base/eerror.h> +#include <lib/base/init_num.h> +#include <lib/base/init.h> +#include <lib/base/nconfig.h> #include <lib/base/object.h> -#include <lib/base/ebase.h> -#include <string> +#include <lib/dvb/decoder.h> +#include <lib/components/file_eraser.h> +#include <lib/gui/esubtitle.h> #include <lib/service/servicemp3.h> #include <lib/service/service.h> -#include <lib/components/file_eraser.h> -#include <lib/base/init_num.h> -#include <lib/base/init.h> + +#include <string> + #include <gst/gst.h> #include <gst/pbutils/missing-plugins.h> #include <sys/stat.h> -/* for subtitles */ -#include <lib/gui/esubtitle.h> // eServiceFactoryMP3 @@ -187,6 +190,8 @@ int eStaticServiceMP3Info::getLength(const eServiceReference &ref) } // eServiceMP3 +int eServiceMP3::ac3_delay, + eServiceMP3::pcm_delay; eServiceMP3::eServiceMP3(eServiceReference ref) :m_ref(ref), m_pump(eApp, 1) @@ -659,7 +664,6 @@ RESULT eServiceMP3::getName(std::string &name) return 0; } - int eServiceMP3::getInfo(int w) { const gchar *tag = 0; @@ -955,6 +959,12 @@ RESULT eServiceMP3::subtitle(ePtr<iSubtitleOutput> &ptr) return 0; } +RESULT eServiceMP3::audioDelay(ePtr<iAudioDelay> &ptr) +{ + ptr = this; + return 0; +} + int eServiceMP3::getNumberOfTracks() { return m_audioStreams.size(); @@ -1093,6 +1103,8 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) g_object_set (G_OBJECT (sink), "emit-signals", TRUE, NULL); gst_object_unref(sink); } + setAC3Delay(ac3_delay); + setPCMDelay(pcm_delay); } break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: { @@ -1579,6 +1591,96 @@ int eServiceMP3::setBufferSize(int size) return 0; } +int eServiceMP3::getAC3Delay() +{ + return ac3_delay; +} + +int eServiceMP3::getPCMDelay() +{ + return pcm_delay; +} + +void eServiceMP3::setAC3Delay(int delay) +{ + ac3_delay = delay; + if (!m_gst_playbin || m_state != stRunning) + return; + else + { + GstElement *sink; + int config_delay_int = delay; + 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) + { + gchar *name = gst_element_get_name(sink); + if (strstr(name, "dvbaudiosink")) + eTSMPEGDecoder::setHwAC3Delay(config_delay_int); + g_free(name); + gst_object_unref(sink); + } + } +} + +void eServiceMP3::setPCMDelay(int delay) +{ + pcm_delay = delay; + if (!m_gst_playbin || m_state != stRunning) + return; + else + { + GstElement *sink; + int config_delay_int = delay; + 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) + { + gchar *name = gst_element_get_name(sink); + if (strstr(name, "dvbaudiosink")) + eTSMPEGDecoder::setHwPCMDelay(config_delay_int); + else + { + // this is realy untested..and not used yet + gint64 offset = config_delay_int; + offset *= 1000000; // milli to nano + g_object_set (G_OBJECT (m_gst_playbin), "ts-offset", offset, NULL); + } + g_free(name); + gst_object_unref(sink); + } + } +} #else #warning gstreamer not available, not building media player |
