from Screen import Screen from Components.ServiceEventTracker import ServiceEventTracker from Components.ActionMap import ActionMap from Components.ConfigList import ConfigListScreen from Components.ChoiceList import ChoiceList, ChoiceEntryComponent from Components.config import config, ConfigSubsection, getConfigListEntry, ConfigNothing, ConfigSelection, ConfigOnOff 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 Tools.ISO639 import LanguageCodes from Tools.BoundFunction import boundFunction FOCUS_CONFIG, FOCUS_STREAMS = range(2) class AudioSelection(Screen, ConfigListScreen): def __init__(self, session, infobar=None): Screen.__init__(self, session) self["streams"] = List([]) self["key_red"] = Boolean(False) self["key_green"] = Boolean(False) self["key_yellow"] = Boolean(True) self["key_blue"] = Boolean(False) ConfigListScreen.__init__(self, []) self.infobar = infobar or self.session.infobar self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { iPlayableService.evUpdatedInfo: self.__updatedInfo }) self.cached_subtitle_checked = False self.__selected_subtitle = None self["actions"] = ActionMap(["ColorActions", "SetupActions", "DirectionActions"], { "red": self.keyRed, "green": self.keyGreen, "yellow": self.keyYellow, "blue": self.keyBlue, "ok": self.keyOk, "cancel": self.cancel, "up": self.keyUp, "down": self.keyDown, }, -3) self.settings = ConfigSubsection() choicelist = [("audio",_("audio tracks")), ("subtitles",_("Subtitles"))] self.settings.menupage = ConfigSelection(choices = choicelist) self.settings.menupage.addNotifier(self.fillList) self.onLayoutFinish.append(self.__layoutFinished) def __layoutFinished(self): self["config"].instance.setSelectionEnable(False) self.focus = FOCUS_STREAMS def fillList(self, arg=None): streams = [] conflist = [] selectedidx = 0 service = self.session.nav.getCurrentService() self.audioTracks = audio = service and service.audioTracks() n = audio and audio.getNumberOfTracks() or 0 if self.settings.menupage.getValue() == "audio": self.setTitle(_("Select audio track")) if SystemInfo["CanDownmixAC3"]: print "config.av.downmix_ac3.value=", config.av.downmix_ac3.value 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)) self["key_red"].setBoolean(True) if n > 0: self.audioChannel = service.audioChannel() print "self.audioChannel.getCurrentChannel()", self.audioChannel.getCurrentChannel() 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) selectedAudio = self.audioTracks.getCurrentTrack() print "selectedAudio:", selectedAudio for x in range(n): number = str(x) i = audio.getTrackInfo(x) languages = i.getLanguage().split('/') description = i.getDescription() or _("") selected = "" language = "" if selectedAudio == x: selected = _("Running") selectedidx = x cnt = 0 for lang in languages: if cnt: language += ' / ' if LanguageCodes.has_key(lang): language += LanguageCodes[lang][0] elif lang == "und": _("") else: language += lang cnt += 1 streams.append((x, "", number, description, language, selected)) else: streams = [] elif self.settings.menupage.getValue() == "subtitles": self.setTitle(_("Subtitle selection")) self.settings.dummy = ConfigNothing() conflist.append(getConfigListEntry("", self.settings.dummy)) self["key_red"].setBoolean(False) conflist.append(getConfigListEntry("", self.settings.dummy)) self["key_green"].setBoolean(False) if self.subtitlesEnabled(): sel = self.infobar.selected_subtitle else: sel = None idx = 0 subtitlelist = self.getSubtitleList() if len(subtitlelist): for x in subtitlelist: number = str(x[1]) description = "?" language = _("") selected = "" if sel and x[:4] == sel[:4]: selected = _("Running") selectedidx = idx if x[4] != "und": if LanguageCodes.has_key(x[4]): language = LanguageCodes[x[4]][0] else: language = x[4] if x[0] == 0: description = "DVB" number = "%x" % (x[1]) elif x[0] == 1: description = "TTX" number = "%x%02x" % (x[3],x[2]) elif x[0] == 2: types = (" UTF-8 text "," SSA / AAS "," .SRT file ") description = types[x[2]] streams.append((x, "", number, description, language, selected)) idx += 1 else: streams = [] conflist.append(getConfigListEntry(_("Menu"), self.settings.menupage)) from Components.PluginComponent import plugins from Plugins.Plugin import PluginDescriptor if hasattr(self.infobar, "runPlugin"): class PluginCaller: def __init__(self, fnc, *args): self.fnc = fnc self.args = args def __call__(self, *args, **kwargs): self.fnc(*self.args) Plugins = [ (p.name, PluginCaller(self.infobar.runPlugin, p)) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_AUDIOMENU) ] print "Plugins", Plugins self.settings.dummy = ConfigNothing() if len(Plugins): self["key_blue"].setBoolean(True) conflist.append(getConfigListEntry(Plugins[0][0], self.settings.dummy)) self.plugincallfunc = Plugins[0][1] self["config"].list = conflist self["config"].l.setList(conflist) print "setting self[streams].list:", streams self["streams"].list = streams print "setting self[streams].setIndex:", selectedidx self["streams"].setIndex(selectedidx) print "debug1" def __updatedInfo(self): self.fillList() def getSubtitleList(self): s = self.infobar and self.infobar.getCurrentServiceSubtitle() l = s and s.getSubtitleList() or [ ] return l def subtitlesEnabled(self): return self.infobar.subtitles_enabled def enableSubtitle(self, subtitles): print "[enableSubtitle]", subtitles if self.infobar.selected_subtitle != subtitles: self.infobar.subtitles_enabled = False self.infobar.selected_subtitle = subtitles if subtitles: self.infobar.subtitles_enabled = True def changeAC3Downmix(self, downmix): print "changeAC3Downmix config.av.downmix_ac3.value=", config.av.downmix_ac3.value, downmix.getValue() if downmix.getValue() == True: config.av.downmix_ac3.value = True else: config.av.downmix_ac3.value = False config.av.downmix_ac3.save() def changeMode(self, mode): print "changeMode", mode, mode.getValue() if mode is not None: self.audioChannel.selectChannel(int(mode.getValue())) def changeAudio(self, audio): print "changeAudio", audio, "self.session.nav.getCurrentService().audioTracks().getNumberOfTracks():", self.session.nav.getCurrentService().audioTracks().getNumberOfTracks() track = int(audio) if isinstance(track, int): if self.session.nav.getCurrentService().audioTracks().getNumberOfTracks() > track: self.audioTracks.selectTrack(track) def keyLeft(self): if self.focus == FOCUS_CONFIG: ConfigListScreen.keyLeft(self) elif self.focus == FOCUS_STREAMS: self["streams"].setIndex(0) def keyRight(self, config = False): if config or self.focus == FOCUS_CONFIG: if self["config"].getCurrentIndex() < 3: ConfigListScreen.keyRight(self) elif hasattr(self, "plugincallfunc"): self.plugincallfunc() if self.focus == FOCUS_STREAMS and self["streams"].count(): self["streams"].setIndex(self["streams"].count()-1) def keyRed(self): if self["key_red"].getBoolean(): self.colorkey(0) def keyGreen(self): if self["key_green"].getBoolean(): self.colorkey(1) def keyYellow(self): if self["key_yellow"].getBoolean(): self.colorkey(2) def keyBlue(self): if self["key_blue"].getBoolean(): print "colorkey(3)" self.colorkey(3) def colorkey(self, idx): self["config"].setCurrentIndex(idx) self.keyRight(True) def keyUp(self): print "[keyUp]", self["streams"].getIndex() if self.focus == FOCUS_CONFIG: self["config"].instance.moveSelection(self["config"].instance.moveUp) elif self.focus == FOCUS_STREAMS: if self["streams"].getIndex() == 0: self["config"].instance.setSelectionEnable(True) self["streams"].style = "notselected" self["config"].setCurrentIndex(len(self["config"].getList())-1) self.focus = FOCUS_CONFIG else: self["streams"].selectPrevious() def keyDown(self): print "[keyDown]", self["config"].getCurrentIndex(), len(self["config"].getList())-1 if self.focus == FOCUS_CONFIG: if self["config"].getCurrentIndex() < len(self["config"].getList())-1: self["config"].instance.moveSelection(self["config"].instance.moveDown) else: self["config"].instance.setSelectionEnable(False) self["streams"].style = "default" self.focus = FOCUS_STREAMS elif self.focus == FOCUS_STREAMS: self["streams"].selectNext() def keyOk(self): print "[keyok]", self["streams"].list, self["streams"].getCurrent() if self.focus == FOCUS_STREAMS and self["streams"].list: cur = self["streams"].getCurrent() if self.settings.menupage.getValue() == "audio" and cur[0] is not None: self.changeAudio(cur[2]) self.__updatedInfo() if self.settings.menupage.getValue() == "subtitles" and cur[0] is not None: if self.infobar.selected_subtitle == cur[0]: self.enableSubtitle(None) selectedidx = self["streams"].getIndex() self.__updatedInfo() self["streams"].setIndex(selectedidx) else: self.enableSubtitle(cur[0]) self.__updatedInfo() #self.close() elif self.focus == FOCUS_CONFIG: self.keyRight() def cancel(self): self.close(0)