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)
125 def setFileDelay(self, sAudio, iDelay, bDelayStart):
126 hDelay = dec2hex(iDelay*90)
127 sFileName = lFileDelay[sAudio]
128 if os.path.exists(sFileName) == True:
129 delayfile = open(lFileDelay[sAudio],"w")
130 delayfile.write("%s\0" % hDelay)
132 if bDelayStart == True:
133 self.delayedActivateDelay()
137 def getAudioInformation(self):
139 if self.iService == None:
143 lCurPosition = self.cueGetCurrentPosition()
144 if lCurPosition is not None:
145 self.bIsRecording = True
146 oAudioTracks = self.iService and self.iService.audioTracks()
147 n = oAudioTracks and oAudioTracks.getNumberOfTracks() or 0
149 self.selectedAudioIndex = oAudioTracks.getCurrentTrack()
152 i = oAudioTracks.getTrackInfo(x)
153 language = i.getLanguage()
154 description = i.getDescription()
155 if LanguageCodes.has_key(language):
156 language = LanguageCodes[language][0]
158 description += " (" + language + ")"
160 description = language
162 tlist.append((description, x))
163 if x == self.selectedAudioIndex:
164 if description.find("AC3") != -1 or description.find("DTS") != -1:
165 self.whichAudio = AC3
166 self.channelAudio = AC3
168 self.whichAudio = PCM
169 self.channelAudio = PCM
170 self.selectedAudioInfo = (description, x)
171 tlist.sort(key=lambda x: x[0])
173 self.audioTrackList = tlist
174 for sAudio in AC3PCM:
175 self.lamedbDelay[sAudio]=self.getLamedbDelay(sAudio)
177 if bInitialized == True: