1 from AC3utils import AC3, PCM, AC3GLOB, PCMGLOB, AC3PCM, SKIN
2 from AC3delay import AC3delay
3 from enigma import ePoint
4 from HelpableNumberActionMap import HelpableNumberActionMap
5 from Components.Label import Label,MultiColorLabel
6 from Components.Pixmap import MultiPixmap
7 from Components.ProgressBar import ProgressBar
8 from Components.config import config
9 from MovableScreen import MovableScreen
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, MovableScreen, 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)
112 MovableScreen.__init__(self, config.plugins.AC3LipSync, 600, 100)
115 for sAudio in AC3PCM:
116 iDelay = self.AC3delay.getSystemDelay(sAudio)
117 self.savedValue[sAudio] = iDelay
118 self.currentValue[sAudio] = iDelay
119 if sAudio == self.AC3delay.whichAudio:
120 self["AudioSliderBar"].setRange([(self.lowerBound), (self.upperBound)])
121 self["AudioSliderBar"].setValue(iDelay-self.lowerBound)
122 self["AudioSlider"].setText(_("%i ms")%iDelay)
126 self[ sAudio + "TableTabLabel"].setForegroundColorNum(iNum)
127 self[ sAudio + "TableTab"].setPixmapNum(iNum)
132 if self.AC3delay.whichAudio == PCMGLOB:
133 self.AC3delay.whichAudio = PCM
134 elif self.AC3delay.whichAudio == PCM:
135 self.AC3delay.whichAudio = AC3GLOB
136 elif self.AC3delay.whichAudio == AC3GLOB:
137 self.AC3delay.whichAudio = AC3
139 self.AC3delay.whichAudio = PCMGLOB
141 self.setActiveSlider()
144 if self.AC3delay.whichAudio == AC3:
145 self.AC3delay.whichAudio = AC3GLOB
146 elif self.AC3delay.whichAudio == AC3GLOB:
147 self.AC3delay.whichAudio = PCM
148 elif self.AC3delay.whichAudio == PCM:
149 self.AC3delay.whichAudio = PCMGLOB
151 self.AC3delay.whichAudio = AC3
153 self.setActiveSlider()
155 def setActiveSlider(self):
156 # Reset colors of all tabs
157 for sAudio in AC3PCM:
158 if sAudio == self.AC3delay.whichAudio:
162 self[ sAudio + "TableTabLabel"].setForegroundColorNum(iNum)
163 self[ sAudio + "TableTab"].setPixmapNum(iNum)
164 iCurDelay = self.currentValue[self.AC3delay.whichAudio]
165 iDelay = iCurDelay - self.lowerBound
166 self["AudioSliderBar"].setValue(iDelay)
167 self["AudioSlider"].setText(_("%i ms")%iCurDelay)
170 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
173 iStep = -1 * self.arrowStepSize
174 self.changeSliderValue(iStep)
177 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
180 iStep = self.arrowStepSize
181 self.changeSliderValue(iStep)
183 def keyNumberAbsolute(self, number):
184 sAudio = self.AC3delay.whichAudio
185 sNumber = str(number)
186 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
187 iStep = ( self.keyStep[sNumber] // 25 ) * 25
189 iStep = self.keyStep[sNumber]
190 iSliderValue = iStep-self.lowerBound
191 self.setSliderInfo(iSliderValue)
192 self.AC3delay.setSystemDelay(sAudio, self.currentValue[sAudio], True)
194 def keyNumberRelative(self, number):
195 sNumber = str(number)
196 if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
197 iStep = ( self.stepSize[sNumber] // 25 ) * 25
199 iStep = self.stepSize[sNumber]
201 self.changeSliderValue(iStep)
203 def changeSliderValue(self,iValue):
204 sAudio = self.AC3delay.whichAudio
205 iSliderValue = int(self["AudioSliderBar"].getValue())
206 iSliderValue += iValue
209 elif iSliderValue > (self.upperBound - self.lowerBound):
210 iSliderValue = (self.upperBound - self.lowerBound)
211 self.setSliderInfo(iSliderValue)
212 self.AC3delay.setSystemDelay(sAudio, self.currentValue[sAudio], True)
214 def keyAudioSelection(self):
215 self.audioSelection()
221 for sAudio in AC3PCM:
222 iSliderValue = self.currentValue[sAudio]
223 if iSliderValue <> self.savedValue[sAudio]:
224 self.AC3delay.whichAudio = sAudio
225 self.AC3delay.setSystemDelay(sAudio, self.savedValue[sAudio], False)
229 sAudio = self.AC3delay.whichAudio
230 iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
232 (_("Move plugin screen"),"1")
235 self.session.openWithCallback(self.DoShowMenu,ChoiceBox,_("Menu"),keyList)
237 def DoShowMenu(self, answer):
238 if answer is not None:
240 self.startMoving([self["actions"]])
242 sResponse = _("Invalid selection")
243 iType = MessageBox.TYPE_ERROR
244 self.session.open(MessageBox, sResponse , iType)
246 def menuSaveDelayToKey(self):
247 sAudio = self.AC3delay.whichAudio
248 iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
250 AC3SetCustomValue(self.session,iDelay,self.keyStep)
252 def setSliderInfo(self, iDelay):
253 sAudio = self.AC3delay.whichAudio
254 self.currentValue[sAudio] = iDelay + self.lowerBound
255 iCurDelay = self.currentValue[sAudio]
256 self["AudioSliderBar"].setValue(iDelay)
257 self["AudioSlider"].setText(_("%i ms")%iCurDelay)
259 def setChannelInfoText(self):
260 sActiveAudio = str(self.AC3delay.selectedAudioInfo[0])
261 sBitstreamDelay = _("%i ms") %self.AC3delay.systemDelay[AC3]
262 sPCMDelay = _("%i ms") %self.AC3delay.systemDelay[PCM]
264 self["ServiceInfo"].setText(sActiveAudio)
265 self["AC3DelayInfo"].setText(sBitstreamDelay)
266 self["PCMDelayInfo"].setText(sPCMDelay)
268 def audioSelected(self, audio):
269 InfoBarAudioSelection.audioSelected(self, audio)
270 if audio is not None:
271 self.AC3delay.getAudioInformation()
272 self.setChannelInfoText()
273 self.setActiveSlider()
275 class AC3SetCustomValue:
276 def __init__(self, session, iDelay, keyStep):
277 self.keyStep = keyStep
278 self.session = session
280 self.session.openWithCallback(self.DoSetCustomValue,ChoiceBox,_("Select the key you want to set to %i ms") %(iDelay),self.getKeyList())
282 def getKeyList(self):
284 for i,iValue in self.keyStep.iteritems():
286 keyList.append((_("Key %(key)s (current value: %(value)i ms)") %dict(key=i, value=iValue),i))
289 def DoSetCustomValue(self,answer):
291 self.session.open(MessageBox,_("Setting key canceled"), MessageBox.TYPE_INFO)
292 elif answer[1] in ("2" , "5" , "8"):
294 config.plugins.AC3LipSync.absoluteStep2.setValue(self.iDelay)
295 config.plugins.AC3LipSync.absoluteStep2.save()
296 elif answer[1] == "5":
297 config.plugins.AC3LipSync.absoluteStep5.setValue(self.iDelay)
298 config.plugins.AC3LipSync.absoluteStep5.save()
299 elif answer[1] == "8":
300 config.plugins.AC3LipSync.absoluteStep8.setValue(self.iDelay)
301 config.plugins.AC3LipSync.absoluteStep8.save()
302 self.keyStep[answer[1]] = self.iDelay
303 self.session.open(MessageBox,_("Key %(Key)s successfully set to %(delay)i ms") %dict(Key=answer[1],delay=self.iDelay), MessageBox.TYPE_INFO, 5)
305 self.session.open(MessageBox,_("Invalid selection"), MessageBox.TYPE_ERROR, 5)