dd1906ba53cddfe8c2db67d1364e86e5a0666594
[vuplus_dvbapp-plugin] / ac3lipsync / src / AC3main.py
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 _
16
17 class AC3LipSync(Screen, HelpableScreen, MovableScreen, 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         MovableScreen.__init__(self, config.plugins.AC3LipSync, 600, 100)
113         
114     def __onShow(self):
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)
123                 iNum = 1
124             else:
125                 iNum = 0
126             self[ sAudio + "TableTabLabel"].setForegroundColorNum(iNum)
127             self[ sAudio + "TableTab"].setPixmapNum(iNum)
128             
129         self.movePosition()
130
131     def keyUp(self):
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
138         else:
139             self.AC3delay.whichAudio = PCMGLOB
140         
141         self.setActiveSlider()
142
143     def keyDown(self):
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
150         else:
151             self.AC3delay.whichAudio = AC3
152
153         self.setActiveSlider()
154
155     def setActiveSlider(self):
156         # Reset colors of all tabs
157         for sAudio in AC3PCM:
158             if sAudio == self.AC3delay.whichAudio:
159                 iNum = 1
160             else: 
161                 iNum = 0
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)
168
169     def keyLeft(self):
170         if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
171             iStep = -25
172         else:
173             iStep = -1 * self.arrowStepSize
174         self.changeSliderValue(iStep)
175         
176     def keyRight(self):
177         if self.AC3delay.whichAudio == AC3GLOB or self.AC3delay.whichAudio == PCMGLOB:
178             iStep = 25
179         else:
180             iStep = self.arrowStepSize
181         self.changeSliderValue(iStep)
182
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
188         else:
189             iStep = self.keyStep[sNumber]        
190         iSliderValue = iStep-self.lowerBound
191         self.setSliderInfo(iSliderValue)
192         self.AC3delay.setSystemDelay(sAudio, self.currentValue[sAudio], True)
193
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
198         else:
199             iStep = self.stepSize[sNumber]
200
201         self.changeSliderValue(iStep)
202
203     def changeSliderValue(self,iValue):
204         sAudio = self.AC3delay.whichAudio
205         iSliderValue = int(self["AudioSliderBar"].getValue())
206         iSliderValue += iValue
207         if iSliderValue < 0:
208             iSliderValue = 0
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)        
213
214     def keyAudioSelection(self):
215         self.audioSelection()
216
217     def keyOk(self):
218         self.close()
219
220     def keyCancel(self):
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)
226         self.close()
227
228     def keyMenu(self):
229         sAudio = self.AC3delay.whichAudio
230         iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
231         keyList = [
232             (_("Move plugin screen"),"1")
233         ]
234
235         self.session.openWithCallback(self.DoShowMenu,ChoiceBox,_("Menu"),keyList)
236     
237     def DoShowMenu(self, answer):
238         if answer is not None:
239             if answer[1] == "1":
240                 self.startMoving([self["actions"]])
241             else:
242                 sResponse = _("Invalid selection")
243                 iType = MessageBox.TYPE_ERROR
244                 self.session.open(MessageBox, sResponse , iType)
245                 
246     def menuSaveDelayToKey(self):
247         sAudio = self.AC3delay.whichAudio
248         iDelay = self["AudioSliderBar"].getValue()+self.lowerBound
249
250         AC3SetCustomValue(self.session,iDelay,self.keyStep)
251         
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)
258
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]
263
264         self["ServiceInfo"].setText(sActiveAudio)
265         self["AC3DelayInfo"].setText(sBitstreamDelay)
266         self["PCMDelayInfo"].setText(sPCMDelay)
267
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()
274             
275 class AC3SetCustomValue:
276     def __init__(self, session, iDelay, keyStep):
277         self.keyStep = keyStep
278         self.session = session
279         self.iDelay = iDelay
280         self.session.openWithCallback(self.DoSetCustomValue,ChoiceBox,_("Select the key you want to set to %i ms") %(iDelay),self.getKeyList())
281
282     def getKeyList(self):
283         keyList = []
284         for i,iValue in self.keyStep.iteritems():
285             if i != "0":
286                 keyList.append((_("Key %(key)s (current value: %(value)i ms)") %dict(key=i, value=iValue),i))
287         return keyList
288
289     def DoSetCustomValue(self,answer):
290         if answer is None:
291             self.session.open(MessageBox,_("Setting key canceled"), MessageBox.TYPE_INFO)
292         elif answer[1] in ("2" , "5" , "8"):
293             if answer[1] == "2":
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)
304         else:
305             self.session.open(MessageBox,_("Invalid selection"), MessageBox.TYPE_ERROR, 5)