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
6 import NavigationInstance
9 def __init__(self, session):
11 self.iServiceReference = None
12 self.iAudioDelay = None
13 self.channelAudio = AC3
15 self.bIsRecording = False
17 # Current audio- delay
20 self.getAudioInformation()
22 self.activateTimer = eTimer()
23 self.activateTimer.callback.append(self.activateDelay)
24 self.activateWait = config.plugins.AC3LipSync.activationDelay.getValue()
26 # Current value for movie start behaviour
27 self.movieStart = config.usage.on_movie_start.getValue()
30 self.iService = NavigationInstance.instance.getCurrentService()
31 self.iServiceReference = NavigationInstance.instance.getCurrentlyPlayingServiceReference()
32 self.iAudioDelay = self.iService and self.iService.audioDelay()
33 self.iSeek = self.iService and self.iService.seek()
35 def deleteAudio(self):
37 self.iAudioDelay = None
40 def setChannelAudio(self, sAudio):
41 self.channelAudio = sAudio
43 def delayedActivateDelay(self):
44 if self.activateTimer.isActive:
45 self.activateTimer.stop()
46 self.activateTimer.start(self.activateWait, False)
48 def activateDelay(self):
49 if self.activateTimer.isActive:
50 self.activateTimer.stop()
52 if self.iService == None:
55 if self.iServiceReference is not None:
56 lCurPosition = self.cueGetCurrentPosition()
58 if self.whichAudio == self.channelAudio:
59 config.usage.on_movie_start.setValue("beginning")
60 NavigationInstance.instance.stopService()
61 NavigationInstance.instance.playService(self.iServiceReference)
62 config.usage.on_movie_start.setValue(self.movieStart)
63 if lCurPosition is not None:
64 self.lCurPosition = lCurPosition
66 self.timer.callback.append(self.seekAfterWait)
67 self.timer.start(200, False)
71 def seekAfterWait(self):
74 if self.iSeek is not None:
75 self.iSeek.seekTo(self.lCurPosition)
78 def cueGetCurrentPosition(self):
79 if self.iSeek is None:
81 r = self.iSeek.getPlayPosition()
86 def getLamedbDelay(self, sAudio):
88 if self.iService == None:
92 if self.iAudioDelay is not None:
94 iDelay = self.iAudioDelay.getAC3Delay()
96 iDelay = self.iAudioDelay.getPCMDelay()
99 if bInitialized == True:
103 def getFileDelay(self, sAudio):
104 sFileName = lFileDelay[sAudio]
105 if os.path.exists(sFileName) == True:
106 delayfile = open(sFileName,"r")
108 delay = delayfile.readline()
110 iDelay = hex2dec(delay)/90
115 def setLamedbDelay(self, sAudio, iDelay):
117 if self.iAudioDelay is not None:
121 self.iAudioDelay.setAC3Delay(iDelay)
123 self.iAudioDelay.setPCMDelay(iDelay)
124 #self.activateDelay()
126 def setFileDelay(self, sAudio, iDelay, bDelayStart):
127 hDelay = dec2hex(iDelay*90)
128 sFileName = lFileDelay[sAudio]
129 if os.path.exists(sFileName) == True:
130 delayfile = open(lFileDelay[sAudio],"w")
131 delayfile.write("%s\0" % hDelay)
133 if bDelayStart == True:
134 self.delayedActivateDelay()
138 def getAudioInformation(self):
140 if self.iService == None:
144 lCurPosition = self.cueGetCurrentPosition()
145 if lCurPosition is not None:
146 self.bIsRecording = True
147 oAudioTracks = self.iService and self.iService.audioTracks()
148 n = oAudioTracks and oAudioTracks.getNumberOfTracks() or 0
150 self.selectedAudioIndex = oAudioTracks.getCurrentTrack()
153 i = oAudioTracks.getTrackInfo(x)
154 language = i.getLanguage()
155 description = i.getDescription()
156 if LanguageCodes.has_key(language):
157 language = LanguageCodes[language][0]
159 description += " (" + language + ")"
161 description = language
163 tlist.append((description, x))
164 if x == self.selectedAudioIndex:
165 if description.find("AC3") != -1 or description.find("DTS") != -1:
166 self.whichAudio = AC3
167 self.channelAudio = AC3
169 self.whichAudio = PCM
170 self.channelAudio = PCM
171 self.selectedAudioInfo = (description, x)
172 tlist.sort(key=lambda x: x[0])
174 self.audioTrackList = tlist
175 for sAudio in AC3PCM:
176 self.lamedbDelay[sAudio]=self.getLamedbDelay(sAudio)
178 if bInitialized == True: