Merge branch 'bug_274_disable_fast_winding_for_non_ts' into experimental
authorghost <andreas.monzner@multimedia-labs.de>
Thu, 5 Nov 2009 10:44:56 +0000 (11:44 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Thu, 5 Nov 2009 10:44:56 +0000 (11:44 +0100)
1  2 
lib/python/Screens/InfoBarGenerics.py
lib/service/servicemp3.cpp

index b98cd469b5ad5d1b8413db6302fdb6c584cc8576,67bd2631a86d5a5f3333f7e397cf82bea7aa0756..df853218dc29f93b9a3351a3fd866e226c5f0776
@@@ -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)
                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):
  #                     print "seekable"
  
        def __serviceStarted(self):
+               self.fast_winding_hint_message_showed = False
                self.seekstate = self.SEEK_STATE_PLAY
                self.__seekableStatusChanged()
  
                        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
                        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:
                        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)))
                        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:
                        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:
index c95609a31dde231c498ead998c34a804c9708182,e684e393c7c97870f43bc507f3f74e65a13ac5f3..52f2bc995773f0e3127597a8b7a81d692d3d156e
@@@ -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 <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
  
@@@ -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<iServiceInformation>&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<iSubt
        return 0;
  }
  
 +RESULT eServiceMP3::audioDelay(ePtr<iAudioDelay> &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