1 from AC3utils import AC3, PCM, AC3PCM, lFileDelay, dec2hex, hex2dec
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
10 def __init__(self, session):
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"):
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 if self.activateTimer.isActive:
58 self.activateTimer.stop()
59 if self.bHasToRestartService == True:
61 if self.iService == None:
64 if self.iServiceReference is not None:
65 lCurPosition = self.cueGetCurrentPosition()
67 if self.whichAudio == self.channelAudio:
68 config.usage.on_movie_start.setValue("beginning")
69 NavigationInstance.instance.stopService()
70 NavigationInstance.instance.playService(self.iServiceReference)
71 config.usage.on_movie_start.setValue(self.movieStart)
72 if lCurPosition is not None:
73 self.lCurPosition = lCurPosition
75 self.timer.callback.append(self.seekAfterWait)
76 self.timer.start(200, False)
80 def seekAfterWait(self):
83 if self.iSeek is not None:
84 self.iSeek.seekTo(self.lCurPosition)
87 def cueGetCurrentPosition(self):
88 if self.iSeek is None:
90 r = self.iSeek.getPlayPosition()
95 def getLamedbDelay(self, sAudio):
97 if self.iService == None:
101 if self.iAudioDelay is not None:
103 iDelay = self.iAudioDelay.getAC3Delay()
105 iDelay = self.iAudioDelay.getPCMDelay()
108 if bInitialized == True:
112 def getFileDelay(self, sAudio):
113 sFileName = lFileDelay[sAudio]
114 if os.path.exists(sFileName) == True:
115 delayfile = open(sFileName,"r")
117 delay = delayfile.readline()
119 iDelay = hex2dec(delay)/90
124 def setLamedbDelay(self, sAudio, iDelay):
126 if self.iAudioDelay is not None:
130 self.iAudioDelay.setAC3Delay(iDelay)
132 self.iAudioDelay.setPCMDelay(iDelay)
134 def setFileDelay(self, sAudio, iDelay, bDelayStart):
135 hDelay = dec2hex(iDelay*90)
136 sFileName = lFileDelay[sAudio]
137 if os.path.exists(sFileName) == True:
138 delayfile = open(lFileDelay[sAudio],"w")
139 delayfile.write("%s\0" % hDelay)
141 if bDelayStart == True:
142 self.delayedActivateDelay()
146 def getAudioInformation(self):
148 if self.iService == None:
152 # check if we are in a recording
153 lCurPosition = self.cueGetCurrentPosition()
154 if lCurPosition is not None:
155 self.bIsRecording = True
157 # check if downmix is enabled
159 bDownmixEnabled = config.av.downmix_ac3.value
161 bDownmixEnabled = False
163 oAudioTracks = self.iService and self.iService.audioTracks()
164 n = oAudioTracks and oAudioTracks.getNumberOfTracks() or 0
166 self.selectedAudioIndex = oAudioTracks.getCurrentTrack()
169 i = oAudioTracks.getTrackInfo(x)
170 language = i.getLanguage()
171 description = i.getDescription()
172 if LanguageCodes.has_key(language):
173 language = LanguageCodes[language][0]
175 description += " (" + language + ")"
177 description = language
179 tlist.append((description, x))
180 if x == self.selectedAudioIndex:
181 if (description.find("AC3") != -1 or description.find("DTS") != -1) and bDownmixEnabled == False:
182 self.whichAudio = AC3
183 self.channelAudio = AC3
185 self.whichAudio = PCM
186 self.channelAudio = PCM
187 self.selectedAudioInfo = (description, x)
188 tlist.sort(key=lambda x: x[0])
190 self.audioTrackList = tlist
191 for sAudio in AC3PCM:
192 self.lamedbDelay[sAudio]=self.getLamedbDelay(sAudio)
194 if bInitialized == True: