Allow negative delays
[vuplus_dvbapp-plugin] / ac3lipsync / src / AC3main.py
index 3adf142..28f507b 100644 (file)
@@ -17,35 +17,31 @@ import os
 
 class AC3LipSync(Screen,InfoBarAudioSelection):
     skin = """
-        <screen position="60,420" size="600,100" title="AC3 Lip Sync" zPosition="1" >
-            <widget name="AC3DelayText" zPosition="2" position="5,0" size="180,21" font="Regular;21" foregroundColors="#ffffff,#ffa323" />
+        <screen position="60,472" size="600,74" title="AC3 Lip Sync" zPosition="1" >
+            <widget name="AudioDelayText" zPosition="2" position="5,0" size="180,21" font="Regular;21" foregroundColors="#ffffff,#ffa323" />
             <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/AC3LipSyncBarBG.png" zPosition="2" position="190,0" size="370,21" alphatest="on" transparent="1" />
-            <widget name="AC3Slider" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/AC3LipSyncBar.png" zPosition="3" position="190,0" size="370,21" transparent="1" />
-            <widget name="AC3SliderText" zPosition="4" position="190,0" size="370,21" font="Regular;18" halign="center" valign="center" transparent="1" />
-            <widget name="PCMDelayText" zPosition="2" position="5,26" size="180,21" font="Regular;21" foregroundColors="#ffffff,#ffa323" />
-            <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/AC3LipSyncBarBG.png" zPosition="2" position="190,26" size="370,21" alphatest="on" transparent="1" />
-            <widget name="PCMSlider" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/AC3LipSyncBar.png" zPosition="3" position="190,26" size="370,21" transparent="1" />
-            <widget name="PCMSliderText" zPosition="4" position="190,26" size="370,21" font="Regular;18" halign="center" valign="center" transparent="1" />
-            <widget name="ServiceInfoText" zPosition="4" position="5,52" size="180,21" font="Regular;18" foregroundColor="#ffffff" />
-            <widget name="ServiceInfo" zPosition="4" position="190,52" size="180,21" font="Regular;18" foregroundColor="#cccccc" />
-            <widget name="AC3DelayInfoText" zPosition="4" position="380,52" size="48,21" font="Regular;18" foregroundColor="#ffffff" />
-            <widget name="AC3DelayInfo" zPosition="4" position="430,52" size="50,21" font="Regular;18" foregroundColor="#cccccc" />
-            <widget name="PCMDelayInfoText" zPosition="4" position="490,52" size="48,21" font="Regular;18" foregroundColor="#ffffff" />
-            <widget name="PCMDelayInfo" zPosition="4" position="540,52" size="50,21" font="Regular;18" foregroundColor="#cccccc" />
-            <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/key-red.png" position="5,78" zPosition="5" size="20,20" transparent="1" alphatest="on" />
-            <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/key-green.png" position="150,78" zPosition="5" size="20,20" transparent="1" alphatest="on" />
-            <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/key-yellow.png" position="295,78" zPosition="5" size="20,20" transparent="1" alphatest="on" />
-            <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/key-blue.png" position="440,78" zPosition="5" size="20,20" transparent="1" alphatest="on" />
-            <widget name="key_red" position="30,78" zPosition="1" size="115,21"
+            <widget name="AudioSlider" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/AC3LipSyncBar.png" zPosition="3" position="190,0" size="370,21" transparent="1" />
+            <widget name="AudioSliderText" zPosition="4" position="190,0" size="370,21" font="Regular;18" halign="center" valign="center" transparent="1" />
+            <widget name="ServiceInfoText" zPosition="4" position="5,26" size="180,21" font="Regular;18" foregroundColor="#ffffff" />
+            <widget name="ServiceInfo" zPosition="4" position="190,26" size="180,21" font="Regular;18" foregroundColor="#cccccc" />
+            <widget name="AC3DelayInfoText" zPosition="4" position="380,26" size="48,21" font="Regular;18" foregroundColor="#ffffff" />
+            <widget name="AC3DelayInfo" zPosition="4" position="430,26" size="50,21" font="Regular;18" foregroundColor="#cccccc" />
+            <widget name="PCMDelayInfoText" zPosition="4" position="490,26" size="48,21" font="Regular;18" foregroundColor="#ffffff" />
+            <widget name="PCMDelayInfo" zPosition="4" position="540,26" size="50,21" font="Regular;18" foregroundColor="#cccccc" />
+            <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/key-red.png" position="5,52" zPosition="5" size="20,20" transparent="1" alphatest="on" />
+            <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/key-green.png" position="150,52" zPosition="5" size="20,20" transparent="1" alphatest="on" />
+            <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/key-yellow.png" position="295,52" zPosition="5" size="20,20" transparent="1" alphatest="on" />
+            <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/AC3LipSync/img/key-blue.png" position="440,52" zPosition="5" size="20,20" transparent="1" alphatest="on" />
+            <widget name="key_red" position="30,52" zPosition="1" size="115,21"
                 font="Regular;16" valign="center" halign="left" transparent="1"
                 shadowColor="#000000" shadowOffset="-1,-1" />
-            <widget name="key_green" position="175,78" zPosition="1" size="115,21"
+            <widget name="key_green" position="175,52" zPosition="1" size="115,21"
                 font="Regular;16" valign="center" halign="left" transparent="1"
                 shadowColor="#000000" shadowOffset="-1,-1" />
-            <widget name="key_yellow" position="320,78" zPosition="1" size="115,21"
+            <widget name="key_yellow" position="320,52" zPosition="1" size="115,21"
                 font="Regular;16" valign="center" halign="left" transparent="1"
                 shadowColor="#000000" shadowOffset="-1,-1" />
-            <widget name="key_blue" position="465,78" zPosition="1" size="115,21"
+            <widget name="key_blue" position="465,52" zPosition="1" size="115,21"
                 font="Regular;16" valign="center" halign="left" transparent="1"
             shadowColor="#000000" shadowOffset="-1,-1" />
         </screen>"""
@@ -58,20 +54,25 @@ class AC3LipSync(Screen,InfoBarAudioSelection):
         InfoBarAudioSelection.__init__(self)
 
         # Configuration values
-        self.lowerBound = int(config.plugins.AC3LipSync.lowerBound.getValue())
-        self.upperBound = int(config.plugins.AC3LipSync.upperBound.getValue())
+        self.upperBound = int(config.plugins.AC3LipSync.outerBounds.getValue())
+        self.lowerBound = -1 * self.upperBound
         self.arrowStepSize = int(config.plugins.AC3LipSync.arrowStepSize.getValue())
-        self.stepSize = int(config.plugins.AC3LipSync.stepSize.getValue())
+        self.stepSize = {}
+        self.stepSize["3"] = int(config.plugins.AC3LipSync.stepSize13.getValue())
+        self.stepSize["1"] = -1 * self.stepSize["3"]
+        self.stepSize["6"] = int(config.plugins.AC3LipSync.stepSize46.getValue())
+        self.stepSize["4"] = -1 * self.stepSize["6"]
+        self.stepSize["9"] = int(config.plugins.AC3LipSync.stepSize79.getValue())
+        self.stepSize["7"] = -1 * self.stepSize["9"]
+        self.keyStep = {}
+        self.keyStep["0"] = 0
+        self.keyStep["2"] = int(config.plugins.AC3LipSync.absoluteStep2.getValue()) 
+        self.keyStep["5"] = int(config.plugins.AC3LipSync.absoluteStep5.getValue()) 
+        self.keyStep["8"] = int(config.plugins.AC3LipSync.absoluteStep8.getValue()) 
 
         # AC3delay instance
         self.AC3delay = AC3delay(self.session)
 
-        #Which Values do the number keys use
-        self.whichKeys = "Computed" # Computed = computed Values of keys, User = User set values of keys
-        self.whichKeyText = {}
-        self.whichKeyText["Computed"] = _("Switch to user key- delays")
-        self.whichKeyText["User"] = _("Switch to calculated key- delays")
-
         #Screen elements
 
         #Slider
@@ -83,6 +84,10 @@ class AC3LipSync(Screen,InfoBarAudioSelection):
             self[sAudio+"DelayInfoText"] = Label( _("%s:")%sAudio)
             self[sAudio+"DelayInfo"] = Label(_("%i ms")%0)
 
+        self["AudioSlider"] = ProgressBar()
+        self["AudioSliderText"] = Label(_("%i ms")%0)
+        self["AudioDelayText"] = MultiColorLabel( _("%s delay:")%self.AC3delay.whichAudio)
+        
         #Service Information
         self["ServiceInfoText"] = Label(_("Channel audio:"))
         self["ServiceInfo"] = Label()
@@ -121,16 +126,16 @@ class AC3LipSync(Screen,InfoBarAudioSelection):
             "green": self.keyOk,
             "yellow": self.keyAudioSelection,
             "blue": self.keySaveToLamedb,
-            "1": self.keyNumberGlobal,
-            "2": self.keyNumberGlobal,
-            "3": self.keyNumberGlobal,
-            "4": self.keyNumberGlobal,
-            "5": self.keyNumberGlobal,
-            "6": self.keyNumberGlobal,
-            "7": self.keyNumberGlobal,
-            "8": self.keyNumberGlobal,
-            "9": self.keyNumberGlobal,
-            "0": self.keyNumberGlobal
+            "1": self.keyNumberRelative,
+            "3": self.keyNumberRelative,
+            "4": self.keyNumberRelative,
+            "6": self.keyNumberRelative,
+            "7": self.keyNumberRelative,
+            "9": self.keyNumberRelative,
+            "0": self.keyNumberAbsolute,
+            "2": self.keyNumberAbsolute,
+            "5": self.keyNumberAbsolute,
+            "8": self.keyNumberAbsolute
         }, -1)
 
     def __onShow(self):
@@ -141,58 +146,59 @@ class AC3LipSync(Screen,InfoBarAudioSelection):
             self[sAudio + "SliderText"].setText(_("%i ms") %iDelay)
             self.savedValue[sAudio] = iDelay
             self.currentValue[sAudio] = iDelay
-            if self.AC3delay.whichAudio == AC3:
-                self["AC3DelayText"].setForegroundColorNum(1)
-                self["PCMDelayText"].setForegroundColorNum(0)
-            else:
-                self["AC3DelayText"].setForegroundColorNum(0)
-                self["PCMDelayText"].setForegroundColorNum(1)
+            if sAudio == self.AC3delay.whichAudio: 
+                self["AudioSlider"].setRange([(self.lowerBound), (self.upperBound)])
+                self["AudioSlider"].setValue(iDelay-self.lowerBound)
+                self["AudioSliderText"].setText(_("%i ms")%iDelay)
 
     def keyUp(self):
         self.AC3delay.whichAudio = AC3
-        self["AC3DelayText"].setForegroundColorNum(1)
-        self["PCMDelayText"].setForegroundColorNum(0)
+        self.setActiveSlider(AC3)
 
     def keyDown(self):
         self.AC3delay.whichAudio = PCM
-        self["AC3DelayText"].setForegroundColorNum(0)
-        self["PCMDelayText"].setForegroundColorNum(1)
+        self.setActiveSlider(PCM)
 
-    def keyLeft(self):
-        sAudio = self.AC3delay.whichAudio
-        iSliderValue = int(self[sAudio+"Slider"].getValue())
-        iSliderValue -= self.arrowStepSize
-        if iSliderValue < 0:
-            iSliderValue = 0
-        self.setSliderInfo(iSliderValue)
-        self.AC3delay.setFileDelay(sAudio, self.currentValue[sAudio], True)
+    def setActiveSlider(self,sAudio):
+        if self.AC3delay.whichAudio == AC3:
+            self["AC3DelayText"].setForegroundColorNum(1)
+            self["PCMDelayText"].setForegroundColorNum(0)
+        else:
+            self["AC3DelayText"].setForegroundColorNum(0)
+            self["PCMDelayText"].setForegroundColorNum(1)                        
+        iDelay = self[sAudio+"Slider"].getValue()
+        iCurDelay = iDelay + self.lowerBound
+        self["AudioSlider"].setValue(iDelay)
+        self["AudioSliderText"].setText(_("%i ms")%iCurDelay)
+        self["AudioDelayText"].setText(_("%s delay:")%sAudio)
 
+    def keyLeft(self):
+        self.changeSliderValue(-1 * self.arrowStepSize)
+        
     def keyRight(self):
+        self.changeSliderValue(self.arrowStepSize)
+
+    def keyNumberAbsolute(self, number):
         sAudio = self.AC3delay.whichAudio
-        iSliderValue = int(self[sAudio+"Slider"].getValue())
-        if self.currentValue[sAudio] == 0:
-            iSliderValue = 0
-        iSliderValue += self.arrowStepSize
-        if iSliderValue > self.upperBound:
-            iSliderValue = self.upperBound
+        sNumber = str(number)
+        iSliderValue = self.keyStep[sNumber]-self.lowerBound
         self.setSliderInfo(iSliderValue)
         self.AC3delay.setFileDelay(sAudio, self.currentValue[sAudio], True)
 
-    def keyNumberGlobal(self, number):
+    def keyNumberRelative(self, number):
+        sNumber = str(number)
+        self.changeSliderValue(self.stepSize[sNumber])
+
+    def changeSliderValue(self,iValue):
         sAudio = self.AC3delay.whichAudio
-        iNumber = int(number)
-        if iNumber == 0:
+        iSliderValue = int(self[sAudio+"Slider"].getValue())
+        iSliderValue += iValue
+        if iSliderValue < 0:
             iSliderValue = 0
-            self.currentValue[sAudio] = 0
-        else:
-            if self.whichKeys == "Computed":
-                iSliderValue = self.stepSize*iNumber
-            else:
-                iSliderValue = int(config.plugins.AC3LipSync.keySteps[iNumber].stepSize.getValue())-self.lowerBound
-                if iSliderValue < 0:
-                    iSliderValue = 0
+        elif iSliderValue > (self.upperBound - self.lowerBound):
+            iSliderValue = (self.upperBound - self.lowerBound)
         self.setSliderInfo(iSliderValue)
-        self.AC3delay.setFileDelay(sAudio, self.currentValue[sAudio], True)
+        self.AC3delay.setFileDelay(sAudio, self.currentValue[sAudio], True)        
 
     def keyAudioSelection(self):
         self.audioSelection()
@@ -212,35 +218,26 @@ class AC3LipSync(Screen,InfoBarAudioSelection):
         sAudio = self.AC3delay.whichAudio
         iDelay = self[sAudio+"Slider"].getValue()+self.lowerBound
         keyList = [
-            (_("Save current %(audio)s delay of %(delay)i ms to key") %dict(audio=sAudio , delay=iDelay),"1"),
-            (self.whichKeyText[self.whichKeys],"2")
+            (_("Save current %(audio)s delay of %(delay)i ms to key") %dict(audio=sAudio , delay=iDelay),"1")
         ]
 
         self.session.openWithCallback(self.DoShowMenu,ChoiceBox,_("Menu"),keyList)
-
+    
     def DoShowMenu(self, answer):
         if answer is not None:
             if answer[1] == "1":
                 self.menuSaveDelayToKey()
-            elif answer[1] == "2":
-                self.menuSwitchKeyValues()
             else:
                 sResponse = _("Invalid selection")
                 iType = MessageBox.TYPE_ERROR
                 self.session.open(MessageBox, sResponse , iType)
                 
-    def menuSwitchKeyValues(self):
-        if self.whichKeys == "Computed":
-            self.whichKeys = "User"
-        else:
-            self.whichKeys = "Computed"
-        self["key_blue"].setText(self.whichKeyText[self.whichKeys])
-
     def menuSaveDelayToKey(self):
         sAudio = self.AC3delay.whichAudio
         iDelay = self[sAudio+"Slider"].getValue()+self.lowerBound
-        AC3SetCustomValue(self.session,iDelay)
 
+        AC3SetCustomValue(self.session,iDelay,self.keyStep)
+        
     def keySaveToLamedb(self):
         if self.AC3delay.bIsRecording == False:
             keyList = [
@@ -293,16 +290,12 @@ class AC3LipSync(Screen,InfoBarAudioSelection):
 
     def setSliderInfo(self, iDelay):
         sAudio = self.AC3delay.whichAudio
-        if iDelay == 0:
-            if self.currentValue[sAudio] >= self.lowerBound:
-                self.currentValue[sAudio] = self.lowerBound
-            else:
-                self.currentValue = 0
-        else:
-            self.currentValue[sAudio] = iDelay + self.lowerBound
-        self[sAudio+"Slider"].setValue(iDelay)
+        self.currentValue[sAudio] = iDelay + self.lowerBound
         iCurDelay = self.currentValue[sAudio]
+        self[sAudio+"Slider"].setValue(iDelay)
         self[sAudio+"SliderText"].setText(_("%i ms")%iCurDelay)
+        self["AudioSlider"].setValue(iDelay)
+        self["AudioSliderText"].setText(_("%i ms")%iCurDelay)
 
     def setChannelInfoText(self):
         sActiveAudio = str(self.AC3delay.selectedAudioInfo[0])
@@ -318,25 +311,36 @@ class AC3LipSync(Screen,InfoBarAudioSelection):
         if audio is not None:
             self.AC3delay.getAudioInformation()
             self.setChannelInfoText()
-
+            self.setActiveSlider(self.AC3delay.whichAudio)
+            
 class AC3SetCustomValue:
-    def __init__(self, session, iDelay):
+    def __init__(self, session, iDelay, keyStep):
+        self.keyStep = keyStep
         self.session = session
         self.iDelay = iDelay
         self.session.openWithCallback(self.DoSetCustomValue,ChoiceBox,_("Select the key you want to set to %i ms") %(iDelay),self.getKeyList())
 
     def getKeyList(self):
         keyList = []
-        for i in range(1, 10):
-            iValue = int(config.plugins.AC3LipSync.keySteps[i].stepSize.getValue())
-            keyList.append((_("Key %(key)i (current value: %(value)i ms)") %dict(key=i, value=iValue),str(i)))
+        for i,iValue in self.keyStep.iteritems():
+            if i != "0":
+                keyList.append((_("Key %(key)s (current value: %(value)i ms)") %dict(key=i, value=iValue),i))
         return keyList
 
     def DoSetCustomValue(self,answer):
         if answer is None:
             self.session.open(MessageBox,_("Setting key canceled"), MessageBox.TYPE_INFO)
+        elif answer[1] in ("2" , "5" , "8"):
+            if answer[1] == "2":
+                config.plugins.AC3LipSync.absoluteStep2.setValue(self.iDelay)
+                config.plugins.AC3LipSync.absoluteStep2.save()
+            elif  answer[1] == "5":
+                config.plugins.AC3LipSync.absoluteStep5.setValue(self.iDelay)
+                config.plugins.AC3LipSync.absoluteStep5.save()
+            elif  answer[1] == "8":
+                config.plugins.AC3LipSync.absoluteStep8.setValue(self.iDelay)
+                config.plugins.AC3LipSync.absoluteStep8.save()
+            self.keyStep[answer[1]] = self.iDelay
+            self.session.open(MessageBox,_("Key %(Key)s successfully set to %(delay)i ms") %dict(Key=answer[1],delay=self.iDelay), MessageBox.TYPE_INFO, 5)
         else:
-            config.plugins.AC3LipSync.keySteps[int(answer[1])].stepSize.setValue(self.iDelay)
-            config.plugins.AC3LipSync.keySteps.save()
-            self.session.open(MessageBox,_("%(Key)s successfully set to %(delay)i ms") %dict(Key=answer[0],delay=self.iDelay), MessageBox.TYPE_INFO, 5)
-
+            self.session.open(MessageBox,_("Invalid selection"), MessageBox.TYPE_ERROR, 5)