1 from AC3utils import AC3, PCM, AC3GLOB, PCMGLOB, AC3PCM, SKIN
2 from AC3delay import AC3delay
3 from AC3Positioner import AC3Positioner
4 from enigma import ePoint
5 from HelpableNumberActionMap import HelpableNumberActionMap
6 from Components.Label import Label,MultiColorLabel
7 from Components.Pixmap import MultiPixmap
8 from Components.ProgressBar import ProgressBar
9 from Components.config import config
10 from Screens.ChoiceBox import ChoiceBox
11 from Screens.HelpMenu import HelpableScreen
12 from Screens.MessageBox import MessageBox
13 from Screens.Screen import Screen
14 from Screens.InfoBarGenerics import InfoBarAudioSelection
15 from __init__ import _
17 class AC3LipSync(Screen, HelpableScreen, InfoBarAudioSelection):
19 def __init__(self, session, plugin_path):
20 Screen.__init__(self, session)
21 self.onShow.append(self.__onShow)
23 self.skin_path = plugin_path
25 #Initialisiere Infobargenerics
26 InfoBarAudioSelection.__init__(self)
28 # Configuration values
29 self.upperBound = int(config.plugins.AC3LipSync.outerBounds.getValue())
30 self.lowerBound = -1 * self.upperBound
31 self.arrowStepSize = int(config.plugins.AC3LipSync.arrowStepSize.getValue())
33 self.stepSize["3"] = int(config.plugins.AC3LipSync.stepSize13.getValue())
34 self.stepSize["1"] = -1 * self.stepSize["3"]
35 self.stepSize["6"] = int(config.plugins.AC3LipSync.stepSize46.getValue())
36 self.stepSize["4"] = -1 * self.stepSize["6"]
37 self.stepSize["9"] = int(config.plugins.AC3LipSync.stepSize79.getValue())
38 self.stepSize["7"] = -1 * self.stepSize["9"]
41 self.keyStep["2"] = int(config.plugins.AC3LipSync.absoluteStep2.getValue())
42 self.keyStep["5"] = int(config.plugins.AC3LipSync.absoluteStep5.getValue())
43 self.keyStep["8"] = int(config.plugins.AC3LipSync.absoluteStep8.getValue())
46 self.AC3delay = AC3delay()
51 self.currentValue = {}
55 self[sAudio+"DelayInfoLabel"] = Label( _("%s:")%sAudio)
56 self[sAudio+"DelayInfo"] = Label(_("%i ms")%self.AC3delay.systemDelay[sAudio])
59 self["AC3TableTab"] = MultiPixmap()
60 self["AC3GLOBTableTab"] = MultiPixmap()
61 self["PCMTableTab"] = MultiPixmap()
62 self["PCMGLOBTableTab"] = MultiPixmap()
64 self["AC3TableTabLabel"] = MultiColorLabel( _("Passthrough"))
65 self["AC3GLOBTableTabLabel"] = MultiColorLabel( _("Global Passthr."))
66 self["PCMTableTabLabel"] = MultiColorLabel( _("PCM"))
67 self["PCMGLOBTableTabLabel"] = MultiColorLabel( _("Global PCM"))
70 self["AudioSliderBar"] = ProgressBar()
71 self["AudioSlider"] = Label(_("%i ms")%self.AC3delay.systemDelay[self.AC3delay.whichAudio])
72 self["AudioSliderLabel"] = Label( _("Delay:"))
75 self["ServiceInfoLabel"] = Label(_("Channel audio:"))
76 self["ServiceInfo"] = Label()
77 self.setChannelInfoText()
80 self["key_red"] = Label(_("Cancel"))
81 self["key_green"] = Label(_("OK"))
82 self["key_yellow"] = Label(_("Switch audio"))
83 self["key_blue"] = Label("Save to key")
86 self["actions"] = HelpableNumberActionMap(self, "PluginAudioSyncActions",
88 "menu": (self.keyMenu, _("Open plugin menu")),
89 "ok": (self.keyOk, _("Save values and close plugin")),
90 "cancel": (self.keyCancel, _("Discard changes and close plugin")),
91 "left": (self.keyLeft, _("Decrease delay")),
92 "right": (self.keyRight, _("Increase delay")),
93 "up": (self.keyUp, _("Change active delay")),
94 "down": (self.keyDown, _("Change active delay")),
95 "red": (self.keyCancel, _("Discard changes and close plugin")),
96 "green": (self.keyOk, _("Save values and close plugin")),
97 "yellow": (self.keyAudioSelection, _("Select channel audio")),
98 "blue": (self.menuSaveDelayToKey, _("Save current delay to key")),
99 "1": (self.keyNumberRelative, _("Decrease delay by %i ms (can be set)")%self.stepSize["1"]),
100 "3": (self.keyNumberRelative, _("Increase delay by %i ms (can be set)")%self.stepSize["3"]),
101 "4": (self.keyNumberRelative, _("Decrease delay by %i ms (can be set)")%self.stepSize["4"]),
102 "6": (self.keyNumberRelative, _("Increase delay by %i ms (can be set)")%self.stepSize["6"]),
103 "7": (self.keyNumberRelative, _("Decrease delay by %i ms (can be set)")%self.stepSize["7"]),
104 "9": (self.keyNumberRelative, _("Increase delay by %i ms (can be set)")%self.stepSize["9"]),
105 "0": (self.keyNumberAbsolute, _("Set delay to %i ms (can be set)")%self.keyStep["0"]),
106 "2": (self.keyNumberAbsolute, _("Set delay to %i ms (can be set)")%self.keyStep["2"]),
107 "5": (self.keyNumberAbsolute, _("Set delay to %i ms (can be set)")%self.keyStep["5"]),
108 "8": (self.keyNumberAbsolute, _("Set delay to %i ms (can be set)")%self.keyStep["8"])
111 HelpableScreen.__init__(self)
114 for sAudio in AC3PCM:
115 iDelay = self.AC3delay.getSystemDelay(sAudio)
116 self.savedValue[sAudio] = iDelay
117 self.currentValue[sAudio] = iDelay
118 if sAudio == self.AC3delay.whichAudio:
119 self["AudioSliderBar"].setRange([(self.lowerBound), (self.upperBound)])
120 self["AudioSliderBar"].setValue(iDelay-self.lowerBound)
121 self["AudioSlider"].setText(_("%i ms")%iDelay)
125 self[ sAudio + "TableTabLabel"].setForegroundColorNum(iNum)
126 self[ sAudio + "TableTab"].setPixmapNum(iNum)
130 def movePosition(self):
131 if config.plugins.AC3LipSync.position_x.value != 0 or config.plugins.AC3LipSync.position_y.value != 0:
132 self.instance.move(ePoint(config.plugins.AC3LipSync.position_x.value, config.plugins.AC3LipSync.position_y.value))
136 if self.AC3delay.whichAudio == PCMGLOB:
137 self.AC3delay.whichAudio = PCM
138 elif self.AC3delay.whichAudio == PCM:
139 self.AC3delay.whichAudio = AC3GLOB
140 elif self.AC3delay.whichAudio == AC3GLOB:
141 self.AC3delay.whichAudio = AC3
143 self.AC3delay.whichAudio = PCMGLOB
145 self.setActiveSlider()
148 if self.AC3delay.whichAudio == AC3:
149 self.AC3delay.whichAudio = AC3GLOB
150 elif self.AC3delay.whichAudio == AC3GLOB:
151 self.AC3delay.whichAudio = PCM
152 elif self.AC3delay.whichAudio == PCM:
153 self.AC3delay.whichAudio = PCMGLOB
155 self.AC3delay.whichAudio = AC3
157 self.setActiveSlider()
159 def setActiveSlider(self):
160 # Reset colors of all tabs
161 for sAudio in AC3PCM:
162 if sAudio == self.AC3delay.whichAudio:
166 self[ sAudio + "TableTabLabel"].setForegroundColorNum(iNum)
167 self[ sAudio + "TableTab"].setPixmapNum(iNum)
168 iCurDelay = self.currentValue[self.AC3delay.whichAudio]
169 iDelay = iCurDelay - self.lowerBound
170 self["AudioSliderBar"].setValue(iDelay)
171 self["AudioSlider"].setText(_("%i ms")%iCurDelay)
174 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
177 iStep = -1 * self.arrowStepSize
178 self.changeSliderValue(iStep)
181 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
184 iStep = self.arrowStepSize
185 self.changeSliderValue(iStep)
187 def keyNumberAbsolute(self, number):
188 sAudio = self.AC3delay.whichAudio
189 sNumber = str(number)
190 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
191 iStep = ( self.keyStep[sNumber] // 25 ) * 25
193 iStep = self.keyStep[sNumber]
194 iSliderValue = iStep-self.lowerBound
195 self.setSliderInfo(iSliderValue)
196 self.AC3delay.setSystemDelay(sAudio, self.currentValue[sAudio], True)
198 def keyNumberRelative(self, number):
199 sNumber = str(number)
200 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
201 iStep = ( self.stepSize[sNumber] // 25 ) * 25
203 iStep = self.stepSize[sNumber]
205 self.changeSliderValue(iStep)
207 def changeSliderValue(self,iValue):
208 sAudio = self.AC3delay.whichAudio
209 iSliderValue = int(self["AudioSliderBar"].getValue())
210 iSliderValue += iValue
213 elif iSliderValue > (self.upperBound - self.lowerBound):
214 iSliderValue = (self.upperBound - self.lowerBound)
215 self.setSliderInfo(iSliderValue)
216 self.AC3delay.setSystemDelay(sAudio, self.currentValue[sAudio], True)
218 def keyAudioSelection(self):
219 self.audioSelection()
225 for sAudio in AC3PCM:
226 iSliderValue = self.currentValue[sAudio]
227 if iSliderValue <> self.savedValue[sAudio]:
228 self.AC3delay.whichAudio = sAudio
229 self.AC3delay.setSystemDelay(sAudio, self.savedValue[sAudio], False)
233 sAudio = self.AC3delay.whichAudio
234 iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
236 (_("Move plugin screen"),"1")
239 self.session.openWithCallback(self.DoShowMenu,ChoiceBox,_("Menu"),keyList)
241 def DoShowMenu(self, answer):
242 if answer is not None:
244 self.session.openWithCallback(self.positionerCallback,AC3Positioner,self.skin_path)
246 sResponse = _("Invalid selection")
247 iType = MessageBox.TYPE_ERROR
248 self.session.open(MessageBox, sResponse , iType)
250 def menuSaveDelayToKey(self):
251 sAudio = self.AC3delay.whichAudio
252 iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
254 AC3SetCustomValue(self.session,iDelay,self.keyStep)
256 def positionerCallback(self):
259 def setSliderInfo(self, iDelay):
260 sAudio = self.AC3delay.whichAudio
261 self.currentValue[sAudio] = iDelay + self.lowerBound
262 iCurDelay = self.currentValue[sAudio]
263 self["AudioSliderBar"].setValue(iDelay)
264 self["AudioSlider"].setText(_("%i ms")%iCurDelay)
266 def setChannelInfoText(self):
267 sActiveAudio = str(self.AC3delay.selectedAudioInfo[0])
268 sBitstreamDelay = _("%i ms") %self.AC3delay.systemDelay[AC3]
269 sPCMDelay = _("%i ms") %self.AC3delay.systemDelay[PCM]
271 self["ServiceInfo"].setText(sActiveAudio)
272 self["AC3DelayInfo"].setText(sBitstreamDelay)
273 self["PCMDelayInfo"].setText(sPCMDelay)
275 def audioSelected(self, audio):
276 InfoBarAudioSelection.audioSelected(self, audio)
277 if audio is not None:
278 self.AC3delay.getAudioInformation()
279 self.setChannelInfoText()
280 self.setActiveSlider()
282 class AC3SetCustomValue:
283 def __init__(self, session, iDelay, keyStep):
284 self.keyStep = keyStep
285 self.session = session
287 self.session.openWithCallback(self.DoSetCustomValue,ChoiceBox,_("Select the key you want to set to %i ms") %(iDelay),self.getKeyList())
289 def getKeyList(self):
291 for i,iValue in self.keyStep.iteritems():
293 keyList.append((_("Key %(key)s (current value: %(value)i ms)") %dict(key=i, value=iValue),i))
296 def DoSetCustomValue(self,answer):
298 self.session.open(MessageBox,_("Setting key canceled"), MessageBox.TYPE_INFO)
299 elif answer[1] in ("2" , "5" , "8"):
301 config.plugins.AC3LipSync.absoluteStep2.setValue(self.iDelay)
302 config.plugins.AC3LipSync.absoluteStep2.save()
303 elif answer[1] == "5":
304 config.plugins.AC3LipSync.absoluteStep5.setValue(self.iDelay)
305 config.plugins.AC3LipSync.absoluteStep5.save()
306 elif answer[1] == "8":
307 config.plugins.AC3LipSync.absoluteStep8.setValue(self.iDelay)
308 config.plugins.AC3LipSync.absoluteStep8.save()
309 self.keyStep[answer[1]] = self.iDelay
310 self.session.open(MessageBox,_("Key %(Key)s successfully set to %(delay)i ms") %dict(Key=answer[1],delay=self.iDelay), MessageBox.TYPE_INFO, 5)
312 self.session.open(MessageBox,_("Invalid selection"), MessageBox.TYPE_ERROR, 5)