1 from Screen import Screen
2 from Components.ServiceEventTracker import ServiceEventTracker
3 from Components.ActionMap import ActionMap
4 from Components.ConfigList import ConfigListScreen
5 from Components.ChoiceList import ChoiceList, ChoiceEntryComponent
6 from Components.config import config, ConfigSubsection, getConfigListEntry, ConfigNothing, ConfigSelection, ConfigOnOff
7 from Components.MultiContent import MultiContentEntryText
8 from Components.Sources.List import List
9 from Components.Sources.Boolean import Boolean
10 from Components.SystemInfo import SystemInfo
12 from enigma import iPlayableService
14 from Tools.ISO639 import LanguageCodes
15 from Tools.BoundFunction import boundFunction
16 FOCUS_CONFIG, FOCUS_STREAMS = range(2)
18 class AudioSelection(Screen, ConfigListScreen):
19 def __init__(self, session, infobar=None):
20 Screen.__init__(self, session)
22 self["streams"] = List([])
23 self["key_red"] = Boolean(False)
24 self["key_green"] = Boolean(False)
25 self["key_yellow"] = Boolean(True)
26 self["key_blue"] = Boolean(False)
28 ConfigListScreen.__init__(self, [])
29 self.infobar = infobar or self.session.infobar
31 self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
33 iPlayableService.evUpdatedInfo: self.__updatedInfo
35 self.cached_subtitle_checked = False
36 self.__selected_subtitle = None
38 self["actions"] = ActionMap(["ColorActions", "SetupActions", "DirectionActions"],
41 "green": self.keyGreen,
42 "yellow": self.keyYellow,
45 "cancel": self.cancel,
50 self.settings = ConfigSubsection()
51 choicelist = [("audio",_("audio tracks")), ("subtitles",_("Subtitles"))]
52 self.settings.menupage = ConfigSelection(choices = choicelist)
53 self.settings.menupage.addNotifier(self.fillList)
54 self.onLayoutFinish.append(self.__layoutFinished)
56 def __layoutFinished(self):
57 self["config"].instance.setSelectionEnable(False)
58 self.focus = FOCUS_STREAMS
60 def fillList(self, arg=None):
65 service = self.session.nav.getCurrentService()
66 self.audioTracks = audio = service and service.audioTracks()
67 n = audio and audio.getNumberOfTracks() or 0
69 if self.settings.menupage.getValue() == "audio":
70 self.setTitle(_("Select audio track"))
71 if SystemInfo["CanDownmixAC3"]:
72 print "config.av.downmix_ac3.value=", config.av.downmix_ac3.value
73 self.settings.downmix = ConfigOnOff(default=config.av.downmix_ac3.value)
74 self.settings.downmix.addNotifier(self.changeAC3Downmix, initial_call = False)
75 conflist.append(getConfigListEntry(_("AC3 downmix"), self.settings.downmix))
76 self["key_red"] = Boolean(True)
79 self.audioChannel = service.audioChannel()
80 print "self.audioChannel.getCurrentChannel()", self.audioChannel.getCurrentChannel()
81 choicelist = [("0",_("left")), ("1",_("stereo")), ("2", _("right"))]
82 self.settings.channelmode = ConfigSelection(choices = choicelist, default = str(self.audioChannel.getCurrentChannel()))
83 self.settings.channelmode.addNotifier(self.changeMode, initial_call = False)
84 conflist.append(getConfigListEntry(_("Channel"), self.settings.channelmode))
85 self["key_green"] = Boolean(True)
87 selectedAudio = self.audioTracks.getCurrentTrack()
88 print "selectedAudio:", selectedAudio
92 i = audio.getTrackInfo(x)
93 languages = i.getLanguage().split('/')
94 description = i.getDescription() or _("<unknown>")
98 if selectedAudio == x:
99 selected = _("Running")
103 for lang in languages:
106 if LanguageCodes.has_key(lang):
107 language += LanguageCodes[lang][0]
114 streams.append((x, "", number, description, language, selected))
116 #if hasattr(self, "runPlugin"):
118 #def __init__(self, fnc, *args):
121 #def __call__(self, *args, **kwargs):
122 #self.fnc(*self.args)
124 #Plugins = [ (p.name, PluginCaller(self.runPlugin, p)) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_AUDIOMENU) ]
128 #flist.append((p[0], "CALLFUNC", p[1]))
130 #usedKeys.append(availableKeys[0])
131 #del availableKeys[0]
135 streams = [(None, "", "", _("none"), "")]
137 elif self.settings.menupage.getValue() == "subtitles":
138 self.setTitle(_("Subtitle selection"))
140 self.settings.dummy = ConfigNothing()
141 conflist.append(getConfigListEntry("", self.settings.dummy))
142 conflist.append(getConfigListEntry("", self.settings.dummy))
144 if self.subtitlesEnabled():
145 sel = self.infobar.selected_subtitle
151 subtitlelist = self.getSubtitleList()
153 if len(subtitlelist):
154 for x in subtitlelist:
157 language = _("<unknown>")
160 if sel and x[:4] == sel[:4]:
161 selected = _("Running")
165 if LanguageCodes.has_key(x[4]):
166 language = LanguageCodes[x[4]][0]
172 number = "%x" % (x[1])
176 number = "%x%02x" % (x[3],x[2])
179 types = (" UTF-8 text "," SSA / AAS "," .SRT file ")
180 description = types[x[2]]
182 streams.append((x, "", number, description, language, selected))
186 streams = [(None, "", "", _("none"), "")]
188 conflist.append(getConfigListEntry(_("Menu"), self.settings.menupage))
189 self["config"].list = conflist
190 self["config"].l.setList(conflist)
192 self["streams"].list = streams
193 self["streams"].setIndex(selectedidx)
195 def __updatedInfo(self):
198 def getSubtitleList(self):
199 s = self.infobar and self.infobar.getCurrentServiceSubtitle()
200 l = s and s.getSubtitleList() or [ ]
203 def subtitlesEnabled(self):
204 return self.infobar.subtitles_enabled
206 def enableSubtitle(self, subtitles):
207 print "[enableSubtitle]", subtitles
208 if self.infobar.selected_subtitle != subtitles:
209 self.infobar.subtitles_enabled = False
210 self.infobar.selected_subtitle = subtitles
212 self.infobar.subtitles_enabled = True
214 def changeAC3Downmix(self, downmix):
215 print "changeAC3Downmix config.av.downmix_ac3.value=", config.av.downmix_ac3.value, downmix.getValue()
216 if downmix.getValue() == True:
217 config.av.downmix_ac3.value = True
219 config.av.downmix_ac3.value = False
220 config.av.downmix_ac3.save()
222 def changeMode(self, mode):
223 print "changeMode", mode, mode.getValue()
225 self.audioChannel.selectChannel(int(mode.getValue()))
227 def changeAudio(self, audio):
228 print "changeAudio", audio, "self.session.nav.getCurrentService().audioTracks().getNumberOfTracks():", self.session.nav.getCurrentService().audioTracks().getNumberOfTracks()
230 if isinstance(track, int):
231 if self.session.nav.getCurrentService().audioTracks().getNumberOfTracks() > track:
232 self.audioTracks.selectTrack(track)
235 if self.focus == FOCUS_CONFIG:
236 ConfigListScreen.keyLeft(self)
237 elif self.focus == FOCUS_STREAMS:
238 self["streams"].setIndex(0)
241 if self.focus == FOCUS_CONFIG:
242 ConfigListScreen.keyRight(self)
243 elif self.focus == FOCUS_STREAMS and self["streams"].count():
244 self["streams"].setIndex(self["streams"].count()-1)
258 def colorkey(self, idx):
259 self["config"].setCurrentIndex(idx)
260 ConfigListScreen.keyRight(self)
263 print "[keyUp]", self["streams"].getIndex()
264 if self.focus == FOCUS_CONFIG:
265 self["config"].instance.moveSelection(self["config"].instance.moveUp)
266 elif self.focus == FOCUS_STREAMS:
267 if self["streams"].getIndex() == 0:
268 self["config"].instance.setSelectionEnable(True)
269 self["streams"].style = "notselected"
270 self["config"].setCurrentIndex(len(self["config"].getList())-1)
271 self.focus = FOCUS_CONFIG
273 self["streams"].selectPrevious()
276 print "[keyDown]", self["config"].getCurrentIndex(), len(self["config"].getList())-1
277 if self.focus == FOCUS_CONFIG:
278 if self["config"].getCurrentIndex() < len(self["config"].getList())-1:
279 self["config"].instance.moveSelection(self["config"].instance.moveDown)
281 self["config"].instance.setSelectionEnable(False)
282 self["streams"].style = "default"
283 self.focus = FOCUS_STREAMS
284 elif self.focus == FOCUS_STREAMS:
285 self["streams"].selectNext()
288 print "[keyok]", self["streams"].list, self["streams"].getCurrent()
289 if self.focus == FOCUS_STREAMS and self["streams"].list:
290 cur = self["streams"].getCurrent()
291 if self.settings.menupage.getValue() == "audio" and cur[0] is not None:
292 self.changeAudio(cur[2])
294 if self.settings.menupage.getValue() == "subtitles" and cur[0] is not None:
295 if self.infobar.selected_subtitle == cur[0]:
296 self.enableSubtitle(None)
297 selectedidx = self["streams"].getIndex()
299 self["streams"].setIndex(selectedidx)
301 self.enableSubtitle(cur[0])
304 elif self.focus == FOCUS_CONFIG: