Support duo4k.
[vuplus_dvbapp] / lib / python / Screens / AudioSelection.py
old mode 100644 (file)
new mode 100755 (executable)
index 068da87..715d922
@@ -1,15 +1,17 @@
 from Screen import Screen
 from Screen import Screen
+from Screens.Setup import getConfigMenuItem
 from Components.ServiceEventTracker import ServiceEventTracker
 from Components.ServiceEventTracker import ServiceEventTracker
-from Components.ActionMap import ActionMap
+from Components.ActionMap import NumberActionMap
 from Components.ConfigList import ConfigListScreen
 from Components.ChoiceList import ChoiceList, ChoiceEntryComponent
 from Components.config import config, ConfigSubsection, getConfigListEntry, ConfigNothing, ConfigSelection, ConfigOnOff
 from Components.ConfigList import ConfigListScreen
 from Components.ChoiceList import ChoiceList, ChoiceEntryComponent
 from Components.config import config, ConfigSubsection, getConfigListEntry, ConfigNothing, ConfigSelection, ConfigOnOff
+from Components.Label import Label
 from Components.MultiContent import MultiContentEntryText
 from Components.Sources.List import List
 from Components.Sources.Boolean import Boolean
 from Components.SystemInfo import SystemInfo
 
 from Components.MultiContent import MultiContentEntryText
 from Components.Sources.List import List
 from Components.Sources.Boolean import Boolean
 from Components.SystemInfo import SystemInfo
 
-from enigma import iPlayableService
+from enigma import iPlayableService, eTimer, eSize
 
 from Tools.ISO639 import LanguageCodes
 from Tools.BoundFunction import boundFunction
 
 from Tools.ISO639 import LanguageCodes
 from Tools.BoundFunction import boundFunction
@@ -36,7 +38,7 @@ class AudioSelection(Screen, ConfigListScreen):
                self.cached_subtitle_checked = False
                self.__selected_subtitle = None
         
                self.cached_subtitle_checked = False
                self.__selected_subtitle = None
         
-               self["actions"] = ActionMap(["ColorActions", "SetupActions", "DirectionActions"],
+               self["actions"] = NumberActionMap(["ColorActions", "SetupActions", "DirectionActions"],
                {
                        "red": self.keyRed,
                        "green": self.keyGreen,
                {
                        "red": self.keyRed,
                        "green": self.keyGreen,
@@ -46,6 +48,15 @@ class AudioSelection(Screen, ConfigListScreen):
                        "cancel": self.cancel,
                        "up": self.keyUp,
                        "down": self.keyDown,
                        "cancel": self.cancel,
                        "up": self.keyUp,
                        "down": self.keyDown,
+                       "1": self.keyNumberGlobal,
+                       "2": self.keyNumberGlobal,
+                       "3": self.keyNumberGlobal,
+                       "4": self.keyNumberGlobal,
+                       "5": self.keyNumberGlobal,
+                       "6": self.keyNumberGlobal,
+                       "7": self.keyNumberGlobal,
+                       "8": self.keyNumberGlobal,
+                       "9": self.keyNumberGlobal,
                }, -2)
 
                self.settings = ConfigSubsection()
                }, -2)
 
                self.settings = ConfigSubsection()
@@ -71,19 +82,23 @@ class AudioSelection(Screen, ConfigListScreen):
                        if SystemInfo["CanDownmixAC3"]:
                                self.settings.downmix = ConfigOnOff(default=config.av.downmix_ac3.value)
                                self.settings.downmix.addNotifier(self.changeAC3Downmix, initial_call = False)
                        if SystemInfo["CanDownmixAC3"]:
                                self.settings.downmix = ConfigOnOff(default=config.av.downmix_ac3.value)
                                self.settings.downmix.addNotifier(self.changeAC3Downmix, initial_call = False)
-                               conflist.append(getConfigListEntry(_("AC3 downmix"), self.settings.downmix))
+                               conflist.append(getConfigListEntry(_("Dolby Digital / DTS downmix"), self.settings.downmix))
                                self["key_red"].setBoolean(True)
 
                        if n > 0:
                                self.audioChannel = service.audioChannel()
                                self["key_red"].setBoolean(True)
 
                        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):
                                selectedAudio = self.audioTracks.getCurrentTrack()
                                for x in range(n):
-                                       number = str(x)
+                                       number = str(x + 1)
                                        i = audio.getTrackInfo(x)
                                        languages = i.getLanguage().split('/')
                                        description = i.getDescription() or _("<unknown>")
                                        i = audio.getTrackInfo(x)
                                        languages = i.getLanguage().split('/')
                                        description = i.getDescription() or _("<unknown>")
@@ -116,9 +131,13 @@ class AudioSelection(Screen, ConfigListScreen):
                elif self.settings.menupage.getValue() == PAGE_SUBTITLES:
                        self.setTitle(_("Subtitle selection"))
                        conflist.append(('',))
                elif self.settings.menupage.getValue() == PAGE_SUBTITLES:
                        self.setTitle(_("Subtitle selection"))
                        conflist.append(('',))
-                       conflist.append(('',))
                        self["key_red"].setBoolean(False)
                        self["key_red"].setBoolean(False)
-                       self["key_green"].setBoolean(False)
+                       if self.infobar.selected_subtitle:
+                               conflist.append(getConfigListEntry(_("Subtitle Quickmenu"), ConfigNothing()))
+                               self["key_green"].setBoolean(True)
+                       else:
+                               conflist.append(('',))
+                               self["key_green"].setBoolean(False)
 
                        if self.subtitlesEnabled():
                                sel = self.infobar.selected_subtitle
 
                        if self.subtitlesEnabled():
                                sel = self.infobar.selected_subtitle
@@ -136,7 +155,7 @@ class AudioSelection(Screen, ConfigListScreen):
                                        language = _("<unknown>")
                                        selected = ""
 
                                        language = _("<unknown>")
                                        selected = ""
 
-                                       if sel and x[:4] == sel[:4]:
+                                       if sel and x == sel:
                                                selected = _("Running")
                                                selectedidx = idx
                                        
                                                selected = _("Running")
                                                selectedidx = idx
                                        
@@ -218,7 +237,7 @@ class AudioSelection(Screen, ConfigListScreen):
                config.av.downmix_ac3.save()
 
        def changeMode(self, mode):
                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):
                        self.audioChannel.selectChannel(int(mode.getValue()))
 
        def changeAudio(self, audio):
@@ -236,7 +255,10 @@ class AudioSelection(Screen, ConfigListScreen):
        def keyRight(self, config = False):
                if config or self.focus == FOCUS_CONFIG:
                        if self["config"].getCurrentIndex() < 3:
        def keyRight(self, config = False):
                if config or self.focus == FOCUS_CONFIG:
                        if self["config"].getCurrentIndex() < 3:
-                               ConfigListScreen.keyRight(self)
+                               if self["config"].getCurrentIndex() == 1 and self.settings.menupage.getValue() == PAGE_SUBTITLES and self.infobar.selected_subtitle:
+                                       self.session.open(QuickSubtitlesConfigMenu, self.infobar)
+                               else:
+                                       ConfigListScreen.keyRight(self)
                        elif hasattr(self, "plugincallfunc"):
                                self.plugincallfunc()
                if self.focus == FOCUS_STREAMS and self["streams"].count() and config == False:
                        elif hasattr(self, "plugincallfunc"):
                                self.plugincallfunc()
                if self.focus == FOCUS_STREAMS and self["streams"].count() and config == False:
@@ -285,11 +307,16 @@ class AudioSelection(Screen, ConfigListScreen):
                elif self.focus == FOCUS_STREAMS:
                        self["streams"].selectNext()
 
                elif self.focus == FOCUS_STREAMS:
                        self["streams"].selectNext()
 
+       def keyNumberGlobal(self, number):
+               if number <= len(self["streams"].list):
+                       self["streams"].setIndex(number-1)
+                       self.keyOk()
+
        def keyOk(self):
                if self.focus == FOCUS_STREAMS and self["streams"].list:
                        cur = self["streams"].getCurrent()
                        if self.settings.menupage.getValue() == PAGE_AUDIO and cur[0] is not None:
        def keyOk(self):
                if self.focus == FOCUS_STREAMS and self["streams"].list:
                        cur = self["streams"].getCurrent()
                        if self.settings.menupage.getValue() == PAGE_AUDIO and cur[0] is not None:
-                               self.changeAudio(cur[2])
+                               self.changeAudio(cur[0])
                                self.__updatedInfo()
                        if self.settings.menupage.getValue() == PAGE_SUBTITLES and cur[0] is not None:
                                if self.infobar.selected_subtitle == cur[0]:
                                self.__updatedInfo()
                        if self.settings.menupage.getValue() == PAGE_SUBTITLES and cur[0] is not None:
                                if self.infobar.selected_subtitle == cur[0]:
@@ -311,3 +338,107 @@ class SubtitleSelection(AudioSelection):
        def __init__(self, session, infobar=None):
                AudioSelection.__init__(self, session, infobar, page=PAGE_SUBTITLES)
                self.skinName = ["AudioSelection"]
        def __init__(self, session, infobar=None):
                AudioSelection.__init__(self, session, infobar, page=PAGE_SUBTITLES)
                self.skinName = ["AudioSelection"]
+
+class QuickSubtitlesConfigMenu(ConfigListScreen, Screen):
+       skin = """
+       <screen position="50,80" size="480,425" title="Subtitle settings">
+               <widget name="config" position="5,5" size="470,395" scrollbarMode="showOnDemand" />
+               <widget name="videofps" position="5,405" size="470,25" zPosition="10" font="Regular;20" backgroundColor="#25062748" transparent="1" />
+       </screen>"""
+
+       def __init__(self, session, infobar):
+               Screen.__init__(self, session)
+               self.skin = QuickSubtitlesConfigMenu.skin
+               self.infobar = infobar or self.session.infobar
+
+               self.wait = eTimer()
+               self.wait.timeout.get().append(self.resyncSubtitles)
+
+               self["videofps"] = Label("")
+
+               sub = self.infobar.selected_subtitle
+               if sub[0] == 0:  # dvb
+                       menu = [
+                               getConfigMenuItem("config.subtitles.subtitle_fontcolor"),
+                               getConfigMenuItem("config.subtitles.dvb_subtitles_centered"),
+                               getConfigMenuItem("config.subtitles.subtitle_bgopacity"),
+                               getConfigMenuItem("config.subtitles.subtitle_original_position"),
+                               getConfigMenuItem("config.subtitles.subtitle_position"),
+                               getConfigMenuItem("config.subtitles.subtitle_bad_timing_delay"),
+                               getConfigMenuItem("config.subtitles.subtitle_noPTSrecordingdelay"),
+                       ]
+               elif sub[0] == 1: # teletext
+                       menu = [
+                               getConfigMenuItem("config.subtitles.subtitle_fontcolor"),
+                               getConfigMenuItem("config.subtitles.subtitle_fontsize"),
+                               getConfigMenuItem("config.subtitles.subtitle_opacity"),
+                               getConfigMenuItem("config.subtitles.subtitle_bgcolor"),
+                               getConfigMenuItem("config.subtitles.subtitle_bgopacity"),
+                               getConfigMenuItem("config.subtitles.subtitle_edgestyle"),
+                               getConfigMenuItem("config.subtitles.subtitle_edgestyle_level"),
+                               getConfigMenuItem("config.subtitles.subtitle_original_position"),
+                               getConfigMenuItem("config.subtitles.subtitle_alignment"),
+                               getConfigMenuItem("config.subtitles.subtitle_position"),
+                               getConfigMenuItem("config.subtitles.subtitle_rewrap"),
+                               getConfigMenuItem("config.subtitles.subtitle_bad_timing_delay"),
+                               getConfigMenuItem("config.subtitles.subtitle_noPTSrecordingdelay"),
+                       ]
+               else:           # pango
+                       menu = [
+                               getConfigMenuItem("config.subtitles.subtitle_fontcolor"),
+                               getConfigMenuItem("config.subtitles.subtitle_fontsize"),
+                               getConfigMenuItem("config.subtitles.subtitle_opacity"),
+                               getConfigMenuItem("config.subtitles.subtitle_bgcolor"),
+                               getConfigMenuItem("config.subtitles.subtitle_bgopacity"),
+                               getConfigMenuItem("config.subtitles.subtitle_edgestyle"),
+                               getConfigMenuItem("config.subtitles.subtitle_edgestyle_level"),
+                               getConfigMenuItem("config.subtitles.subtitle_original_position"),
+                               getConfigMenuItem("config.subtitles.subtitle_alignment"),
+                               getConfigMenuItem("config.subtitles.subtitle_position"),
+                               getConfigMenuItem("config.subtitles.pango_subtitle_fontswitch"),
+                               getConfigMenuItem("config.subtitles.colourise_dialogs"),
+                               getConfigMenuItem("config.subtitles.subtitle_rewrap"),
+                               getConfigMenuItem("config.subtitles.pango_subtitles_delay"),
+                               getConfigMenuItem("config.subtitles.pango_subtitles_fps"),
+                       ]
+                       self["videofps"].setText(_("Video: %s fps") % (self.getFps().rstrip(".000")))
+
+               ConfigListScreen.__init__(self, menu, self.session, on_change = self.changedEntry)
+
+               self["actions"] = NumberActionMap(["SetupActions"],
+               {
+                       "cancel": self.cancel,
+                       "ok": self.ok,
+               },-2)
+
+               self.onLayoutFinish.append(self.layoutFinished)
+
+       def layoutFinished(self):
+               if not self["videofps"].text:
+                       self.instance.resize(eSize(self.instance.size().width(), self["config"].l.getItemSize().height()*len(self["config"].getList()) + 10))
+
+       def changedEntry(self):
+               if self["config"].getCurrent() in [getConfigMenuItem("config.subtitles.pango_subtitles_delay"),getConfigMenuItem("config.subtitles.pango_subtitles_fps")]:
+                       self.wait.start(500, True)
+
+       def resyncSubtitles(self):
+               self.infobar.setSeekState(self.infobar.SEEK_STATE_PAUSE)
+               self.infobar.setSeekState(self.infobar.SEEK_STATE_PLAY)
+
+       def getFps(self):
+               from enigma import iServiceInformation
+               service = self.session.nav.getCurrentService()
+               info = service and service.info()
+               if not info:
+                       return ""
+               fps = info.getInfo(iServiceInformation.sFrameRate)
+               if fps > 0:
+                       return "%6.3f" % (fps/1000.)
+               return ""
+
+       def cancel(self):
+               self.close()
+
+       def ok(self):
+               config.subtitles.save()
+               self.close()