add possibility to enable / disable ac3 downmix in audio track selection
[enigma2.git] / lib / python / Screens / InfoBarGenerics.py
index 633dcfd33c1eb20f3bfafc67273a70d3b7ac4cd8..31a9d5a98ef20785b957ccfd5c4ef26fd9adb852 100644 (file)
@@ -9,7 +9,6 @@ from Components.Label import Label
 from Components.Pixmap import Pixmap
 from Components.PluginComponent import plugins
 from Components.ServiceEventTracker import ServiceEventTracker
-from Components.Sources.Source import ObsoleteSource
 from Components.Sources.Boolean import Boolean
 from Components.config import config, ConfigBoolean, ConfigClock
 from Components.SystemInfo import SystemInfo
@@ -539,17 +538,6 @@ class InfoBarEPG:
                        self.epglist[1]=tmp
                        setEvent(self.epglist[0])
 
-class InfoBarTuner:
-       """provides a snr/agc/ber display"""
-       def __init__(self):
-               self["FrontendStatus"] = ObsoleteSource(new_source = "session.FrontendStatus", removal_date = "2008-01")
-
-class InfoBarEvent:
-       """provides a current/next event info display"""
-       def __init__(self):
-               self["Event_Now"] = ObsoleteSource(new_source = "session.Event_Now", removal_date = "2008-01")
-               self["Event_Next"] = ObsoleteSource(new_source = "session.Event_Next", removal_date = "2008-01")
-
 class InfoBarRdsDecoder:
        """provides RDS and Rass support/display"""
        def __init__(self):
@@ -598,10 +586,6 @@ class InfoBarRdsDecoder:
                        self.RassSlidePicChanged()
                self.rds_display.show()
 
-class InfoBarServiceName:
-       def __init__(self):
-               self["CurrentService"] = ObsoleteSource(new_source = "session.CurrentService", removal_date = "2008-01")
-
 class InfoBarSeek:
        """handles actions like seeking, pause"""
 
@@ -609,7 +593,7 @@ class InfoBarSeek:
        SEEK_STATE_PAUSE = (1, 0, 0, "||")
        SEEK_STATE_EOF = (1, 0, 0, "END")
 
-       def __init__(self, actionmap = "InfobarSeekActions"):
+       def __init__(self, actionmap = "InfobarSeekActions", useSeekBackHack=True):
                self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
                        {
                                iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged,
@@ -624,7 +608,7 @@ class InfoBarSeek:
                self.eofInhibitTimer = eTimer()
                self.eofInhibitTimer.timeout.get().append(self.inhibitEof)
 
-               self.minSpeedBackward = 16
+               self.minSpeedBackward = useSeekBackHack and 16 or 0
 
                class InfoBarSeekActionMap(HelpableActionMap):
                        def __init__(self, screen, *args, **kwargs):
@@ -682,7 +666,7 @@ class InfoBarSeek:
        def makeStateBackward(self, n):
                minspeed = config.seek.stepwise_minspeed.value
                repeat = int(config.seek.stepwise_repeat.value)
-               if n < self.minSpeedBackward:
+               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)
@@ -856,7 +840,7 @@ class InfoBarSeek:
                if self.seekstate == self.SEEK_STATE_PLAY:
                        self.setSeekState(self.makeStateForward(int(config.seek.enter_forward.value)))
                elif self.seekstate == self.SEEK_STATE_PAUSE:
-                       if config.seek.speeds_slowmotion:
+                       if len(config.seek.speeds_slowmotion.value):
                                self.setSeekState(self.makeStateSlowMotion(config.seek.speeds_slowmotion.value[-1]))
                        else:
                                self.setSeekState(self.makeStateForward(int(config.seek.enter_forward.value)))
@@ -1295,10 +1279,7 @@ class InfoBarPlugins:
 # depends on InfoBarExtensions
 class InfoBarSleepTimer:
        def __init__(self):
-               self.addExtension((self.getSleepTimerName, self.showSleepTimerSetup, self.available), "1")
-
-       def available(self):
-               return True
+               self.addExtension((self.getSleepTimerName, self.showSleepTimerSetup, lambda: True), "1")
 
        def getSleepTimerName(self):
                return _("Sleep Timer")
@@ -1311,13 +1292,10 @@ class InfoBarPiP:
        def __init__(self):
                self.session.pipshown = False
                if SystemInfo.get("NumVideoDecoders", 1) > 1:
-                       self.addExtension((self.getShowHideName, self.showPiP, self.available), "blue")
+                       self.addExtension((self.getShowHideName, self.showPiP, lambda: True), "blue")
                        self.addExtension((self.getMoveName, self.movePiP, self.pipShown), "green")
                        self.addExtension((self.getSwapName, self.swapPiP, self.pipShown), "yellow")
 
-       def available(self):
-               return SystemInfo.get("NumVideoDecoders", 1) > 1
-
        def pipShown(self):
                return self.session.pipshown
 
@@ -1389,13 +1367,6 @@ class InfoBarInstantRecord:
                                "instantRecord": (self.instantRecord, _("Instant Record...")),
                        })
                self.recording = []
-#### DEPRECATED CODE ####
-               self["BlinkingPoint"] = BlinkingPixmapConditional()
-               self["BlinkingPoint"].setConnect(self.session.nav.RecordTimer.isRecording)
-               self["BlinkingPoint"].deprecationInfo = (
-                       "session.RecordState source, Pixmap renderer and "
-                       "ConditionalShowHide/Blink Converter", "2008-02")
-#########################
 
        def stopCurrentRecording(self, entry = -1):
                if entry is not None and entry != -1:
@@ -1441,10 +1412,6 @@ class InfoBarInstantRecord:
                recording.dontSave = True
                self.recording.append(recording)
 
-#### DEPRECATED CODE ####
-               self["BlinkingPoint"].setConnect(lambda: self.recording.isRunning())
-#########################
-
        def isInstantRecordRunning(self):
                print "self.recording:", self.recording
                if len(self.recording) > 0:
@@ -1553,10 +1520,8 @@ class InfoBarAudioSelection:
 
        def audioSelection(self):
                service = self.session.nav.getCurrentService()
-               audio = service and service.audioTracks()
-               self.audioTracks = audio
+               self.audioTracks = audio = service and service.audioTracks()
                n = audio and audio.getNumberOfTracks() or 0
-               keys = [ "red", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n
                tlist = []
                if n > 0:
                        self.audioChannel = service.audioChannel()
@@ -1576,21 +1541,45 @@ class InfoBarAudioSelection:
 
                                tlist.append((description, x))
 
-                       selectedAudio = audio.getCurrentTrack()
                        tlist.sort(key=lambda x: x[0])
 
-                       selection = 2
+                       selectedAudio = self.audioTracks.getCurrentTrack()
+
+                       selection = 0
+
                        for x in tlist:
                                if x[1] != selectedAudio:
                                        selection += 1
                                else:
                                        break
 
-                       tlist = [([_("Left"), _("Stereo"), _("Right")][self.audioChannel.getCurrentChannel()], "mode"), ("--", "")] + tlist
+                       if SystemInfo["CanDownmixAC3"]:
+                               tlist = [(_("AC3 downmix") + " - " +[_("Off"), _("On")][config.av.downmix_ac3.value and 1 or 0], "CALLFUNC", self.changeAC3Downmix),
+                                       ([_("Left"), _("Stereo"), _("Right")][self.audioChannel.getCurrentChannel()], "mode"),
+                                       ("--", "")] + tlist
+                               keys = [ "red", "green", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n
+                               selection += 3
+                       else:
+                               tlist = [([_("Left"), _("Stereo"), _("Right")][self.audioChannel.getCurrentChannel()], "mode"), ("--", "")] + tlist
+                               keys = [ "red", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n
+                               selection += 2
                        self.session.openWithCallback(self.audioSelected, ChoiceBox, title=_("Select audio track"), list = tlist, selection = selection, keys = keys)
                else:
                        del self.audioTracks
 
+       def changeAC3Downmix(self, arg):
+               choicelist = self.session.current_dialog["list"]
+               list = choicelist.list
+               t = list[0][1]
+               list[0][1]=(t[0], t[1], t[2], t[3], t[4], t[5], t[6],
+                       _("AC3 downmix") + " - " +[_("On"), _("Off")][config.av.downmix_ac3.value and 1 or 0])
+               choicelist.setList(list)
+               if config.av.downmix_ac3.value:
+                       config.av.downmix_ac3.value = False
+               else:
+                       config.av.downmix_ac3.value = True
+               config.av.downmix_ac3.save()
+
        def audioSelected(self, audio):
                if audio is not None:
                        if isinstance(audio[1], str):
@@ -1663,7 +1652,7 @@ class InfoBarSubserviceSelection:
                                if newservice.valid():
                                        del subservices
                                        del service
-                                       self.session.nav.playService(newservice)
+                                       self.session.nav.playService(newservice, False)
 
        def subserviceSelection(self):
                service = self.session.nav.getCurrentService()
@@ -1703,7 +1692,7 @@ class InfoBarSubserviceSelection:
                                        self.session.open(SubservicesQuickzap, service[2])
                        else:
                                self["SubserviceQuickzapAction"].setEnabled(True)
-                               self.session.nav.playService(service[1])
+                               self.session.nav.playService(service[1], False)
 
        def addSubserviceToBouquetCallback(self, service):
                if len(service) > 1 and isinstance(service[1], eServiceReference):
@@ -1738,59 +1727,6 @@ class InfoBarAdditionalInfo:
                self["TimeshiftPossible"] = self["RecordingPossible"]
                self["ExtensionsAvailable"] = Boolean(fixed=1)
 
-######### DEPRECATED CODE ##########
-               self["NimA"] = Pixmap()
-               self["NimA"].deprecationInfo = (
-                       "session.TunerInfo source, Pixmap renderer, TunerInfo/UseMask Converter"
-                       ", ValueBitTest(1) Converter and ConditionalShowHide Converter", "2008-02")
-               self["NimB"] = Pixmap()
-               self["NimB"].deprecationInfo = (
-                       "session.TunerInfo source, Pixmap renderer, TunerInfo/UseMask Converter"
-                       ", ValueBitTest(2) Converter and ConditionalShowHide Converter", "2008-02")
-               self["NimA_Active"] = Pixmap()
-               self["NimA_Active"].deprecationInfo = (
-                       "session.FrontendInfo source, Pixmap renderer, FrontendInfo/NUMBER Converter"
-                       ", ValueRange(1,1) Converter and ConditionalShowHide Converter", "2008-02")
-               self["NimB_Active"] = Pixmap()
-               self["NimB_Active"].deprecationInfo = (
-                       "session.FrontendInfo source, Pixmap renderer, FrontendInfo/NUMBER Converter"
-                       ", ValueRange(1,1) Converter and ConditionalShowHide Converter", "2008-02")
-
-               res_mgr = eDVBResourceManager.getInstance()
-               if res_mgr:
-                       res_mgr.frontendUseMaskChanged.get().append(self.tunerUseMaskChanged)
-
-               self.session.nav.event.append(self.gotServiceEvent) # we like to get service events
-
-       def tunerUseMaskChanged(self, mask):
-               if mask&1:
-                       self["NimA_Active"].show()
-               else:
-                       self["NimA_Active"].hide()
-               if mask&2:
-                       self["NimB_Active"].show()
-               else:
-                       self["NimB_Active"].hide()
-
-       def checkTunerState(self, service):
-               info = service and service.frontendInfo()
-               feNumber = info and info.getFrontendInfo(iFrontendInformation.frontendNumber)
-               if feNumber is None:
-                       self["NimA"].hide()
-                       self["NimB"].hide()
-               elif feNumber == 0:
-                       self["NimB"].hide()
-                       self["NimA"].show()
-               elif feNumber == 1:
-                       self["NimA"].hide()
-                       self["NimB"].show()
-
-       def gotServiceEvent(self, ev):
-               service = self.session.nav.getCurrentService()
-               if ev == iPlayableService.evUpdatedInfo or ev == iPlayableService.evEnd:
-                       self.checkTunerState(service)
-####################################
-
 class InfoBarNotifications:
        def __init__(self):
                self.onExecBegin.append(self.checkNotifications)