Version 1.0b2: Made moving- code reusable. Rework skin, fixed fonts- bug
[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 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 _
17
18 class AC3LipSync(Screen, HelpableScreen, MovableScreen, InfoBarAudioSelection):
19
20     def __init__(self, session, plugin_path):
21         Screen.__init__(self, session)
22         self.onShow.append(self.__onShow)
23         self.skin = SKIN
24         self.skin_path = plugin_path
25
26         #Initialisiere Infobargenerics
27         InfoBarAudioSelection.__init__(self)
28
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())
33         self.stepSize = {}
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"]
40         self.keyStep = {}
41         self.keyStep["0"] = 0
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()) 
45
46         # AC3delay instance
47         self.AC3delay = AC3delay()
48
49         # Last saved values
50         self.savedValue = {}
51         # Current Values
52         self.currentValue = {}
53         
54         #Delay information
55         for sAudio in AC3PCM:
56             self[sAudio+"DelayInfoLabel"] = Label( _("%s:")%sAudio)
57             self[sAudio+"DelayInfo"] = Label(_("%i ms")%self.AC3delay.systemDelay[sAudio])
58
59         #Tabbed table labels
60         self["AC3TableTab"] = MultiPixmap()
61         self["AC3GLOBTableTab"] = MultiPixmap()
62         self["PCMTableTab"] = MultiPixmap()
63         self["PCMGLOBTableTab"] = MultiPixmap()
64         
65         self["AC3TableTabLabel"] = MultiColorLabel( _("Passthrough"))
66         self["AC3GLOBTableTabLabel"] = MultiColorLabel( _("Global Passthr."))
67         self["PCMTableTabLabel"] = MultiColorLabel( _("PCM"))
68         self["PCMGLOBTableTabLabel"] = MultiColorLabel( _("Global PCM"))
69
70         # Slider
71         self["AudioSliderBar"] = ProgressBar()
72         self["AudioSlider"] = Label(_("%i ms")%self.AC3delay.systemDelay[self.AC3delay.whichAudio])
73         self["AudioSliderLabel"] = Label( _("Delay:"))
74         
75         #Service Information
76         self["ServiceInfoLabel"] = Label(_("Channel audio:"))
77         self["ServiceInfo"] = Label()
78         self.setChannelInfoText()
79
80         # Buttons
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")
85
86         # Actions
87         self["actions"] = HelpableNumberActionMap(self, "PluginAudioSyncActions",
88         {
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"])
110         }, -1)
111
112         HelpableScreen.__init__(self)
113         MovableScreen.__init__(self, config.plugins.AC3LipSync, 600, 100)
114         
115     def __onShow(self):
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)
124                 iNum = 1
125             else:
126                 iNum = 0
127             self[ sAudio + "TableTabLabel"].setForegroundColorNum(iNum)
128             self[ sAudio + "TableTab"].setPixmapNum(iNum)
129             
130         self.movePosition()
131
132     def keyUp(self):
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
139         else:
140             self.AC3delay.whichAudio = PCMGLOB
141         
142         self.setActiveSlider()
143
144     def keyDown(self):
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
151         else:
152             self.AC3delay.whichAudio = AC3
153
154         self.setActiveSlider()
155
156     def setActiveSlider(self):
157         # Reset colors of all tabs
158         for sAudio in AC3PCM:
159             if sAudio == self.AC3delay.whichAudio:
160                 iNum = 1
161             else: 
162                 iNum = 0
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)
169
170     def keyLeft(self):
171         if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
172             iStep = -25
173         else:
174             iStep = -1 * self.arrowStepSize
175         self.changeSliderValue(iStep)
176         
177     def keyRight(self):
178         if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
179             iStep = 25
180         else:
181             iStep = self.arrowStepSize
182         self.changeSliderValue(iStep)
183
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
189         else:
190             iStep = self.keyStep[sNumber]        
191         iSliderValue = iStep-self.lowerBound
192         self.setSliderInfo(iSliderValue)
193         self.AC3delay.setSystemDelay(sAudio, self.currentValue[sAudio], True)
194
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
199         else:
200             iStep = self.stepSize[sNumber]
201
202         self.changeSliderValue(iStep)
203
204     def changeSliderValue(self,iValue):
205         sAudio = self.AC3delay.whichAudio
206         iSliderValue = int(self["AudioSliderBar"].getValue())
207         iSliderValue += iValue
208         if iSliderValue < 0:
209             iSliderValue = 0
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)        
214
215     def keyAudioSelection(self):
216         self.audioSelection()
217
218     def keyOk(self):
219         self.close()
220
221     def keyCancel(self):
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)
227         self.close()
228
229     def keyMenu(self):
230         sAudio = self.AC3delay.whichAudio
231         iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
232         keyList = [
233             (_("Move plugin screen"),"1")
234         ]
235
236         self.session.openWithCallback(self.DoShowMenu,ChoiceBox,_("Menu"),keyList)
237     
238     def DoShowMenu(self, answer):
239         if answer is not None:
240             if answer[1] == "1":
241                 self.startMoving([self["actions"]])
242             else:
243                 sResponse = _("Invalid selection")
244                 iType = MessageBox.TYPE_ERROR
245                 self.session.open(MessageBox, sResponse , iType)
246                 
247     def menuSaveDelayToKey(self):
248         sAudio = self.AC3delay.whichAudio
249         iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
250
251         AC3SetCustomValue(self.session,iDelay,self.keyStep)
252         
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)
259
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]
264
265         self["ServiceInfo"].setText(sActiveAudio)
266         self["AC3DelayInfo"].setText(sBitstreamDelay)
267         self["PCMDelayInfo"].setText(sPCMDelay)
268
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()
275             
276 class AC3SetCustomValue:
277     def __init__(self, session, iDelay, keyStep):
278         self.keyStep = keyStep
279         self.session = session
280         self.iDelay = iDelay
281         self.session.openWithCallback(self.DoSetCustomValue,ChoiceBox,_("Select the key you want to set to %i ms") %(iDelay),self.getKeyList())
282
283     def getKeyList(self):
284         keyList = []
285         for i,iValue in self.keyStep.iteritems():
286             if i != "0":
287                 keyList.append((_("Key %(key)s (current value: %(value)i ms)") %dict(key=i, value=iValue),i))
288         return keyList
289
290     def DoSetCustomValue(self,answer):
291         if answer is None:
292             self.session.open(MessageBox,_("Setting key canceled"), MessageBox.TYPE_INFO)
293         elif answer[1] in ("2" , "5" , "8"):
294             if answer[1] == "2":
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)
305         else:
306             self.session.open(MessageBox,_("Invalid selection"), MessageBox.TYPE_ERROR, 5)