[AV Settings] add PCM Multichannel entry.
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / Videomode / plugin.py
1 from Screens.Screen import Screen
2 from Components.ConfigList import ConfigListScreen
3 from Components.ActionMap import NumberActionMap
4 from Components.config import config, ConfigNothing, ConfigBoolean, getConfigListEntry
5 from Components.Sources.StaticText import StaticText
6 from Components.SystemInfo import SystemInfo
7 from Plugins.Plugin import PluginDescriptor
8
9 from VideoHardware import video_hw
10
11 config.misc.videowizardenabled = ConfigBoolean(default = True)
12
13 class avSetupScreen(ConfigListScreen, Screen):
14         avSetupItems = [
15                 {"idx":1, "level":0, "text":"Video Output", "item":"config.av.videoport"},
16                 {"idx":2, "level":0, "text":"Mode", "item":"config.av.videomode[config.av.videoport.value]"},
17                 {"idx":3, "level":0, "text":"Refresh Rate", "item":"config.av.videorate[config.av.videomode[config.av.videoport.value].value]"},
18                 {"idx":4, "level":0, "text":"Aspect Ratio", "item":"config.av.aspect"},
19                 {"idx":5, "level":0, "text":"Display 4:3 content as", "item":"config.av.policy_43"},
20                 {"idx":6, "level":0, "text":"Display > 16:9 content as", "item":"config.av.policy_169"},
21                 {"idx":7, "level":0, "text":"Color Format", "item":"config.av.colorformat"},
22                 {"idx":8, "level":1, "text":"WSS on 4:3", "item":"config.av.wss"},
23                 {"idx":9, "level":1, "text":"Auto scart switching", "requires":"ScartSwitch", "item":"config.av.vcrswitch"},
24                 {"idx":0, "level":1, "text":"Dolby Digital default", "item":"config.av.defaultac3"},
25                 {"idx":0, "level":1, "text":"Dolby Digital / DTS downmix", "requires":"CanDownmixAC3", "item":"config.av.downmix_ac3"},
26                 {"idx":0, "level":1, "text":"PCM Multichannel", "requires":"CanPcmMultichannel", "item":"config.av.pcm_multichannel"},
27                 {"idx":0, "level":1, "text":"AAC downmix", "requires":"CanDownmixAAC", "item":"config.av.downmix_aac"},
28                 {"idx":0, "level":1, "text":"General Dolby Digital delay(ms)", "item":"config.av.generalAC3delay"},
29                 {"idx":0, "level":1, "text":"General PCM delay(ms)", "item":"config.av.generalPCMdelay"},
30                 {"idx":0, "level":0, "text":"OSD visibility", "requires":"CanChangeOsdAlpha", "item":"config.av.osd_alpha"},
31                 {"idx":0, "level":0, "text":"Scaler sharpness", "item":"config.av.scaler_sharpness"},
32         ]
33
34         def __init__(self, session):
35                 Screen.__init__(self, session)
36                 # for the skin: first try a setup_avsetup, then Setup
37                 self.skinName = ["setup_avsetup", "Setup"]
38                 self.setup_title = _("A/V Settings")
39
40                 self.video_cfg = video_hw
41                 self.audio_cfg = [ ]
42
43                 self.onChangedEntry = [ ]
44
45                 # handle hotplug by re-createing setup
46                 self.onShow.append(self.startHotplug)
47                 self.onHide.append(self.stopHotplug)
48
49                 self.list = [ ]
50
51                 self["key_red"] = StaticText( _("Cancel"))
52                 self["key_green"] = StaticText( _("OK"))
53
54                 self["action"] = NumberActionMap(["SetupActions"],
55                         {
56                                 "cancel": self.keyCancel,
57                                 "save": self.keySave,
58                         }, -2)
59
60                 ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changedEntry)
61                 
62                 self.createScreen()
63
64                 self.onLayoutFinish.append(self.layoutFinished)
65         
66         def layoutFinished(self):
67                 self.setTitle(self.setup_title)
68         
69         # for summary:
70         def changedEntry(self):
71                 for x in self.onChangedEntry:
72                         x()
73         
74         def getCurrentEntry(self):
75                 return self["config"].getCurrent()[0]
76
77         def getCurrentValue(self):
78                 return str(self["config"].getCurrent()[1].getText())
79
80         def createSummary(self):
81                 from Screens.Setup import SetupSummary
82                 return SetupSummary
83         
84         def createScreen(self):
85                 self.list = [ ]
86                 self.audio_cfg = [ ]
87
88                 for x in self.avSetupItems:
89                         item_level = int(x.get("level", 0))
90                         if item_level > config.usage.setup_level.index:
91                                 continue
92
93                         requires = x.get("requires")
94                         if requires and not SystemInfo.get(requires, False):
95                                 continue
96
97                         item_text = _(x.get("text", "??").encode("UTF-8"))
98
99                         item_str = x.get("item", None)
100                         if item_str is None:
101                                 continue
102                         item = eval(item_str)
103
104                         idx = x.get("idx", 0)
105                         if idx > 0:
106                                 if idx == 1: # Video Output
107                                         current_port = item.value
108                                 elif idx == 2: # Mode
109                                         item = config.av.videomode[current_port]
110                                         current_mode = item.value
111                                         # some modes (720p, 1080i, 1080p) are always widescreen.
112                                         force_wide = self.video_cfg.isWidescreenMode(current_mode)
113                                 elif idx == 3: # Refresh Rate
114                                         item = config.av.videorate[current_mode]
115                                         current_rate = item.value
116                                         if current_mode == "PC":
117                                                 item_text = _("Resolution")
118                                 elif idx == 4: # Aspect Ratio
119                                         current_aspect = item.value
120                                         if force_wide:
121                                                 continue
122                                 elif idx == 5: # Display 4:3 content as
123                                         if current_aspect == "auto" and not force_wide:
124                                                 continue
125                                         elif current_aspect == "4_3":
126                                                 continue
127                                 elif idx == 6: # Display 16:9 > content as
128                                         if current_aspect == "auto" and not force_wide:
129                                                 continue
130                                 # Color Format, WSS on 4:3, Auto scart switching
131                                 elif (idx == 7 or idx == 8 or idx == 9) and not current_port == "Scart":
132                                         continue
133                         if idx == 0 and item_level == 1: # audio
134                                 self.audio_cfg.append(item_text)
135
136                         # add to configlist
137                         if not isinstance(item, ConfigNothing):
138                                 self.list.append(getConfigListEntry(item_text, item))
139
140                 self["config"].setList(self.list)
141         
142         def keyLeft(self):
143                 ConfigListScreen.keyLeft(self)
144                 self.createScreen()
145                 # show current value on VFD
146                 if self.getCurrentEntry() not in self.audio_cfg:
147                         self.summaries[0]["SetupTitle"].text = self.getCurrentValue()
148         
149         def keyRight(self):
150                 ConfigListScreen.keyRight(self)
151                 self.createScreen()
152                 # show current value on VFD
153                 if self.getCurrentEntry() not in self.audio_cfg:
154                         self.summaries[0]["SetupTitle"].text = self.getCurrentValue()
155
156         def startHotplug(self):
157                 self.video_cfg.on_hotplug.append(self.createScreen)
158
159         def stopHotplug(self):
160                 self.video_cfg.on_hotplug.remove(self.createScreen)
161
162
163 def avSetupMain(session, **kwargs):
164         session.open(avSetupScreen)
165
166 def startAVsetup(menuid):
167         if menuid != "system":
168                 return []
169
170         return [( _("A/V Settings"), avSetupMain, "av_setup", 40)]
171
172 def startVideoWizard(*args, **kwargs):
173         from VideoWizard import VideoWizard
174         return VideoWizard(*args, **kwargs)
175
176 def Plugins(**kwargs):
177         plugin_list = [ 
178                 PluginDescriptor(
179                         name = "Videomode-K",
180                         description = "Videomode-K based videomode",
181                         where = PluginDescriptor.WHERE_MENU,
182                         needsRestart = False,
183                         fnc = startAVsetup)
184         ]
185
186         if config.misc.videowizardenabled.value:
187                 plugin_list.append(
188                         PluginDescriptor(
189                                 name = "Video Wizard",
190                                 where = PluginDescriptor.WHERE_WIZARD,
191                                 fnc=(0, startVideoWizard)
192                         )
193                 )
194         
195         return plugin_list
196