1 from AC3utils import AC3, PCM, AC3GLOB, PCMGLOB, AC3PCM
2 from Components.config import config
3 from enigma import eTimer
4 from Tools.ISO639 import LanguageCodes
5 from Tools.HardwareInfo import HardwareInfo
7 import NavigationInstance
12 self.iServiceReference = None
13 self.iAudioDelay = None
14 self.channelAudio = AC3
16 self.bIsRecording = False
18 # Current audio- delay
21 self.getAudioInformation()
23 self.activateTimer = eTimer()
24 self.activateTimer.callback.append(self.activateDelay)
25 self.activateWait = config.plugins.AC3LipSync.activationDelay.getValue()
27 # Current value for movie start behaviour
28 self.movieStart = config.usage.on_movie_start.getValue()
31 self.oHWInfo = HardwareInfo()
32 if self.oHWInfo.get_device_name() in ("dm800","dm8000","dm500hd"):
33 self.bHasToRestartService = False
35 self.bHasToRestartService = True
38 self.iService = NavigationInstance.instance.getCurrentService()
39 self.iServiceReference = NavigationInstance.instance.getCurrentlyPlayingServiceReference()
40 self.iAudioDelay = self.iService and self.iService.audioDelay()
41 self.iSeek = self.iService and self.iService.seek()
43 def deleteAudio(self):
45 self.iAudioDelay = None
48 def setChannelAudio(self, sAudio):
49 self.channelAudio = sAudio
51 def delayedActivateDelay(self):
52 if self.activateTimer.isActive:
53 self.activateTimer.stop()
54 self.activateTimer.start(self.activateWait, False)
56 def activateDelay(self):
57 # This activation code is only neccessary for DM7025.
58 # DM800, DM8000 and DM500HD directly activate the delay after using "setAC3Delay" and "setPCMDelay", they don't need the service restart
59 if self.activateTimer.isActive:
60 self.activateTimer.stop()
61 if self.bHasToRestartService == True:
63 if self.iService == None:
66 if self.iServiceReference is not None:
67 lCurPosition = self.cueGetCurrentPosition()
69 if self.whichAudio == self.channelAudio:
70 config.usage.on_movie_start.setValue("beginning")
71 NavigationInstance.instance.stopService()
72 NavigationInstance.instance.playService(self.iServiceReference)
73 config.usage.on_movie_start.setValue(self.movieStart)
74 if lCurPosition is not None:
75 self.lCurPosition = lCurPosition
77 self.timer.callback.append(self.seekAfterWait)
78 self.timer.start(200, False)
82 def seekAfterWait(self):
85 if self.iSeek is not None:
86 self.iSeek.seekTo(self.lCurPosition)
89 def cueGetCurrentPosition(self):
90 if self.iSeek is None:
92 r = self.iSeek.getPlayPosition()
97 def getSystemDelay(self, sAudio):
99 if self.iService == None:
103 if self.iAudioDelay is not None:
105 iDelay = self.iAudioDelay.getAC3Delay()
107 iDelay = self.iAudioDelay.getPCMDelay()
108 elif sAudio == AC3GLOB:
109 iDelay = config.av.generalAC3delay.getValue()
111 iDelay = config.av.generalPCMdelay.getValue()
112 if bInitialized == True:
118 def setSystemDelay(self, sAudio, iDelay, bDelayStart):
120 if self.iService == None:
123 if self.iAudioDelay is not None:
124 iDelayLameDb = iDelay
125 if iDelayLameDb == 0:
128 self.iAudioDelay.setAC3Delay(iDelayLameDb)
130 self.iAudioDelay.setPCMDelay(iDelayLameDb)
131 elif sAudio == AC3GLOB:
132 config.av.generalAC3delay.setValue(iDelay)
133 config.av.generalAC3delay.save()
134 #Setting the global delay does not activate it, so now we call setAC3Delay to activate the new delay..
135 self.iAudioDelay.setAC3Delay(self.systemDelay[AC3])
137 config.av.generalPCMdelay.setValue(iDelay)
138 config.av.generalPCMdelay.save()
139 #Setting the global delay does not activate it, so now we call setPCMDelay to activate the new delay..
140 self.iAudioDelay.setPCMDelay(self.systemDelay[PCM])
141 if bInitialized == True:
143 if bDelayStart == True:
144 self.delayedActivateDelay()
148 def getAudioInformation(self):
150 if self.iService == None:
154 # check if we are in a recording
155 lCurPosition = self.cueGetCurrentPosition()
156 if lCurPosition is not None:
157 self.bIsRecording = True
159 # check if downmix is enabled
161 bDownmixEnabled = config.av.downmix_ac3.value
163 bDownmixEnabled = False
165 oAudioTracks = self.iService and self.iService.audioTracks()
166 n = oAudioTracks and oAudioTracks.getNumberOfTracks() or 0
168 self.selectedAudioIndex = oAudioTracks.getCurrentTrack()
171 i = oAudioTracks.getTrackInfo(x)
172 language = i.getLanguage()
173 description = i.getDescription()
174 if LanguageCodes.has_key(language):
175 language = LanguageCodes[language][0]
177 description += " (" + language + ")"
179 description = language
181 tlist.append((description, x))
182 if x == self.selectedAudioIndex:
183 if ((description.find("AC3") != -1 or description.find("AC-3") != -1) and not bDownmixEnabled) or description.find("DTS") != -1:
184 self.whichAudio = AC3
185 self.channelAudio = AC3
187 self.whichAudio = PCM
188 self.channelAudio = PCM
189 self.selectedAudioInfo = (description, x)
190 tlist.sort(key=lambda x: x[0])
192 self.audioTrackList = tlist
193 for sAudio in AC3PCM:
194 self.systemDelay[sAudio]=self.getSystemDelay(sAudio)
196 if bInitialized == True: