+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)
+[PAGE_AUDIO, PAGE_SUBTITLES] = ["audio", "subtitles"]
+
+class AudioSelection(Screen, ConfigListScreen):
+ def __init__(self, session, infobar=None, page=PAGE_AUDIO):
+ 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,
+ }, -2)
+
+ self.settings = ConfigSubsection()
+ choicelist = [(PAGE_AUDIO,_("audio tracks")), (PAGE_SUBTITLES,_("Subtitles"))]
+ self.settings.menupage = ConfigSelection(choices = choicelist, default=page)
+ self.onLayoutFinish.append(self.__layoutFinished)
+
+ def __layoutFinished(self):
+ self["config"].instance.setSelectionEnable(False)
+ self.focus = FOCUS_STREAMS
+ self.settings.menupage.addNotifier(self.fillList)
+
+ def fillList(self, arg=None):
+ streams = []
+ conflist = []
+ selectedidx = 0
+
+ if self.settings.menupage.getValue() == PAGE_AUDIO:
+ self.setTitle(_("Select audio track"))
+ service = self.session.nav.getCurrentService()
+ self.audioTracks = audio = service and service.audioTracks()
+ n = audio and audio.getNumberOfTracks() or 0
+ if SystemInfo["CanDownmixAC3"]:
+ 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()
+ if self.audioChannel:
+ 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)
+ else:
+ conflist.append(('',))
+ self["key_green"].setBoolean(False)
+ selectedAudio = self.audioTracks.getCurrentTrack()
+ for x in range(n):
+ number = str(x)
+ i = audio.getTrackInfo(x)
+ languages = i.getLanguage().split('/')
+ description = i.getDescription() or _("<unknown>")
+ 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":
+ _("<unknown>")
+ else:
+ language += lang
+ cnt += 1
+
+ streams.append((x, "", number, description, language, selected))
+
+ else:
+ streams = []
+ conflist.append(('',))
+ self["key_green"].setBoolean(False)
+
+ elif self.settings.menupage.getValue() == PAGE_SUBTITLES:
+ self.setTitle(_("Subtitle selection"))
+ conflist.append(('',))
+ conflist.append(('',))
+ self["key_red"].setBoolean(False)
+ 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 = _("<unknown>")
+ selected = ""
+
+ if sel and x == sel:
+ 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 = (_("<unknown>"), "UTF-8 text", "SSA", "AAS", ".SRT file", "VOB", "PGS (unsupported)")
+ 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) ]
+
+ if len(Plugins):
+ self["key_blue"].setBoolean(True)
+ conflist.append(getConfigListEntry(Plugins[0][0], ConfigNothing()))
+ self.plugincallfunc = Plugins[0][1]
+ if len(Plugins) > 1:
+ print "plugin(s) installed but not displayed in the dialog box:", Plugins[1:]
+
+ self["config"].list = conflist
+ self["config"].l.setList(conflist)
+
+ self["streams"].list = streams
+ self["streams"].setIndex(selectedidx)
+
+ 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):
+ 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):
+ 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):
+ if mode is not None and self.audioChannel:
+ self.audioChannel.selectChannel(int(mode.getValue()))
+
+ def changeAudio(self, audio):
+ 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() and config == False:
+ 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():
+ self.colorkey(3)
+
+ def colorkey(self, idx):
+ self["config"].setCurrentIndex(idx)
+ self.keyRight(True)
+
+ def keyUp(self):
+ 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):
+ 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):
+ if self.focus == FOCUS_STREAMS and self["streams"].list:
+ cur = self["streams"].getCurrent()
+ if self.settings.menupage.getValue() == PAGE_AUDIO and cur[0] is not None:
+ self.changeAudio(cur[2])
+ self.__updatedInfo()
+ if self.settings.menupage.getValue() == PAGE_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(0)
+ elif self.focus == FOCUS_CONFIG:
+ self.keyRight()
+
+ def cancel(self):
+ self.close(0)
+
+class SubtitleSelection(AudioSelection):
+ def __init__(self, session, infobar=None):
+ AudioSelection.__init__(self, session, infobar, page=PAGE_SUBTITLES)
+ self.skinName = ["AudioSelection"]