From 68c9ea1ffaba4d6a45833744e0270db4c7eb0486 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 4 Nov 2009 13:09:50 +0100 Subject: implement iAudioDelay interface also for servicemp3.cpp (media files) no possibility to store this delays persistent.. they are valid until the next reboot or delay change --- lib/dvb/decoder.cpp | 19 +++++++-- lib/dvb/decoder.h | 2 + lib/service/servicemp3.cpp | 97 ++++++++++++++++++++++++++++++++++++++++++---- lib/service/servicemp3.h | 16 ++++++-- 4 files changed, 119 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index 90bf19e1..09350698 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -1048,9 +1048,9 @@ int eTSMPEGDecoder::setState() int eTSMPEGDecoder::m_pcm_delay=-1, eTSMPEGDecoder::m_ac3_delay=-1; -RESULT eTSMPEGDecoder::setPCMDelay(int delay) +RESULT eTSMPEGDecoder::setHwPCMDelay(int delay) { - if (m_decoder == 0 && delay != m_pcm_delay ) + if (delay != m_pcm_delay ) { FILE *fp = fopen("/proc/stb/audio/audio_delay_pcm", "w"); if (fp) @@ -1064,9 +1064,9 @@ RESULT eTSMPEGDecoder::setPCMDelay(int delay) return -1; } -RESULT eTSMPEGDecoder::setAC3Delay(int delay) +RESULT eTSMPEGDecoder::setHwAC3Delay(int delay) { - if ( m_decoder == 0 && delay != m_ac3_delay ) + if ( delay != m_ac3_delay ) { FILE *fp = fopen("/proc/stb/audio/audio_delay_bitstream", "w"); if (fp) @@ -1080,6 +1080,17 @@ RESULT eTSMPEGDecoder::setAC3Delay(int delay) return -1; } + +RESULT eTSMPEGDecoder::setPCMDelay(int delay) +{ + return m_decoder == 0 ? setHwPCMDelay(delay) : -1; +} + +RESULT eTSMPEGDecoder::setAC3Delay(int delay) +{ + return m_decoder == 0 ? setHwAC3Delay(delay) : -1; +} + eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder) : m_demux(demux), m_vpid(-1), m_vtype(-1), m_apid(-1), m_atype(-1), m_pcrpid(-1), m_textpid(-1), diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h index b53638b5..3a0fbac1 100644 --- a/lib/dvb/decoder.h +++ b/lib/dvb/decoder.h @@ -193,6 +193,8 @@ public: int getVideoProgressive(); int getVideoFrameRate(); int getVideoAspect(); + static RESULT setHwPCMDelay(int delay); + static RESULT setHwAC3Delay(int delay); }; #endif diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index e1bf23dd..93d2ec7e 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 #include +#include +#include +#include #include -#include -#include +#include +#include +#include #include #include -#include -#include -#include + +#include + #include #include #include -/* for subtitles */ -#include // eServiceFactoryMP3 @@ -186,6 +189,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) @@ -658,7 +663,6 @@ RESULT eServiceMP3::getName(std::string &name) return 0; } - int eServiceMP3::getInfo(int w) { const gchar *tag = 0; @@ -954,6 +958,12 @@ RESULT eServiceMP3::subtitle(ePtr &ptr) return 0; } +RESULT eServiceMP3::audioDelay(ePtr &ptr) +{ + ptr = this; + return 0; +} + int eServiceMP3::getNumberOfTracks() { return m_audioStreams.size(); @@ -1092,6 +1102,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: { @@ -1578,6 +1590,75 @@ int eServiceMP3::setBufferSize(int size) return 0; } +int eServiceMP3::getAC3Delay() +{ + return ac3_delay; +} + +int eServiceMP3::getPCMDelay() +{ + return pcm_delay; +} + +void eServiceMP3::setAC3Delay(int 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), "audio-sink", &sink, NULL); + + if (!sink) + return; + else { + 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) +{ + 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), "audio-sink", &sink, NULL); + + if (!sink) + return; + else { + 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 diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h index 15ed0b07..985179f6 100644 --- a/lib/service/servicemp3.h +++ b/lib/service/servicemp3.h @@ -49,8 +49,9 @@ typedef enum { atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG, atFL typedef enum { stPlainText, stSSA, stSRT } subtype_t; typedef enum { ctNone, ctMPEGTS, ctMPEGPS, ctMKV, ctAVI, ctMP4, ctVCD, ctCDA } containertype_t; -class eServiceMP3: public iPlayableService, public iPauseableService, - public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, public iSubtitleOutput, public iStreamedService, public Object +class eServiceMP3: public iPlayableService, public iPauseableService, + public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, + public iSubtitleOutput, public iStreamedService, public iAudioDelay, public Object { DECLARE_REF(eServiceMP3); public: @@ -70,13 +71,14 @@ public: RESULT audioTracks(ePtr &ptr); RESULT audioChannel(ePtr &ptr); RESULT subtitle(ePtr &ptr); + RESULT audioDelay(ePtr &ptr); // not implemented (yet) RESULT frontendInfo(ePtr &ptr) { ptr = 0; return -1; } RESULT subServices(ePtr &ptr) { ptr = 0; return -1; } RESULT timeshift(ePtr &ptr) { ptr = 0; return -1; } RESULT cueSheet(ePtr &ptr) { ptr = 0; return -1; } - RESULT audioDelay(ePtr &ptr) { ptr = 0; return -1; } + RESULT rdsDecoder(ePtr &ptr) { ptr = 0; return -1; } RESULT keys(ePtr &ptr) { ptr = 0; return -1; } RESULT stream(ePtr &ptr) { ptr = 0; return -1; } @@ -122,6 +124,12 @@ public: PyObject *getBufferCharge(); int setBufferSize(int size); + // iAudioDelay + int getAC3Delay(); + int getPCMDelay(); + void setAC3Delay(int); + void setPCMDelay(int); + struct audioStream { GstPad* pad; @@ -166,6 +174,8 @@ public: } }; private: + static int pcm_delay; + static int ac3_delay; int m_currentAudioStream; int m_currentSubtitleStream; int selectAudioStream(int i); -- cgit v1.2.3 From 7bed56e8f3e0b12cfabb2a4c21bac85b7cb251b9 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 18 Nov 2009 17:04:20 +0100 Subject: servicedvb.cpp: apply global ac3(bitstream) delay and global pcm(decode) delay on setAC3Delay and setPCMDelay call.. not only on zap --- lib/service/servicedvb.cpp | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 1a28fbdd..6d9cad09 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -2398,17 +2398,8 @@ void eDVBServicePlay::updateDecoder() } } - std::string config_delay; - int config_delay_int = 0; - if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0) - config_delay_int = atoi(config_delay.c_str()); - m_decoder->setAC3Delay(ac3_delay == -1 ? config_delay_int : ac3_delay + config_delay_int); - - if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0) - config_delay_int = atoi(config_delay.c_str()); - else - config_delay_int = 0; - m_decoder->setPCMDelay(pcm_delay == -1 ? config_delay_int : pcm_delay + config_delay_int); + setAC3Delay(ac3_delay == -1 ? 0 : ac3_delay); + setPCMDelay(pcm_delay == -1 ? 0 : pcm_delay); m_decoder->setVideoPID(vpid, vpidtype); selectAudioStream(); @@ -2932,16 +2923,28 @@ void eDVBServicePlay::setAC3Delay(int delay) { if (m_dvb_service) m_dvb_service->setCacheEntry(eDVBService::cAC3DELAY, delay ? delay : -1); - if (m_decoder) - m_decoder->setAC3Delay(delay); + if (m_decoder) { + std::string config_delay; + int config_delay_int = 0; + if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0) + config_delay_int = atoi(config_delay.c_str()); + m_decoder->setAC3Delay(delay + config_delay_int); + } } void eDVBServicePlay::setPCMDelay(int delay) { if (m_dvb_service) m_dvb_service->setCacheEntry(eDVBService::cPCMDELAY, delay ? delay : -1); - if (m_decoder) - m_decoder->setPCMDelay(delay); + if (m_decoder) { + std::string config_delay; + int config_delay_int = 0; + if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0) + config_delay_int = atoi(config_delay.c_str()); + else + config_delay_int = 0; + m_decoder->setPCMDelay(delay + config_delay_int); + } } void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event) -- cgit v1.2.3 From 7b87fdc03b09ee723b91174601f7168a038a9bc4 Mon Sep 17 00:00:00 2001 From: ghost Date: Sun, 22 Nov 2009 22:56:00 +0100 Subject: servicemp3.cpp: temporary store ac3/pcm delay for gstreamer based playbacks (until e2 restart) --- lib/service/servicemp3.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib') diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 93d2ec7e..10a74160 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -1602,6 +1602,7 @@ int eServiceMP3::getPCMDelay() void eServiceMP3::setAC3Delay(int delay) { + ac3_delay = delay; if (!m_gst_playbin || m_state != stRunning) return; else @@ -1629,6 +1630,7 @@ void eServiceMP3::setAC3Delay(int delay) void eServiceMP3::setPCMDelay(int delay) { + pcm_delay = delay; if (!m_gst_playbin || m_state != stRunning) return; else -- cgit v1.2.3 From 9ec56f0aae40fe0c4afb071df436eacf79ac10af Mon Sep 17 00:00:00 2001 From: ghost Date: Sun, 22 Nov 2009 23:10:35 +0100 Subject: servicemp3.cpp: dont apply ac3/pcm delay when no video is running --- lib/service/servicemp3.cpp | 49 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 10a74160..f74bc5ee 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -1608,18 +1608,27 @@ void eServiceMP3::setAC3Delay(int delay) 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); @@ -1636,21 +1645,31 @@ void eServiceMP3::setPCMDelay(int delay) 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 -- cgit v1.2.3