Remove unused fields from control files.
[vuplus_dvbapp-plugin] / ac3lipsync / src / AC3delay.py
index c68f6c0..a92c859 100644 (file)
@@ -1,12 +1,13 @@
-from AC3utils import AC3, PCM, AC3PCM, lFileDelay, dec2hex, hex2dec
+from AC3utils import AC3, PCM, AC3GLOB, PCMGLOB, AC3PCM
 from Components.config import config
 from enigma import eTimer
 from Tools.ISO639 import LanguageCodes
+from Tools.HardwareInfo import HardwareInfo
 import os
 import NavigationInstance
 
 class AC3delay:
-    def __init__(self, session):
+    def __init__(self):
         self.iService = None
         self.iServiceReference = None
         self.iAudioDelay = None
@@ -15,13 +16,21 @@ class AC3delay:
         self.bIsRecording = False
 
         # Current audio- delay
-        self.lamedbDelay = {}
+        self.systemDelay = {}
 
         self.getAudioInformation()
 
+        self.activateTimer = eTimer()
+        self.activateTimer.callback.append(self.activateDelay)
+        self.activateWait = config.plugins.AC3LipSync.activationDelay.getValue()
+        
         # Current value for movie start behaviour
         self.movieStart = config.usage.on_movie_start.getValue()
 
+        # find out box type
+        self.oHWInfo = HardwareInfo()
+        self.bHasToRestartService = self.oHWInfo.get_device_name() == "dm7025"
+        
     def initAudio(self):
         self.iService = NavigationInstance.instance.getCurrentService()
         self.iServiceReference = NavigationInstance.instance.getCurrentlyPlayingServiceReference()
@@ -36,27 +45,37 @@ class AC3delay:
     def setChannelAudio(self, sAudio):
         self.channelAudio = sAudio
 
-    def activateDelay(self):
-        bInitialized = False
-        if self.iService == None:
-            self.initAudio()
-            bInitialized = True
-        if self.iServiceReference is not None:
-            lCurPosition = self.cueGetCurrentPosition()
-            self.deleteAudio()
-            if self.whichAudio == self.channelAudio:
-                config.usage.on_movie_start.setValue("beginning")
-                NavigationInstance.instance.stopService()
-                NavigationInstance.instance.playService(self.iServiceReference)
-                config.usage.on_movie_start.setValue(self.movieStart)
-                if lCurPosition is not None:
-                    self.lCurPosition = lCurPosition
-                    self.timer = eTimer()
-                    self.timer.timeout.get().append(self.seekAfterWait)
-                    self.timer.start(400, False)
-        else:
-            self.deleteAudio()
+    def delayedActivateDelay(self):
+        if self.activateTimer.isActive:
+            self.activateTimer.stop()
+        self.activateTimer.start(self.activateWait, False)
 
+    def activateDelay(self):
+        # This activation code is only neccessary for DM7025. 
+        # DM800, DM8000 and DM500HD directly activate the delay after using "setAC3Delay" and "setPCMDelay", they don't need the service restart
+        if self.activateTimer.isActive:
+            self.activateTimer.stop()
+        if self.bHasToRestartService == True:
+            bInitialized = False
+            if self.iService == None:
+                self.initAudio()
+                bInitialized = True
+            if self.iServiceReference is not None:
+                lCurPosition = self.cueGetCurrentPosition()
+                self.deleteAudio()
+                if self.whichAudio == self.channelAudio:
+                    config.usage.on_movie_start.setValue("beginning")
+                    NavigationInstance.instance.stopService()
+                    NavigationInstance.instance.playService(self.iServiceReference)
+                    config.usage.on_movie_start.setValue(self.movieStart)
+                    if lCurPosition is not None:
+                        self.lCurPosition = lCurPosition
+                        self.timer = eTimer()
+                        self.timer.callback.append(self.seekAfterWait)
+                        self.timer.start(200, False)
+            else:
+                self.deleteAudio()
+        
     def seekAfterWait(self):
         self.timer.stop()
         self.initAudio()
@@ -72,7 +91,7 @@ class AC3delay:
             return None
         return long(r[1])
 
-    def getLamedbDelay(self, sAudio):
+    def getSystemDelay(self, sAudio):
         bInitialized = False
         if self.iService == None:
             self.initAudio()
@@ -81,44 +100,46 @@ class AC3delay:
         if self.iAudioDelay is not None:
             if sAudio == AC3:
                 iDelay = self.iAudioDelay.getAC3Delay()
-            else:
+            elif sAudio == PCM:
                 iDelay = self.iAudioDelay.getPCMDelay()
-            if iDelay == -1:
-                iDelay = 0
+            elif sAudio == AC3GLOB:
+                iDelay = config.av.generalAC3delay.getValue()
+            else:
+                iDelay = config.av.generalPCMdelay.getValue()
         if bInitialized == True:
             self.deleteAudio()
-        return iDelay
-
-    def getFileDelay(self, sAudio):
-        sFileName = lFileDelay[sAudio]
-        if os.path.exists(sFileName) == True:
-            delayfile = open(sFileName,"r")
-            delay = 0
-            delay = delayfile.readline()
-            delayfile.close()
-            iDelay = hex2dec(delay)/90
-        else:
+        if iDelay == -1:
             iDelay = 0
-        return int(iDelay)
+        return iDelay
 
-    def setLamedbDelay(self, sAudio, iDelay):
-        self.initAudio()
+    def setSystemDelay(self, sAudio, iDelay, bDelayStart):
+        bInitialized = False
+        if self.iService == None:
+            self.initAudio()
+            bInitialized = True
         if self.iAudioDelay is not None:
-            if iDelay == 0:
-                iDelay = -1
+            iDelayLameDb = iDelay
+            if iDelayLameDb == 0:
+                iDelayLameDb = -1
             if sAudio == AC3:
-                self.iAudioDelay.setAC3Delay(iDelay)
+                self.iAudioDelay.setAC3Delay(iDelayLameDb)
+            elif sAudio == PCM:
+                self.iAudioDelay.setPCMDelay(iDelayLameDb)
+            elif sAudio == AC3GLOB:
+                config.av.generalAC3delay.setValue(iDelay)
+                config.av.generalAC3delay.save()
+                #Setting the global delay does not activate it, so now we call setAC3Delay to activate the new delay..
+                self.iAudioDelay.setAC3Delay(self.systemDelay[AC3])
             else:
-                self.iAudioDelay.setPCMDelay(iDelay)
-        self.activateDelay()
-
-    def setFileDelay(self, sAudio, iDelay):
-        hDelay = dec2hex(iDelay*90)
-        sFileName = lFileDelay[sAudio]
-        if os.path.exists(sFileName) == True:
-            delayfile = open(lFileDelay[sAudio],"w")
-            delayfile.write("%s\0" % hDelay)
-            delayfile.close()
+                config.av.generalPCMdelay.setValue(iDelay)
+                config.av.generalPCMdelay.save()
+                #Setting the global delay does not activate it, so now we call setPCMDelay to activate the new delay..
+                self.iAudioDelay.setPCMDelay(self.systemDelay[PCM])
+        if bInitialized == True:
+            self.deleteAudio()
+        if bDelayStart == True:
+            self.delayedActivateDelay()
+        else:
             self.activateDelay()
 
     def getAudioInformation(self):
@@ -126,10 +147,18 @@ class AC3delay:
         if self.iService == None:
             self.initAudio()
             bInitialized = True
-        self.initAudio()
+
+        # check if we are in a recording
         lCurPosition = self.cueGetCurrentPosition()
         if lCurPosition is not None:
             self.bIsRecording = True
+            
+        # check if downmix is enabled
+        try:
+            bDownmixEnabled = config.av.downmix_ac3.value
+        except:
+            bDownmixEnabled = False
+
         oAudioTracks = self.iService and self.iService.audioTracks()
         n = oAudioTracks and oAudioTracks.getNumberOfTracks() or 0
         tlist = []
@@ -148,7 +177,7 @@ class AC3delay:
 
                 tlist.append((description, x))
                 if x == self.selectedAudioIndex:
-                    if description.find("AC3") != -1 or description.find("DTS") != -1:
+                    if ((description.find("AC3") != -1 or description.find("AC-3") != -1) and not bDownmixEnabled) or description.find("DTS") != -1:
                         self.whichAudio = AC3
                         self.channelAudio = AC3
                     else:
@@ -159,8 +188,7 @@ class AC3delay:
 
             self.audioTrackList = tlist
         for sAudio in AC3PCM:
-            self.lamedbDelay[sAudio]=self.getLamedbDelay(sAudio)
+            self.systemDelay[sAudio]=self.getSystemDelay(sAudio)
         del oAudioTracks
         if bInitialized == True:
             self.deleteAudio()
-