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 MovableScreen import MovableScreen
11 from Screens.ChoiceBox import ChoiceBox
12 from Screens.HelpMenu import HelpableScreen
13 from Screens.MessageBox import MessageBox
14 from Screens.Screen import Screen
15 from Screens.InfoBarGenerics import InfoBarAudioSelection
16 from __init__ import _
18 class AC3LipSync(Screen, HelpableScreen, MovableScreen, InfoBarAudioSelection):
20 def __init__(self, session, plugin_path):
21 Screen.__init__(self, session)
22 self.onShow.append(self.__onShow)
24 self.skin_path = plugin_path
26 #Initialisiere Infobargenerics
27 InfoBarAudioSelection.__init__(self)
29 # Configuration values
30 self.upperBound = int(config.plugins.AC3LipSync.outerBounds.getValue())
31 self.lowerBound = -1 * self.upperBound
32 self.arrowStepSize = int(config.plugins.AC3LipSync.arrowStepSize.getValue())
34 self.stepSize["3"] = int(config.plugins.AC3LipSync.stepSize13.getValue())
35 self.stepSize["1"] = -1 * self.stepSize["3"]
36 self.stepSize["6"] = int(config.plugins.AC3LipSync.stepSize46.getValue())
37 self.stepSize["4"] = -1 * self.stepSize["6"]
38 self.stepSize["9"] = int(config.plugins.AC3LipSync.stepSize79.getValue())
39 self.stepSize["7"] = -1 * self.stepSize["9"]
42 self.keyStep["2"] = int(config.plugins.AC3LipSync.absoluteStep2.getValue())
43 self.keyStep["5"] = int(config.plugins.AC3LipSync.absoluteStep5.getValue())
44 self.keyStep["8"] = int(config.plugins.AC3LipSync.absoluteStep8.getValue())
47 self.AC3delay = AC3delay()
52 self.currentValue = {}
56 self[sAudio+"DelayInfoLabel"] = Label( _("%s:")%sAudio)
57 self[sAudio+"DelayInfo"] = Label(_("%i ms")%self.AC3delay.systemDelay[sAudio])
60 self["AC3TableTab"] = MultiPixmap()
61 self["AC3GLOBTableTab"] = MultiPixmap()
62 self["PCMTableTab"] = MultiPixmap()
63 self["PCMGLOBTableTab"] = MultiPixmap()
65 self["AC3TableTabLabel"] = MultiColorLabel( _("Passthrough"))
66 self["AC3GLOBTableTabLabel"] = MultiColorLabel( _("Global Passthr."))
67 self["PCMTableTabLabel"] = MultiColorLabel( _("PCM"))
68 self["PCMGLOBTableTabLabel"] = MultiColorLabel( _("Global PCM"))
71 self["AudioSliderBar"] = ProgressBar()
72 self["AudioSlider"] = Label(_("%i ms")%self.AC3delay.systemDelay[self.AC3delay.whichAudio])
73 self["AudioSliderLabel"] = Label( _("Delay:"))
76 self["ServiceInfoLabel"] = Label(_("Channel audio:"))
77 self["ServiceInfo"] = Label()
78 self.setChannelInfoText()
81 self["key_red"] = Label(_("Cancel"))
82 self["key_green"] = Label(_("OK"))
83 self["key_yellow"] = Label(_("Switch audio"))
84 self["key_blue"] = Label("Save to key")
87 self["actions"] = HelpableNumberActionMap(self, "PluginAudioSyncActions",
89 "menu": (self.keyMenu, _("Open plugin menu")),
90 "ok": (self.keyOk, _("Save values and close plugin")),
91 "cancel": (self.keyCancel, _("Discard changes and close plugin")),
92 "left": (self.keyLeft, _("Decrease delay")),
93 "right": (self.keyRight, _("Increase delay")),
94 "up": (self.keyUp, _("Change active delay")),
95 "down": (self.keyDown, _("Change active delay")),
96 "red": (self.keyCancel, _("Discard changes and close plugin")),
97 "green": (self.keyOk, _("Save values and close plugin")),
98 "yellow": (self.keyAudioSelection, _("Select channel audio")),
99 "blue": (self.menuSaveDelayToKey, _("Save current delay to key")),
100 "1": (self.keyNumberRelative, _("Decrease delay by %i ms (can be set)")%self.stepSize["1"]),
101 "3": (self.keyNumberRelative, _("Increase delay by %i ms (can be set)")%self.stepSize["3"]),
102 "4": (self.keyNumberRelative, _("Decrease delay by %i ms (can be set)")%self.stepSize["4"]),
103 "6": (self.keyNumberRelative, _("Increase delay by %i ms (can be set)")%self.stepSize["6"]),
104 "7": (self.keyNumberRelative, _("Decrease delay by %i ms (can be set)")%self.stepSize["7"]),
105 "9": (self.keyNumberRelative, _("Increase delay by %i ms (can be set)")%self.stepSize["9"]),
106 "0": (self.keyNumberAbsolute, _("Set delay to %i ms (can be set)")%self.keyStep["0"]),
107 "2": (self.keyNumberAbsolute, _("Set delay to %i ms (can be set)")%self.keyStep["2"]),
108 "5": (self.keyNumberAbsolute, _("Set delay to %i ms (can be set)")%self.keyStep["5"]),
109 "8": (self.keyNumberAbsolute, _("Set delay to %i ms (can be set)")%self.keyStep["8"])
112 HelpableScreen.__init__(self)
113 MovableScreen.__init__(self, config.plugins.AC3LipSync, 600, 100)
116 for sAudio in AC3PCM:
117 iDelay = self.AC3delay.getSystemDelay(sAudio)
118 self.savedValue[sAudio] = iDelay
119 self.currentValue[sAudio] = iDelay
120 if sAudio == self.AC3delay.whichAudio:
121 self["AudioSliderBar"].setRange([(self.lowerBound), (self.upperBound)])
122 self["AudioSliderBar"].setValue(iDelay-self.lowerBound)
123 self["AudioSlider"].setText(_("%i ms")%iDelay)
127 self[ sAudio + "TableTabLabel"].setForegroundColorNum(iNum)
128 self[ sAudio + "TableTab"].setPixmapNum(iNum)
133 if self.AC3delay.whichAudio == PCMGLOB:
134 self.AC3delay.whichAudio = PCM
135 elif self.AC3delay.whichAudio == PCM:
136 self.AC3delay.whichAudio = AC3GLOB
137 elif self.AC3delay.whichAudio == AC3GLOB:
138 self.AC3delay.whichAudio = AC3
140 self.AC3delay.whichAudio = PCMGLOB
142 self.setActiveSlider()
145 if self.AC3delay.whichAudio == AC3:
146 self.AC3delay.whichAudio = AC3GLOB
147 elif self.AC3delay.whichAudio == AC3GLOB:
148 self.AC3delay.whichAudio = PCM
149 elif self.AC3delay.whichAudio == PCM:
150 self.AC3delay.whichAudio = PCMGLOB
152 self.AC3delay.whichAudio = AC3
154 self.setActiveSlider()
156 def setActiveSlider(self):
157 # Reset colors of all tabs
158 for sAudio in AC3PCM:
159 if sAudio == self.AC3delay.whichAudio:
163 self[ sAudio + "TableTabLabel"].setForegroundColorNum(iNum)
164 self[ sAudio + "TableTab"].setPixmapNum(iNum)
165 iCurDelay = self.currentValue[self.AC3delay.whichAudio]
166 iDelay = iCurDelay - self.lowerBound
167 self["AudioSliderBar"].setValue(iDelay)
168 self["AudioSlider"].setText(_("%i ms")%iCurDelay)
171 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
174 iStep = -1 * self.arrowStepSize
175 self.changeSliderValue(iStep)
178 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
181 iStep = self.arrowStepSize
182 self.changeSliderValue(iStep)
184 def keyNumberAbsolute(self, number):
185 sAudio = self.AC3delay.whichAudio
186 sNumber = str(number)
187 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
188 iStep = ( self.keyStep[sNumber] // 25 ) * 25
190 iStep = self.keyStep[sNumber]
191 iSliderValue = iStep-self.lowerBound
192 self.setSliderInfo(iSliderValue)
193 self.AC3delay.setSystemDelay(sAudio, self.currentValue[sAudio], True)
195 def keyNumberRelative(self, number):
196 sNumber = str(number)
197 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
198 iStep = ( self.stepSize[sNumber] // 25 ) * 25
200 iStep = self.stepSize[sNumber]
202 self.changeSliderValue(iStep)
204 def changeSliderValue(self,iValue):
205 sAudio = self.AC3delay.whichAudio
206 iSliderValue = int(self["AudioSliderBar"].getValue())
207 iSliderValue += iValue
210 elif iSliderValue > (self.upperBound - self.lowerBound):
211 iSliderValue = (self.upperBound - self.lowerBound)
212 self.setSliderInfo(iSliderValue)
213 self.AC3delay.setSystemDelay(sAudio, self.currentValue[sAudio], True)
215 def keyAudioSelection(self):
216 self.audioSelection()
222 for sAudio in AC3PCM:
223 iSliderValue = self.currentValue[sAudio]
224 if iSliderValue <> self.savedValue[sAudio]:
225 self.AC3delay.whichAudio = sAudio
226 self.AC3delay.setSystemDelay(sAudio, self.savedValue[sAudio], False)
230 sAudio = self.AC3delay.whichAudio
231 iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
233 (_("Move plugin screen"),"1")
236 self.session.openWithCallback(self.DoShowMenu,ChoiceBox,_("Menu"),keyList)
238 def DoShowMenu(self, answer):
239 if answer is not None:
241 self.startMoving([self["actions"]])
243 sResponse = _("Invalid selection")
244 iType = MessageBox.TYPE_ERROR
245 self.session.open(MessageBox, sResponse , iType)
247 def menuSaveDelayToKey(self):
248 sAudio = self.AC3delay.whichAudio
249 iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
251 AC3SetCustomValue(self.session,iDelay,self.keyStep)
253 def setSliderInfo(self, iDelay):
254 sAudio = self.AC3delay.whichAudio
255 self.currentValue[sAudio] = iDelay + self.lowerBound
256 iCurDelay = self.currentValue[sAudio]
257 self["AudioSliderBar"].setValue(iDelay)
258 self["AudioSlider"].setText(_("%i ms")%iCurDelay)
260 def setChannelInfoText(self):
261 sActiveAudio = str(self.AC3delay.selectedAudioInfo[0])
262 sBitstreamDelay = _("%i ms") %self.AC3delay.systemDelay[AC3]
263 sPCMDelay = _("%i ms") %self.AC3delay.systemDelay[PCM]
265 self["ServiceInfo"].setText(sActiveAudio)
266 self["AC3DelayInfo"].setText(sBitstreamDelay)
267 self["PCMDelayInfo"].setText(sPCMDelay)
269 def audioSelected(self, audio):
270 InfoBarAudioSelection.audioSelected(self, audio)
271 if audio is not None:
272 self.AC3delay.getAudioInformation()
273 self.setChannelInfoText()
274 self.setActiveSlider()
276 class AC3SetCustomValue:
277 def __init__(self, session, iDelay, keyStep):
278 self.keyStep = keyStep
279 self.session = session
281 self.session.openWithCallback(self.DoSetCustomValue,ChoiceBox,_("Select the key you want to set to %i ms") %(iDelay),self.getKeyList())
283 def getKeyList(self):
285 for i,iValue in self.keyStep.iteritems():
287 keyList.append((_("Key %(key)s (current value: %(value)i ms)") %dict(key=i, value=iValue),i))
290 def DoSetCustomValue(self,answer):
292 self.session.open(MessageBox,_("Setting key canceled"), MessageBox.TYPE_INFO)
293 elif answer[1] in ("2" , "5" , "8"):
295 config.plugins.AC3LipSync.absoluteStep2.setValue(self.iDelay)
296 config.plugins.AC3LipSync.absoluteStep2.save()
297 elif answer[1] == "5":
298 config.plugins.AC3LipSync.absoluteStep5.setValue(self.iDelay)
299 config.plugins.AC3LipSync.absoluteStep5.save()
300 elif answer[1] == "8":
301 config.plugins.AC3LipSync.absoluteStep8.setValue(self.iDelay)
302 config.plugins.AC3LipSync.absoluteStep8.save()
303 self.keyStep[answer[1]] = self.iDelay
304 self.session.open(MessageBox,_("Key %(Key)s successfully set to %(delay)i ms") %dict(Key=answer[1],delay=self.iDelay), MessageBox.TYPE_INFO, 5)
306 self.session.open(MessageBox,_("Invalid selection"), MessageBox.TYPE_ERROR, 5)