Merge branch 'master' into experimental
authorStefan Pluecken <stefan.pluecken@multimedia-labs.de>
Wed, 4 Nov 2009 15:41:12 +0000 (16:41 +0100)
committerStefan Pluecken <stefan.pluecken@multimedia-labs.de>
Wed, 4 Nov 2009 15:41:12 +0000 (16:41 +0100)
Conflicts:
lib/python/Plugins/Extensions/MediaPlayer/plugin.py

1  2 
lib/python/Components/FileList.py
lib/python/Components/config.py
lib/python/Plugins/Extensions/MediaPlayer/plugin.py
lib/service/servicemp3.cpp

@@@ -3,7 -3,7 +3,7 @@@ from os import path as os_path, listdi
  from MenuList import MenuList
  from Components.Harddisk import harddiskmanager
  
 -from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename
 +from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename, fileExists
  
  from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, \
        eServiceReference, eServiceCenter, gFont
@@@ -23,6 -23,7 +23,7 @@@ EXTENSIONS = 
                "ts": "movie",
                "avi": "movie",
                "divx": "movie",
+               "m4v": "movie",
                "mpg": "movie",
                "mpeg": "movie",
                "mkv": "movie",
@@@ -159,11 -160,8 +160,11 @@@ class FileList(MenuList)
                        directories.sort()
                        files.sort()
                else:
 -                      if os_path.exists(directory):
 -                              files = listdir(directory)
 +                      if fileExists(directory):
 +                              try:
 +                                      files = listdir(directory)
 +                              except:
 +                                      files = []
                                files.sort()
                                tmpfiles = files[:]
                                for x in tmpfiles:
@@@ -376,11 -374,8 +377,11 @@@ class MultiFileSelectList(FileList)
                        directories.sort()
                        files.sort()
                else:
 -                      if os_path.exists(directory):
 -                              files = listdir(directory)
 +                      if fileExists(directory):
 +                              try:
 +                                      files = listdir(directory)
 +                              except:
 +                                      files = []
                                files.sort()
                                tmpfiles = files[:]
                                for x in tmpfiles:
@@@ -1,6 -1,6 +1,6 @@@
  from enigma import getPrevAsciiCode
  from Tools.NumericalTextInput import NumericalTextInput
 -from Tools.Directories import resolveFilename, SCOPE_CONFIG
 +from Tools.Directories import resolveFilename, SCOPE_CONFIG, fileExists
  from Components.Harddisk import harddiskmanager
  from copy import copy as copy_copy
  from os import path as os_path
@@@ -1184,7 -1184,10 +1184,10 @@@ class ConfigSatlist(ConfigSelection)
        def __init__(self, list, default = None):
                if default is not None:
                        default = str(default)
-               ConfigSelection.__init__(self, choices = [(str(orbpos), desc) for (orbpos, desc, flags) in list], default = default)
+               choices = [(str(orbpos), desc) for (orbpos, desc, flags) in list]
+               choices.sort(key = lambda x: int(x[0]))
+               
+               ConfigSelection.__init__(self, choices = choices, default = default)
  
        def getOrbitalPosition(self):
                if self.value == "":
@@@ -1285,6 -1288,7 +1288,6 @@@ class ConfigLocations(ConfigElement)
                self.default = default
                self.locations = []
                self.mountpoints = []
 -              harddiskmanager.on_partition_list_change.append(self.mountpointsChanged)
                self.value = default[:]
  
        def setValue(self, value):
                locations = [[x, None, False, False] for x in tmp]
                self.refreshMountpoints()
                for x in locations:
 -                      if os_path.exists(x[0]):
 +                      if fileExists(x[0]):
                                x[1] = self.getMountpoint(x[0])
                                x[2] = True
                self.locations = locations
                        return False
                return self.tostring([x[0] for x in locations]) != sv
  
 -      def mountpointsChanged(self, action, dev):
 -              print "Mounts changed: ", action, dev
 -              mp = dev.mountpoint+"/"
 -              if action == "add":
 -                      self.addedMount(mp)
 -              elif action == "remove":
 -                      self.removedMount(mp)
 -              self.refreshMountpoints()
 -
        def addedMount(self, mp):
                for x in self.locations:
                        if x[1] == mp:
                                x[2] = True
 -                      elif x[1] == None and os_path.exists(x[0]):
 +                      elif x[1] == None and fileExists(x[0]):
                                x[1] = self.getMountpoint(x[0])
                                x[2] = True
  
                                x[2] = False
  
        def refreshMountpoints(self):
 -              self.mountpoints = [p.mountpoint + "/" for p in harddiskmanager.getMountedPartitions() if p.mountpoint != "/"]
 +              self.mountpoints = [p.mountpoint for p in harddiskmanager.getMountedPartitions() if p.mountpoint != "/"]
                self.mountpoints.sort(key = lambda x: -len(x))
  
        def checkChangedMountpoints(self):
@@@ -110,7 -110,7 +110,7 @@@ class MediaPlayer(Screen, InfoBarBase, 
  
                # 'None' is magic to start at the list of mountpoints
                defaultDir = config.mediaplayer.defaultDir.getValue()
-               self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|m2ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
 -              self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
++              self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|m2ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
                self["filelist"] = self.filelist
  
                self.playlist = MyPlayList()
@@@ -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
  
@@@ -37,6 -34,7 +37,7 @@@ eServiceFactoryMP3::eServiceFactoryMP3(
                extensions.push_back("vob");
                extensions.push_back("wav");
                extensions.push_back("wave");
+               extensions.push_back("m4v");
                extensions.push_back("mkv");
                extensions.push_back("avi");
                extensions.push_back("divx");
@@@ -45,7 -43,6 +46,7 @@@
                extensions.push_back("mp4");
                extensions.push_back("mov");
                extensions.push_back("m4a");
 +              extensions.push_back("m2ts");
                sc->addServiceFactory(eServiceFactoryMP3::id, this, extensions);
        }
  
@@@ -190,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)
                sourceinfo.containertype = ctAVI;
                sourceinfo.is_video = TRUE;
        }
-       else if ( strcasecmp(ext, ".mp4") == 0 || strcasecmp(ext, ".mov") == 0)
+       else if ( strcasecmp(ext, ".mp4") == 0 || strcasecmp(ext, ".mov") == 0 || strcasecmp(ext, ".m4v") == 0)
        {
                sourceinfo.containertype = ctMP4;
                sourceinfo.is_video = TRUE;
@@@ -664,6 -659,7 +665,6 @@@ RESULT eServiceMP3::getName(std::strin
        return 0;
  }
  
 -
  int eServiceMP3::getInfo(int w)
  {
        const gchar *tag = 0;
@@@ -959,12 -955,6 +960,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();
@@@ -1103,8 -1093,6 +1104,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:
                                {
@@@ -1591,75 -1579,6 +1592,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