f8fdc8c6d9048e4bca97b3b6bf6af1544aa70c1c
[vuplus_dvbapp-plugin] / ac3lipsync / src / AC3main.py
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 _
16
17 class AC3LipSync(Screen, HelpableScreen, InfoBarAudioSelection):
18
19     def __init__(self, session, plugin_path):
20         Screen.__init__(self, session)
21         self.onShow.append(self.__onShow)
22         self.skin = SKIN
23         self.skin_path = plugin_path
24
25         #Initialisiere Infobargenerics
26         InfoBarAudioSelection.__init__(self)
27
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())
32         self.stepSize = {}
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"]
39         self.keyStep = {}
40         self.keyStep["0"] = 0
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()) 
44
45         # AC3delay instance
46         self.AC3delay = AC3delay()
47
48         # Last saved values
49         self.savedValue = {}
50         # Current Values
51         self.currentValue = {}
52         
53         #Delay information
54         for sAudio in AC3PCM:
55             self[sAudio+"DelayInfoLabel"] = Label( _("%s:")%sAudio)
56             self[sAudio+"DelayInfo"] = Label(_("%i ms")%self.AC3delay.systemDelay[sAudio])
57
58         #Tabbed table labels
59         self["AC3TableTab"] = MultiPixmap()
60         self["AC3GLOBTableTab"] = MultiPixmap()
61         self["PCMTableTab"] = MultiPixmap()
62         self["PCMGLOBTableTab"] = MultiPixmap()
63         
64         self["AC3TableTabLabel"] = MultiColorLabel( _("Passthrough"))
65         self["AC3GLOBTableTabLabel"] = MultiColorLabel( _("Global Passthr."))
66         self["PCMTableTabLabel"] = MultiColorLabel( _("PCM"))
67         self["PCMGLOBTableTabLabel"] = MultiColorLabel( _("Global PCM"))
68
69         # Slider
70         self["AudioSliderBar"] = ProgressBar()
71         self["AudioSlider"] = Label(_("%i ms")%self.AC3delay.systemDelay[self.AC3delay.whichAudio])
72         self["AudioSliderLabel"] = Label( _("Delay:"))
73         
74         #Service Information
75         self["ServiceInfoLabel"] = Label(_("Channel audio:"))
76         self["ServiceInfo"] = Label()
77         self.setChannelInfoText()
78
79         # Buttons
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")
84
85         # Actions
86         self["actions"] = HelpableNumberActionMap(self, "PluginAudioSyncActions",
87         {
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"])
109         }, -1)
110
111         HelpableScreen.__init__(self)
112         
113     def __onShow(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)
122                 iNum = 1
123             else:
124                 iNum = 0
125             self[ sAudio + "TableTabLabel"].setForegroundColorNum(iNum)
126             self[ sAudio + "TableTab"].setPixmapNum(iNum)
127             
128         self.movePosition()
129
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))
133
134
135     def keyUp(self):
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
142         else:
143             self.AC3delay.whichAudio = PCMGLOB
144         
145         self.setActiveSlider()
146
147     def keyDown(self):
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
154         else:
155             self.AC3delay.whichAudio = AC3
156
157         self.setActiveSlider()
158
159     def setActiveSlider(self):
160         # Reset colors of all tabs
161         for sAudio in AC3PCM:
162             if sAudio == self.AC3delay.whichAudio:
163                 iNum = 1
164             else: 
165                 iNum = 0
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)
172
173     def keyLeft(self):
174         if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
175             iStep = -25
176         else:
177             iStep = -1 * self.arrowStepSize
178         self.changeSliderValue(iStep)
179         
180     def keyRight(self):
181         if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
182             iStep = 25
183         else:
184             iStep = self.arrowStepSize
185         self.changeSliderValue(iStep)
186
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
192         else:
193             iStep = self.keyStep[sNumber]        
194         iSliderValue = iStep-self.lowerBound
195         self.setSliderInfo(iSliderValue)
196         self.AC3delay.setSystemDelay(sAudio, self.currentValue[sAudio], True)
197
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
202         else:
203             iStep = self.stepSize[sNumber]
204
205         self.changeSliderValue(iStep)
206
207     def changeSliderValue(self,iValue):
208         sAudio = self.AC3delay.whichAudio
209         iSliderValue = int(self["AudioSliderBar"].getValue())
210         iSliderValue += iValue
211         if iSliderValue < 0:
212             iSliderValue = 0
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)        
217
218     def keyAudioSelection(self):
219         self.audioSelection()
220
221     def keyOk(self):
222         self.close()
223
224     def keyCancel(self):
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)
230         self.close()
231
232     def keyMenu(self):
233         sAudio = self.AC3delay.whichAudio
234         iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
235         keyList = [
236             (_("Move plugin screen"),"1")
237         ]
238
239         self.session.openWithCallback(self.DoShowMenu,ChoiceBox,_("Menu"),keyList)
240     
241     def DoShowMenu(self, answer):
242         if answer is not None:
243             if answer[1] == "1":
244                 self.session.openWithCallback(self.positionerCallback,AC3Positioner,self.skin_path)    
245             else:
246                 sResponse = _("Invalid selection")
247                 iType = MessageBox.TYPE_ERROR
248                 self.session.open(MessageBox, sResponse , iType)
249                 
250     def menuSaveDelayToKey(self):
251         sAudio = self.AC3delay.whichAudio
252         iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
253
254         AC3SetCustomValue(self.session,iDelay,self.keyStep)
255     
256     def positionerCallback(self):
257         self.movePosition()
258     
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)
265
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]
270
271         self["ServiceInfo"].setText(sActiveAudio)
272         self["AC3DelayInfo"].setText(sBitstreamDelay)
273         self["PCMDelayInfo"].setText(sPCMDelay)
274
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()
281             
282 class AC3SetCustomValue:
283     def __init__(self, session, iDelay, keyStep):
284         self.keyStep = keyStep
285         self.session = session
286         self.iDelay = iDelay
287         self.session.openWithCallback(self.DoSetCustomValue,ChoiceBox,_("Select the key you want to set to %i ms") %(iDelay),self.getKeyList())
288
289     def getKeyList(self):
290         keyList = []
291         for i,iValue in self.keyStep.iteritems():
292             if i != "0":
293                 keyList.append((_("Key %(key)s (current value: %(value)i ms)") %dict(key=i, value=iValue),i))
294         return keyList
295
296     def DoSetCustomValue(self,answer):
297         if answer is None:
298             self.session.open(MessageBox,_("Setting key canceled"), MessageBox.TYPE_INFO)
299         elif answer[1] in ("2" , "5" , "8"):
300             if answer[1] == "2":
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)
311         else:
312             self.session.open(MessageBox,_("Invalid selection"), MessageBox.TYPE_ERROR, 5)