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 self.bHasToRestartService = self.oHWInfo.get_device_name() == "dm7025"
35 self.iService = NavigationInstance.instance.getCurrentService()
36 self.iServiceReference = NavigationInstance.instance.getCurrentlyPlayingServiceReference()
37 self.iAudioDelay = self.iService and self.iService.audioDelay()
38 self.iSeek = self.iService and self.iService.seek()
40 def deleteAudio(self):
42 self.iAudioDelay = None
45 def setChannelAudio(self, sAudio):
46 self.channelAudio = sAudio
48 def delayedActivateDelay(self):
49 if self.activateTimer.isActive:
50 self.activateTimer.stop()
51 self.activateTimer.start(self.activateWait, False)
53 def activateDelay(self):
54 # This activation code is only neccessary for DM7025.
55 # DM800, DM8000 and DM500HD directly activate the delay after using "setAC3Delay" and "setPCMDelay", they don't need the service restart
56 if self.activateTimer.isActive:
57 self.activateTimer.stop()
58 if self.bHasToRestartService == True:
60 if self.iService == None:
63 if self.iServiceReference is not None:
64 lCurPosition = self.cueGetCurrentPosition()
66 if self.whichAudio == self.channelAudio:
67 config.usage.on_movie_start.setValue("beginning")
68 NavigationInstance.instance.stopService()
69 NavigationInstance.instance.playService(self.iServiceReference)
70 config.usage.on_movie_start.setValue(self.movieStart)
71 if lCurPosition is not None:
72 self.lCurPosition = lCurPosition
74 self.timer.callback.append(self.seekAfterWait)
75 self.timer.start(200, False)
79 def seekAfterWait(self):
82 if self.iSeek is not None:
83 self.iSeek.seekTo(self.lCurPosition)
86 def cueGetCurrentPosition(self):
87 if self.iSeek is None:
89 r = self.iSeek.getPlayPosition()
94 def getSystemDelay(self, sAudio):
96 if self.iService == None:
100 if self.iAudioDelay is not None:
102 iDelay = self.iAudioDelay.getAC3Delay()
104 iDelay = self.iAudioDelay.getPCMDelay()
105 elif sAudio == AC3GLOB:
106 iDelay = config.av.generalAC3delay.getValue()
108 iDelay = config.av.generalPCMdelay.getValue()
109 if bInitialized == True:
115 def setSystemDelay(self, sAudio, iDelay, bDelayStart):
117 if self.iService == None:
120 if self.iAudioDelay is not None:
121 iDelayLameDb = iDelay
122 if iDelayLameDb == 0:
125 self.iAudioDelay.setAC3Delay(iDelayLameDb)
127 self.iAudioDelay.setPCMDelay(iDelayLameDb)
128 elif sAudio == AC3GLOB:
129 config.av.generalAC3delay.setValue(iDelay)
130 config.av.generalAC3delay.save()
131 #Setting the global delay does not activate it, so now we call setAC3Delay to activate the new delay..
132 self.iAudioDelay.setAC3Delay(self.systemDelay[AC3])
134 config.av.generalPCMdelay.setValue(iDelay)
135 config.av.generalPCMdelay.save()
136 #Setting the global delay does not activate it, so now we call setPCMDelay to activate the new delay..
137 self.iAudioDelay.setPCMDelay(self.systemDelay[PCM])
138 if bInitialized == True:
140 if bDelayStart == True:
141 self.delayedActivateDelay()
145 def getAudioInformation(self):
147 if self.iService == None:
151 # check if we are in a recording
152 lCurPosition = self.cueGetCurrentPosition()
153 if lCurPosition is not None:
154 self.bIsRecording = True
156 # check if downmix is enabled
158 bDownmixEnabled = config.av.downmix_ac3.value
160 bDownmixEnabled = False
162 oAudioTracks = self.iService and self.iService.audioTracks()
163 n = oAudioTracks and oAudioTracks.getNumberOfTracks() or 0
165 self.selectedAudioIndex = oAudioTracks.getCurrentTrack()
168 i = oAudioTracks.getTrackInfo(x)
169 language = i.getLanguage()
170 description = i.getDescription()
171 if LanguageCodes.has_key(language):
172 language = LanguageCodes[language][0]
174 description += " (" + language + ")"
176 description = language
178 tlist.append((description, x))
179 if x == self.selectedAudioIndex:
180 if ((description.find("AC3") != -1 or description.find("AC-3") != -1) and not bDownmixEnabled) or description.find("DTS") != -1:
181 self.whichAudio = AC3
182 self.channelAudio = AC3
184 self.whichAudio = PCM
185 self.channelAudio = PCM
186 self.selectedAudioInfo = (description, x)
187 tlist.sort(key=lambda x: x[0])
189 self.audioTrackList = tlist
190 for sAudio in AC3PCM:
191 self.systemDelay[sAudio]=self.getSystemDelay(sAudio)
193 if bInitialized == True: