Merge branch 'bug_440_dvdplayer_audioselection' into experimental [fixes ##440+441...
authorFraxinas <andreas.frisch@multimedia-labs.de>
Fri, 28 Jan 2011 10:42:26 +0000 (11:42 +0100)
committerFraxinas <andreas.frisch@multimedia-labs.de>
Fri, 28 Jan 2011 10:46:53 +0000 (11:46 +0100)
Conflicts:
lib/python/Screens/AudioSelection.py

1  2 
lib/python/Plugins/Extensions/DVDPlayer/plugin.py
lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
lib/python/Screens/AudioSelection.py

@@@ -4,7 -4,7 +4,7 @@@ from Screens.Screen import Scree
  from Screens.MessageBox import MessageBox
  from Screens.ChoiceBox import ChoiceBox
  from Screens.HelpMenu import HelpableScreen
- from Screens.InfoBarGenerics import InfoBarSeek, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarShowHide, InfoBarNotifications
+ from Screens.InfoBarGenerics import InfoBarSeek, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarShowHide, InfoBarNotifications, InfoBarAudioSelection, InfoBarSubtitleSupport
  from Components.ActionMap import ActionMap, NumberActionMap, HelpableActionMap
  from Components.Label import Label
  from Components.Sources.StaticText import StaticText
@@@ -195,7 -195,7 +195,7 @@@ class ChapterZap(Screen)
                self.Timer.callback.append(self.keyOK)
                self.Timer.start(3000, True)
  
- class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarPVRState, InfoBarShowHide, HelpableScreen, InfoBarCueSheetSupport):
+ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarPVRState, InfoBarShowHide, HelpableScreen, InfoBarCueSheetSupport, InfoBarAudioSelection, InfoBarSubtitleSupport):
        ALLOW_SUSPEND = Screen.SUSPEND_PAUSES
        ENABLE_RESUME_SUPPORT = True
        
                self.saved_config_speeds_backward = config.seek.speeds_backward.value
                self.saved_config_enter_forward = config.seek.enter_forward.value
                self.saved_config_enter_backward = config.seek.enter_backward.value
 -              self.saved_config_seek_stepwise_minspeed = config.seek.stepwise_minspeed.value
 -              self.saved_config_seek_stepwise_repeat = config.seek.stepwise_repeat.value
                self.saved_config_seek_on_pause = config.seek.on_pause.value
                self.saved_config_seek_speeds_slowmotion = config.seek.speeds_slowmotion.value
  
                config.seek.speeds_slowmotion.value = [ ]
                config.seek.enter_forward.value = "2"
                config.seek.enter_backward.value = "2"
 -              config.seek.stepwise_minspeed.value = "Never"
 -              config.seek.stepwise_repeat.value = "3"
                config.seek.on_pause.value = "play"
  
        def restore_infobar_seek_config(self):
                config.seek.speeds_slowmotion.value = self.saved_config_seek_speeds_slowmotion
                config.seek.enter_forward.value = self.saved_config_enter_forward
                config.seek.enter_backward.value = self.saved_config_enter_backward
 -              config.seek.stepwise_minspeed.value = self.saved_config_seek_stepwise_minspeed
 -              config.seek.stepwise_repeat.value = self.saved_config_seek_stepwise_repeat
                config.seek.on_pause.value = self.saved_config_seek_on_pause
  
        def __init__(self, session, dvd_device = None, dvd_filelist = [ ], args = None):
                InfoBarNotifications.__init__(self)
                InfoBarCueSheetSupport.__init__(self, actionmap = "MediaPlayerCueSheetActions")
                InfoBarShowHide.__init__(self)
+               InfoBarAudioSelection.__init__(self)
+               InfoBarSubtitleSupport.__init__(self)
                HelpableScreen.__init__(self)
                self.save_infobar_seek_config()
                self.change_infobar_seek_config()
 -              InfoBarSeek.__init__(self, useSeekBackHack=False)
 +              InfoBarSeek.__init__(self)
                InfoBarPVRState.__init__(self)
                self.dvdScreen = self.session.instantiateDialog(DVDOverlay)
  
                                "prevTitle": (self.prevTitle, _("jump back to the previous title")),
                                "tv": (self.askLeavePlayer, _("exit DVD player or return to file browser")),
                                "dvdAudioMenu": (self.enterDVDAudioMenu, _("(show optional DVD audio menu)")),
+                               "AudioSelection": (self.enterAudioSelection, _("Select audio track")),
                                "nextAudioTrack": (self.nextAudioTrack, _("switch to the next audio track")),
                                "nextSubtitleTrack": (self.nextSubtitleTrack, _("switch to the next subtitle language")),
                                "nextAngle": (self.nextAngle, _("switch to the next angle")),
                        keys.keyPressed(key)
                return keys
  
+       def enterAudioSelection(self):
+               self.audioSelection()
        def nextAudioTrack(self):
                self.sendKey(iServiceKeys.keyUser)
  
@@@ -397,6 -397,61 +397,61 @@@ RESULT eServiceDVD::subtitle(ePtr<iSubt
        return 0;
  }
  
+ RESULT eServiceDVD::audioTracks(ePtr<iAudioTrackSelection> &ptr)
+ {
+       ptr = this;
+       return 0;
+ }
+ int eServiceDVD::getNumberOfTracks()
+ {
+       int i = 0;
+       ddvd_get_audio_count(m_ddvdconfig, &i);
+       return i;
+ }
+ int eServiceDVD::getCurrentTrack()
+ {
+       int audio_id,audio_type;
+       uint16_t audio_lang;
+       ddvd_get_last_audio(m_ddvdconfig, &audio_id, &audio_lang, &audio_type);
+       return audio_id;
+ }
+ RESULT eServiceDVD::selectTrack(unsigned int i)
+ {
+       ddvd_set_audio(m_ddvdconfig, i);
+       return 0;
+ }
+ RESULT eServiceDVD::getTrackInfo(struct iAudioTrackInfo &info, unsigned int audio_id)
+ {
+       int audio_type;
+       uint16_t audio_lang;
+       ddvd_get_audio_byid(m_ddvdconfig, audio_id, &audio_lang, &audio_type);
+       char audio_string[3]={audio_lang >> 8, audio_lang, 0};
+       info.m_pid = audio_id+1;
+       info.m_language = audio_string;
+       switch(audio_type)
+       {
+               case DDVD_MPEG:
+                       info.m_description = "MPEG";
+                       break;
+               case DDVD_AC3:
+                       info.m_description = "AC3";
+                       break;
+               case DDVD_DTS:
+                       info.m_description = "DTS";
+                       break;
+               case DDVD_LPCM:
+                       info.m_description = "LPCM";
+                       break;
+               default:
+                       info.m_description = "und";
+       }
+       return 0;
+ }
  RESULT eServiceDVD::keys(ePtr<iServiceKeys> &ptr)
  {
        ptr=this;
@@@ -623,14 -678,33 +678,33 @@@ PyObject *eServiceDVD::getInfoObject(in
        Py_RETURN_NONE;
  }
  
- RESULT eServiceDVD::enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) /*entry*/)
+ RESULT eServiceDVD::enableSubtitles(eWidget *parent, ePyObject tuple)
  {
        delete m_subtitle_widget;
+       eSize size = eSize(720, 576);
  
        m_subtitle_widget = new eSubtitleWidget(parent);
        m_subtitle_widget->resize(parent->size());
  
-       eSize size = eSize(720, 576);
+       int pid = -1;
+       if ( tuple != Py_None )
+       {               
+               ePyObject entry;
+               int tuplesize = PyTuple_Size(tuple);
+               if (!PyTuple_Check(tuple))
+                       goto error_out;
+               if (tuplesize < 1)
+                       goto error_out;
+               entry = PyTuple_GET_ITEM(tuple, 1);
+               if (!PyInt_Check(entry))
+                       goto error_out;
+               pid = PyInt_AsLong(entry)-1;
+               ddvd_set_spu(m_ddvdconfig, pid);
+               m_event(this, evUser+7);
+       }
+       eDebug("eServiceDVD::enableSubtitles %i", pid);
  
        if (!m_pixmap)
        {
        m_subtitle_widget->show();
  
        return 0;
+ error_out:
+       return -1;
  }
  
  RESULT eServiceDVD::disableSubtitles(eWidget */*parent*/)
  
  PyObject *eServiceDVD::getSubtitleList()
  {
-       eDebug("eServiceDVD::getSubtitleList nyi");
-       Py_RETURN_NONE;
+       ePyObject l = PyList_New(0);
+       unsigned int spu_count = 0;
+       ddvd_get_spu_count(m_ddvdconfig, &spu_count);
+       for ( unsigned int spu_id = 0; spu_id < spu_count; spu_id++ )
+       {
+               uint16_t spu_lang;
+               ddvd_get_spu_byid(m_ddvdconfig, spu_id, &spu_lang);
+               char spu_string[3]={spu_lang >> 8, spu_lang, 0};
+               ePyObject tuple = PyTuple_New(5);
+               PyTuple_SetItem(tuple, 0, PyInt_FromLong(2));
+               PyTuple_SetItem(tuple, 1, PyInt_FromLong(spu_id+1));
 -              PyTuple_SetItem(tuple, 2, PyInt_FromLong(3));
++              PyTuple_SetItem(tuple, 2, PyInt_FromLong(5));
+               PyTuple_SetItem(tuple, 3, PyInt_FromLong(0));
+               PyTuple_SetItem(tuple, 4, PyString_FromString(spu_string));
+               PyList_Append(l, tuple);
+               Py_DECREF(tuple);
+       }
+       return l;
  }
  
  PyObject *eServiceDVD::getCachedSubtitle()
@@@ -46,7 -46,7 +46,7 @@@ class AudioSelection(Screen, ConfigList
                        "cancel": self.cancel,
                        "up": self.keyUp,
                        "down": self.keyDown,
 -              }, -3)
 +              }, -2)
  
                self.settings = ConfigSubsection()
                choicelist = [(PAGE_AUDIO,_("audio tracks")), (PAGE_SUBTITLES,_("Subtitles"))]
                streams = []
                conflist = []
                selectedidx = 0
 -              
 -              service = self.session.nav.getCurrentService()
 -              self.audioTracks = audio = service and service.audioTracks()
 -              n = audio and audio.getNumberOfTracks() or 0
 -              
 +
                if self.settings.menupage.getValue() == PAGE_AUDIO:
                        self.setTitle(_("Select audio track"))
 +                      service = self.session.nav.getCurrentService()
 +                      self.audioTracks = audio = service and service.audioTracks()
 +                      n = audio and audio.getNumberOfTracks() or 0
                        if SystemInfo["CanDownmixAC3"]:
                                self.settings.downmix = ConfigOnOff(default=config.av.downmix_ac3.value)
                                self.settings.downmix.addNotifier(self.changeAC3Downmix, initial_call = False)
  
                        if n > 0:
                                self.audioChannel = service.audioChannel()
-                               choicelist = [("0",_("left")), ("1",_("stereo")), ("2", _("right"))]
-                               self.settings.channelmode = ConfigSelection(choices = choicelist, default = str(self.audioChannel.getCurrentChannel()))
-                               self.settings.channelmode.addNotifier(self.changeMode, initial_call = False)
-                               conflist.append(getConfigListEntry(_("Channel"), self.settings.channelmode))
-                               self["key_green"].setBoolean(True)
+                               if self.audioChannel:
+                                       choicelist = [("0",_("left")), ("1",_("stereo")), ("2", _("right"))]
+                                       self.settings.channelmode = ConfigSelection(choices = choicelist, default = str(self.audioChannel.getCurrentChannel()))
+                                       self.settings.channelmode.addNotifier(self.changeMode, initial_call = False)
+                                       conflist.append(getConfigListEntry(_("Channel"), self.settings.channelmode))
+                                       self["key_green"].setBoolean(True)
+                               else:
+                                       conflist.append(('',))
+                                       self["key_green"].setBoolean(False)
                                selectedAudio = self.audioTracks.getCurrentTrack()
                                for x in range(n):
                                        number = str(x)
                                        language = _("<unknown>")
                                        selected = ""
  
-                                       if sel and x[:4] == sel[:4]:
+                                       if sel and x == sel:
                                                selected = _("Running")
                                                selectedidx = idx
                                        
                                                number = "%x%02x" % (x[3],x[2])
  
                                        elif x[0] == 2:
 -                                              types = ("UTF-8 text","SSA / AAS",".SRT file","VOB")
 +                                              types = (_("<unknown>"), "UTF-8 text", "SSA", "AAS", ".SRT file", "VOB", "PGS (unsupported)")
                                                description = types[x[2]]
  
                                        streams.append((x, "", number, description, language, selected))
                                conflist.append(getConfigListEntry(Plugins[0][0], ConfigNothing()))
                                self.plugincallfunc = Plugins[0][1]
                        if len(Plugins) > 1:
 -                              print "these plugins are installed but not displayed in the dialog box:", Plugins[1:]
 +                              print "plugin(s) installed but not displayed in the dialog box:", Plugins[1:]
  
                self["config"].list = conflist
                self["config"].l.setList(conflist)
                config.av.downmix_ac3.save()
  
        def changeMode(self, mode):
-               if mode is not None:
+               if mode is not None and self.audioChannel:
                        self.audioChannel.selectChannel(int(mode.getValue()))
  
        def changeAudio(self, audio):