From: ghost Date: Thu, 5 Nov 2009 10:44:56 +0000 (+0100) Subject: Merge branch 'bug_274_disable_fast_winding_for_non_ts' into experimental X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=da5e581c17f5e19d38c31d8b2c01b29fdd37fe78;hp=-c Merge branch 'bug_274_disable_fast_winding_for_non_ts' into experimental --- da5e581c17f5e19d38c31d8b2c01b29fdd37fe78 diff --combined lib/python/Screens/InfoBarGenerics.py index b98cd46,67bd263..df85321 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@@ -10,7 -10,6 +10,7 @@@ from Components.ServiceEventTracker imp from Components.Sources.Boolean import Boolean from Components.config import config, ConfigBoolean, ConfigClock from Components.SystemInfo import SystemInfo +from Components.UsageConfig import preferredInstantRecordPath, defaultMoviePath from EpgSelection import EPGSelection from Plugins.Plugin import PluginDescriptor @@@ -29,7 -28,7 +29,7 @@@ from Screens.TimeDateInput import TimeD from ServiceReference import ServiceReference from Tools import Notifications -from Tools.Directories import SCOPE_HDD, resolveFilename, fileExists +from Tools.Directories import fileExists from enigma import eTimer, eServiceCenter, eDVBServicePMTHandler, iServiceInformation, \ iPlayableService, eServiceReference, eEPGCache @@@ -691,7 -690,10 +691,8 @@@ class InfoBarSeek iPlayableService.evEOF: self.__evEOF, iPlayableService.evSOF: self.__evSOF, }) + self.fast_winding_hint_message_showed = False - self.minSpeedBackward = useSeekBackHack and 16 or 0 - class InfoBarSeekActionMap(HelpableActionMap): def __init__(self, screen, *args, **kwargs): HelpableActionMap.__init__(self, screen, *args, **kwargs) @@@ -738,19 -740,24 +739,19 @@@ self.__seekableStatusChanged() def makeStateForward(self, n): - minspeed = config.seek.stepwise_minspeed.value - repeat = int(config.seek.stepwise_repeat.value) - if minspeed != "Never" and n >= int(minspeed) and repeat > 1: - return (0, n * repeat, repeat, ">> %dx" % n) - else: +# minspeed = config.seek.stepwise_minspeed.value +# repeat = int(config.seek.stepwise_repeat.value) +# if minspeed != "Never" and n >= int(minspeed) and repeat > 1: +# return (0, n * repeat, repeat, ">> %dx" % n) +# else: return (0, n, 0, ">> %dx" % n) def makeStateBackward(self, n): - minspeed = config.seek.stepwise_minspeed.value - repeat = int(config.seek.stepwise_repeat.value) - if self.minSpeedBackward and n < self.minSpeedBackward: - r = (self.minSpeedBackward - 1)/ n + 1 - if minspeed != "Never" and n >= int(minspeed) and repeat > 1: - r = max(r, repeat) - return (0, -n * r, r, "<< %dx" % n) - elif minspeed != "Never" and n >= int(minspeed) and repeat > 1: - return (0, -n * repeat, repeat, "<< %dx" % n) - else: +# minspeed = config.seek.stepwise_minspeed.value +# repeat = int(config.seek.stepwise_repeat.value) +# if minspeed != "Never" and n >= int(minspeed) and repeat > 1: +# return (0, -n * repeat, repeat, "<< %dx" % n) +# else: return (0, -n, 0, "<< %dx" % n) def makeStateSlowMotion(self, n): @@@ -817,6 -824,7 +818,7 @@@ # print "seekable" def __serviceStarted(self): + self.fast_winding_hint_message_showed = False self.seekstate = self.SEEK_STATE_PLAY self.__seekableStatusChanged() @@@ -870,7 -878,7 +872,7 @@@ if config.seek.on_pause.value == "play": self.unPauseService() elif config.seek.on_pause.value == "step": - self.doSeekRelative(0) + self.doSeekRelative(1) elif config.seek.on_pause.value == "last": self.setSeekState(self.lastseekstate) self.lastseekstate = self.SEEK_STATE_PLAY @@@ -907,6 -915,12 +909,12 @@@ self.showAfterSeek() def seekFwd(self): + seek = self.getSeek() + if seek and not (seek.isCurrentlySeekable() & 2): + if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1): + self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10) + self.fast_winding_hint_message_showed = True + return if self.seekstate == self.SEEK_STATE_PLAY: self.setSeekState(self.makeStateForward(int(config.seek.enter_forward.value))) elif self.seekstate == self.SEEK_STATE_PAUSE: @@@ -936,6 -950,12 +944,12 @@@ self.setSeekState(self.makeStateSlowMotion(speed)) def seekBack(self): + seek = self.getSeek() + if seek and not (seek.isCurrentlySeekable() & 2): + if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1): + self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10) + self.fast_winding_hint_message_showed = True + return seekstate = self.seekstate if seekstate == self.SEEK_STATE_PLAY: self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value))) @@@ -943,7 -963,7 +957,7 @@@ self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value))) self.doSeekRelative(-6) elif seekstate == self.SEEK_STATE_PAUSE: - self.doSeekRelative(-3) + self.doSeekRelative(-1) elif self.isStateForward(seekstate): speed = seekstate[1] if seekstate[2]: @@@ -1478,7 -1498,7 +1492,7 @@@ class InfoBarInstantRecord if isinstance(serviceref, eServiceReference): serviceref = ServiceReference(serviceref) - recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = config.movielist.last_videodir.value) + recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = preferredInstantRecordPath()) recording.dontSave = True if event is None or limitEvent == False: @@@ -1579,9 -1599,9 +1593,9 @@@ self.session.nav.RecordTimer.timeChanged(entry) def instantRecord(self): - dir = config.movielist.last_videodir.value - if not fileExists(dir, 'w'): - dir = resolveFilename(SCOPE_HDD) + dir = preferredInstantRecordPath() + if not dir or not fileExists(dir, 'w'): + dir = defaultMoviePath() try: stat = os_stat(dir) except: diff --combined lib/service/servicemp3.cpp index c95609a,e684e39..52f2bc9 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@@ -2,23 -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 @@@ -46,7 -43,6 +46,7 @@@ eServiceFactoryMP3::eServiceFactoryMP3( extensions.push_back("mp4"); extensions.push_back("mov"); extensions.push_back("m4a"); + extensions.push_back("m2ts"); sc->addServiceFactory(eServiceFactoryMP3::id, this, extensions); } @@@ -191,8 -187,6 +191,8 @@@ int eStaticServiceMP3Info::getLength(co } // eServiceMP3 +int eServiceMP3::ac3_delay, + eServiceMP3::pcm_delay; eServiceMP3::eServiceMP3(eServiceReference ref) :m_ref(ref), m_pump(eApp, 1) @@@ -641,7 -635,31 +641,31 @@@ RESULT eServiceMP3::setTrickmode(int tr RESULT eServiceMP3::isCurrentlySeekable() { - return 1; + int ret = 3; // seeking and fast/slow winding possible + GstElement *sink; + + if (!m_gst_playbin) + return 0; + if (m_state != stRunning) + return 0; + + g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL); + + // disable fast winding yet when a dvbvideosink or dvbaudiosink is used + // for this we must do some changes on different places.. (gstreamer.. our sinks.. enigma2) + if (sink) { + ret &= ~2; // only seeking possible + gst_object_unref(sink); + } + else { + g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL); + if (sink) { + ret &= ~2; // only seeking possible + gst_object_unref(sink); + } + } + + return ret; } RESULT eServiceMP3::info(ePtr&i) @@@ -665,6 -683,7 +689,6 @@@ RESULT eServiceMP3::getName(std::strin return 0; } - int eServiceMP3::getInfo(int w) { const gchar *tag = 0; @@@ -960,12 -979,6 +984,12 @@@ RESULT eServiceMP3::subtitle(ePtr &ptr) +{ + ptr = this; + return 0; +} + int eServiceMP3::getNumberOfTracks() { return m_audioStreams.size(); @@@ -1104,8 -1117,6 +1128,8 @@@ void eServiceMP3::gstBusCall(GstBus *bu 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: { @@@ -1592,75 -1603,6 +1616,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