[AV Settings] add PCM Multichannel entry.
authorhschang <chang@dev3>
Fri, 7 Mar 2014 09:54:56 +0000 (18:54 +0900)
committerhschang <chang@dev3>
Mon, 10 Mar 2014 08:42:08 +0000 (17:42 +0900)
data/setup.xml
lib/python/Components/AVSwitch.py
lib/python/Plugins/SystemPlugins/Videomode/plugin.py
lib/python/Screens/Setup.py

index f5342ee..442fe13 100755 (executable)
@@ -15,7 +15,8 @@
                        <item level="1" text="Dolby Digital default">config.av.defaultac3</item>
                        <item level="1" text="General Dolby Digital delay (ms)">config.av.generalAC3delay</item>
                        <item level="1" text="General PCM delay (ms)">config.av.generalPCMdelay</item>
-                       <item level="1" text="Dolby Digital / DTS downmix" requires="CanDownmixAC3">config.av.downmix_ac3</item>
+                       <item level="1" text="Dolby Digital / DTS downmix" requires="CanDownmixAC3" entrychange="yes">config.av.downmix_ac3</item>
+                       <item level="1" text="PCM Multichannel" requires="CanPcmMultichannel">config.av.pcm_multichannel</item>
                        <item level="1" text="AAC downmix" requires="CanDownmixAAC">config.av.downmix_aac</item>
                        <item level="1" text="Auto scart switching" requires="ScartSwitch">config.av.vcrswitch</item>
                </setup>
index b5f6b1f..de12e00 100755 (executable)
@@ -3,6 +3,7 @@ from config import config, ConfigSlider, ConfigSelection, ConfigYesNo, \
 from enigma import eAVSwitch, getDesktop
 from SystemInfo import SystemInfo
 from os import path as os_path
+from os import access, W_OK
 
 class AVSwitch:
        def setInput(self, input):
@@ -143,6 +144,19 @@ def InitAVSwitch():
        SystemInfo["ScartSwitch"] = eAVSwitch.getInstance().haveScartSwitch()
 
        try:
+               can_pcm_multichannel = access("/proc/stb/audio/multichannel_pcm", W_OK)
+       except:
+               can_pcm_multichannel = False
+
+       SystemInfo["supportPcmMultichannel"] = can_pcm_multichannel
+
+       if can_pcm_multichannel:
+               def setPCMMultichannel(configElement):
+                       open("/proc/stb/audio/multichannel_pcm", "w").write(configElement.value and "enable" or "disable")
+               config.av.pcm_multichannel = ConfigYesNo(default = False)
+               config.av.pcm_multichannel.addNotifier(setPCMMultichannel)
+
+       try:
                can_downmix = open("/proc/stb/audio/ac3_choices", "r").read()[:-1].find("downmix") != -1
        except:
                can_downmix = False
@@ -151,6 +165,11 @@ def InitAVSwitch():
        if can_downmix:
                def setAC3Downmix(configElement):
                        open("/proc/stb/audio/ac3", "w").write(configElement.value and "downmix" or "passthrough")
+                       if SystemInfo.get("supportPcmMultichannel", False) and (not configElement.value) :
+                               SystemInfo["CanPcmMultichannel"] = True
+                       else:
+                               SystemInfo["CanPcmMultichannel"] = False
+
                config.av.downmix_ac3 = ConfigYesNo(default = True)
                config.av.downmix_ac3.addNotifier(setAC3Downmix)
 
index a13ef28..7c646b3 100755 (executable)
@@ -12,22 +12,23 @@ config.misc.videowizardenabled = ConfigBoolean(default = True)
 
 class avSetupScreen(ConfigListScreen, Screen):
        avSetupItems = [
-               {"idx":1, "level":0, "text":"Video Output", "item":config.av.videoport},
-               {"idx":2, "level":0, "text":"Mode", "item":config.av.videomode[config.av.videoport.value]},
-               {"idx":3, "level":0, "text":"Refresh Rate", "item":config.av.videorate[config.av.videomode[config.av.videoport.value].value]},
-               {"idx":4, "level":0, "text":"Aspect Ratio", "item":config.av.aspect},
-               {"idx":5, "level":0, "text":"Display 4:3 content as", "item":config.av.policy_43},
-               {"idx":6, "level":0, "text":"Display > 16:9 content as", "item":config.av.policy_169},
-               {"idx":7, "level":0, "text":"Color Format", "item":config.av.colorformat},
-               {"idx":8, "level":1, "text":"WSS on 4:3", "item":config.av.wss},
-               {"idx":9, "level":1, "text":"Auto scart switching", "requires":"ScartSwitch", "item":config.av.vcrswitch},
-               {"idx":0, "level":1, "text":"Dolby Digital default", "item":config.av.defaultac3},
-               {"idx":0, "level":1, "text":"Dolby Digital / DTS downmix", "requires":"CanDownmixAC3", "item":config.av.downmix_ac3},
-               {"idx":0, "level":1, "text":"AAC downmix", "requires":"CanDownmixAAC", "item":config.av.downmix_aac},
-               {"idx":0, "level":1, "text":"General Dolby Digital delay(ms)", "item":config.av.generalAC3delay},
-               {"idx":0, "level":1, "text":"General PCM delay(ms)", "item":config.av.generalPCMdelay},
-               {"idx":0, "level":0, "text":"OSD visibility", "requires":"CanChangeOsdAlpha", "item":config.av.osd_alpha},
-               {"idx":0, "level":0, "text":"Scaler sharpness", "item":config.av.scaler_sharpness},
+               {"idx":1, "level":0, "text":"Video Output", "item":"config.av.videoport"},
+               {"idx":2, "level":0, "text":"Mode", "item":"config.av.videomode[config.av.videoport.value]"},
+               {"idx":3, "level":0, "text":"Refresh Rate", "item":"config.av.videorate[config.av.videomode[config.av.videoport.value].value]"},
+               {"idx":4, "level":0, "text":"Aspect Ratio", "item":"config.av.aspect"},
+               {"idx":5, "level":0, "text":"Display 4:3 content as", "item":"config.av.policy_43"},
+               {"idx":6, "level":0, "text":"Display > 16:9 content as", "item":"config.av.policy_169"},
+               {"idx":7, "level":0, "text":"Color Format", "item":"config.av.colorformat"},
+               {"idx":8, "level":1, "text":"WSS on 4:3", "item":"config.av.wss"},
+               {"idx":9, "level":1, "text":"Auto scart switching", "requires":"ScartSwitch", "item":"config.av.vcrswitch"},
+               {"idx":0, "level":1, "text":"Dolby Digital default", "item":"config.av.defaultac3"},
+               {"idx":0, "level":1, "text":"Dolby Digital / DTS downmix", "requires":"CanDownmixAC3", "item":"config.av.downmix_ac3"},
+               {"idx":0, "level":1, "text":"PCM Multichannel", "requires":"CanPcmMultichannel", "item":"config.av.pcm_multichannel"},
+               {"idx":0, "level":1, "text":"AAC downmix", "requires":"CanDownmixAAC", "item":"config.av.downmix_aac"},
+               {"idx":0, "level":1, "text":"General Dolby Digital delay(ms)", "item":"config.av.generalAC3delay"},
+               {"idx":0, "level":1, "text":"General PCM delay(ms)", "item":"config.av.generalPCMdelay"},
+               {"idx":0, "level":0, "text":"OSD visibility", "requires":"CanChangeOsdAlpha", "item":"config.av.osd_alpha"},
+               {"idx":0, "level":0, "text":"Scaler sharpness", "item":"config.av.scaler_sharpness"},
        ]
 
        def __init__(self, session):
@@ -95,9 +96,10 @@ class avSetupScreen(ConfigListScreen, Screen):
 
                        item_text = _(x.get("text", "??").encode("UTF-8"))
 
-                       item = x.get("item", None)
-                       if item is None:
+                       item_str = x.get("item", None)
+                       if item_str is None:
                                continue
+                       item = eval(item_str)
 
                        idx = x.get("idx", 0)
                        if idx > 0:
index 61e6fdd..2e83327 100755 (executable)
@@ -62,6 +62,17 @@ class Setup(ConfigListScreen, Screen):
                self.refill(list)
                self["config"].setList(list)
 
+       def removeEntryNotifier(self):
+               if self.needEntryChange:
+                       for item in self.needEntryChange:
+                               if self.entryChanged in item.notifiers:
+                                       item.notifiers.remove(self.entryChanged)
+
+       def entryChanged(self, configElement):
+               list = []
+               self.refill(list)
+               self["config"].setList(list)
+
        def refill(self, list):
                xmldata = setupdom.getroot()
                for x in xmldata.findall("setup"):
@@ -77,6 +88,8 @@ class Setup(ConfigListScreen, Screen):
 
                self.onChangedEntry = [ ]
 
+               self.needEntryChange = [ ]
+
                self.setup = setup
                list = []
                self.refill(list)
@@ -114,6 +127,7 @@ class Setup(ConfigListScreen, Screen):
                return SetupSummary
 
        def addItems(self, list, parentNode):
+               self.needEntryChange = [ ]
                for x in parentNode:
                        if x.tag == 'item':
                                item_level = int(x.get("level", 0))
@@ -140,6 +154,14 @@ class Setup(ConfigListScreen, Screen):
                                if not isinstance(item, ConfigNothing):
                                        list.append( (item_text, item) )
 
+                                       needentrychange = x.get("entrychange")
+                                       if needentrychange == "yes":
+                                               self.needEntryChange.append(item)
+                                               if not self.entryChanged in item.notifiers:
+                                                       item.notifiers.append(self.entryChanged)
+                                               if not self.removeEntryNotifier in self.onClose:
+                                                       self.onClose.append(self.removeEntryNotifier)
+
 def getSetupTitle(id):
        xmldata = setupdom.getroot()
        for x in xmldata.findall("setup"):