smaller cleanups,
[vuplus_dvbapp-plugin] / ac3lipsync / src / AC3delay.py
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 import os
6 import NavigationInstance
7
8 class AC3delay:
9     def __init__(self, session):
10         self.iService = None
11         self.iServiceReference = None
12         self.iAudioDelay = None
13         self.channelAudio = AC3
14         self.whichAudio = AC3
15         self.bIsRecording = False
16
17         # Current audio- delay
18         self.lamedbDelay = {}
19
20         self.getAudioInformation()
21
22         # Current value for movie start behaviour
23         self.movieStart = config.usage.on_movie_start.getValue()
24
25     def initAudio(self):
26         self.iService = NavigationInstance.instance.getCurrentService()
27         self.iServiceReference = NavigationInstance.instance.getCurrentlyPlayingServiceReference()
28         self.iAudioDelay = self.iService and self.iService.audioDelay()
29         self.iSeek = self.iService and self.iService.seek()
30
31     def deleteAudio(self):
32         self.iService = None
33         self.iAudioDelay = None
34         self.iSeek = None
35
36     def setChannelAudio(self, sAudio):
37         self.channelAudio = sAudio
38
39     def activateDelay(self):
40         bInitialized = False
41         if self.iService == None:
42             self.initAudio()
43             bInitialized = True
44         if self.iServiceReference is not None:
45             lCurPosition = self.cueGetCurrentPosition()
46             self.deleteAudio()
47             if self.whichAudio == self.channelAudio:
48                 config.usage.on_movie_start.setValue("beginning")
49                 NavigationInstance.instance.stopService()
50                 NavigationInstance.instance.playService(self.iServiceReference)
51                 config.usage.on_movie_start.setValue(self.movieStart)
52                 if lCurPosition is not None:
53                     self.lCurPosition = lCurPosition
54                     self.timer = eTimer()
55                     self.timer.timeout.get().append(self.seekAfterWait)
56                     self.timer.start(400, False)
57         else:
58             self.deleteAudio()
59
60     def seekAfterWait(self):
61         self.timer.stop()
62         self.initAudio()
63         if self.iSeek is not None:
64             self.iSeek.seekTo(self.lCurPosition)
65         self.deleteAudio()
66
67     def cueGetCurrentPosition(self):
68         if self.iSeek is None:
69             return None
70         r = self.iSeek.getPlayPosition()
71         if r[0]:
72             return None
73         return long(r[1])
74
75     def getLamedbDelay(self, sAudio):
76         bInitialized = False
77         if self.iService == None:
78             self.initAudio()
79             bInitialized = True
80         iDelay = 0
81         if self.iAudioDelay is not None:
82             if sAudio == AC3:
83                 iDelay = self.iAudioDelay.getAC3Delay()
84             else:
85                 iDelay = self.iAudioDelay.getPCMDelay()
86             if iDelay == -1:
87                 iDelay = 0
88         if bInitialized == True:
89             self.deleteAudio()
90         return iDelay
91
92     def getFileDelay(self, sAudio):
93         sFileName = lFileDelay[sAudio]
94         if os.path.exists(sFileName) == True:
95             delayfile = open(sFileName,"r")
96             delay = 0
97             delay = delayfile.readline()
98             delayfile.close()
99             iDelay = hex2dec(delay)/90
100         else:
101             iDelay = 0
102         return int(iDelay)
103
104     def setLamedbDelay(self, sAudio, iDelay):
105         self.initAudio()
106         if self.iAudioDelay is not None:
107             if iDelay == 0:
108                 iDelay = -1
109             if sAudio == AC3:
110                 self.iAudioDelay.setAC3Delay(iDelay)
111             else:
112                 self.iAudioDelay.setPCMDelay(iDelay)
113         self.activateDelay()
114
115     def setFileDelay(self, sAudio, iDelay):
116         hDelay = dec2hex(iDelay*90)
117         sFileName = lFileDelay[sAudio]
118         if os.path.exists(sFileName) == True:
119             delayfile = open(lFileDelay[sAudio],"w")
120             delayfile.write("%s\0" % hDelay)
121             delayfile.close()
122             self.activateDelay()
123
124     def getAudioInformation(self):
125         bInitialized = False
126         if self.iService == None:
127             self.initAudio()
128             bInitialized = True
129         self.initAudio()
130         lCurPosition = self.cueGetCurrentPosition()
131         if lCurPosition is not None:
132             self.bIsRecording = True
133         oAudioTracks = self.iService and self.iService.audioTracks()
134         n = oAudioTracks and oAudioTracks.getNumberOfTracks() or 0
135         tlist = []
136         self.selectedAudioIndex = oAudioTracks.getCurrentTrack()
137         if n >= 0:
138             for x in range(n):
139                 i = oAudioTracks.getTrackInfo(x)
140                 language = i.getLanguage()
141                 description = i.getDescription()
142                 if LanguageCodes.has_key(language):
143                     language = LanguageCodes[language][0]
144                 if len(description):
145                     description += " (" + language + ")"
146                 else:
147                     description = language
148
149                 tlist.append((description, x))
150                 if x == self.selectedAudioIndex:
151                     if description.find("AC3") != -1 or description.find("DTS") != -1:
152                         self.whichAudio = AC3
153                         self.channelAudio = AC3
154                     else:
155                         self.whichAudio = PCM
156                         self.channelAudio = PCM
157                     self.selectedAudioInfo = (description, x)
158             tlist.sort(key=lambda x: x[0])
159
160             self.audioTrackList = tlist
161         for sAudio in AC3PCM:
162             self.lamedbDelay[sAudio]=self.getLamedbDelay(sAudio)
163         del oAudioTracks
164         if bInitialized == True:
165             self.deleteAudio()
166