new:
authorDr.Best <dr_best@users.schwerkraft.elitedvb.net>
Thu, 5 Aug 2010 21:11:03 +0000 (21:11 +0000)
committerDr.Best <dr_best@users.schwerkraft.elitedvb.net>
Thu, 5 Aug 2010 21:11:03 +0000 (21:11 +0000)
- max. volume value for mpeg audio adjustable
- show volumebar when volume value has been changed (needed VolumeControl.py changes from 2010-08-05)
- code cleaning

automaticvolumeadjustment/src/AutomaticVolumeAdjustment.py [new file with mode: 0644]
automaticvolumeadjustment/src/AutomaticVolumeAdjustmentConfig.py [new file with mode: 0644]
automaticvolumeadjustment/src/AutomaticVolumeAdjustmentSetup.py [new file with mode: 0644]
automaticvolumeadjustment/src/plugin.py
automaticvolumeadjustment/src/setup.py [deleted file]

diff --git a/automaticvolumeadjustment/src/AutomaticVolumeAdjustment.py b/automaticvolumeadjustment/src/AutomaticVolumeAdjustment.py
new file mode 100644 (file)
index 0000000..fc197f4
--- /dev/null
@@ -0,0 +1,185 @@
+# -*- coding: utf-8 -*-
+#
+#  AutomaticVolumeAdjustment E2
+#
+#  $Id$
+#
+#  Coded by Dr.Best (c) 2010
+#  Support: www.dreambox-tools.info
+#
+#  This plugin is licensed under the Creative Commons 
+#  Attribution-NonCommercial-ShareAlike 3.0 Unported 
+#  License. To view a copy of this license, visit
+#  http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative
+#  Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
+#
+#  Alternatively, this plugin may be distributed and executed on hardware which
+#  is licensed by Dream Multimedia GmbH.
+
+#  This plugin is NOT free software. It is open source, you are allowed to
+#  modify it (if you keep the license), but it may not be commercially 
+#  distributed other than under the conditions noted above.
+#
+from Screens.Screen import Screen
+from Components.ActionMap import ActionMap
+from Components.Sources.StaticText import StaticText
+from Components.config import config
+from Components.ServiceEventTracker import ServiceEventTracker
+from enigma import iPlayableService, iServiceInformation, eDVBVolumecontrol, eServiceCenter, eServiceReference
+from ServiceReference import ServiceReference
+from Components.VolumeControl import VolumeControl
+from AutomaticVolumeAdjustmentConfig import AutomaticVolumeAdjustmentConfig
+
+class AutomaticVolumeAdjustment(Screen):
+       instance = None
+       def __init__(self, session):
+               self.session = session
+               Screen.__init__(self, session)
+               print "[AutomaticVolumeAdjustment] Starting AutomaticVolumeAdjustment..."
+               self.__event_tracker = ServiceEventTracker(screen = self, eventmap =
+                       {
+                               iPlayableService.evUpdatedInfo: self.__evUpdatedInfo,
+                               iPlayableService.evStart: self.__evStart,
+                               iPlayableService.evEnd: self.__evEnd
+                       })
+               self.newService = False # switching flag
+               self.pluginStarted = False # is plugin started?
+               self.lastAdjustedValue = 0 # remember delta from last automatic volume up/down
+               self.currentVolume = 0 # only set when AC3 or DTS is available
+               self.enabled = False # AutomaticVolumeAdjustment enabled in setup?
+               self.serviceList = { } # values from config
+               configVA = AutomaticVolumeAdjustmentConfig() # get config values
+               assert not AutomaticVolumeAdjustment.instance, "only one AutomaticVolumeAdjustment instance is allowed!"
+               AutomaticVolumeAdjustment.instance = self # set instance
+               self.volumeControlInstance = None # VolumeControlInstance
+               self.currentAC3DTS = False # current service = AC3||DTS?
+               self.initializeConfigValues(configVA, False)
+               self.volctrl = eDVBVolumecontrol.getInstance()
+
+       def initializeConfigValues(self, configVA, fromOutside):
+               print "[AutomaticVolumeAdjustment] initialize config values..."
+               self.serviceList = { }
+               for c in configVA.config.Entries:
+                       self.serviceList[c.servicereference.value] = int(c.adjustvalue.value)
+               self.defaultValue = int(configVA.config.adustvalue.value)
+               self.enabled = configVA.config.enable.value
+               self.maxMPEGVolume = configVA.config.mpeg_max_volume.value
+               self.showVolumeBar = configVA.config.show_volumebar.value
+               VolumeControlInit(self.enabled, self.maxMPEGVolume) # overwrite VolumeControl Class, when max MPEG Volume was set (<> 100)
+               if not self.pluginStarted and self.enabled and fromOutside:
+                       self.newService = True
+                       self.__evUpdatedInfo()
+               
+       def __evEnd(self):
+               if self.pluginStarted and self.enabled:
+                       # if played service had AC3||DTS audio and volume value was changed with RC, take new delta value from the config
+                       if self.currentVolume and self.volctrl.getVolume() != self.currentVolume:
+                               self.lastAdjustedValue = self.serviceList.get(self.session.nav.getCurrentlyPlayingServiceReference().toString(), self.defaultValue)
+                                       
+       def __evStart(self):
+               self.newService = True
+
+       def __evUpdatedInfo(self):
+               if self.newService and self.session.nav.getCurrentlyPlayingServiceReference() and self.enabled:
+                       print "[AutomaticVolumeAdjustment] service changed"
+                       self.newService = False
+                       self.currentVolume = 0 # init
+                       self.currentAC3DTS = self.isCurrentAudioAC3DTS()
+                       if self.pluginStarted:
+                               if self.currentAC3DTS: # ac3 dts?
+                                       vol = self.volctrl.getVolume()
+                                       currentvol = vol # remember current vol
+                                       vol -= self.lastAdjustedValue # go back to origin value first
+                                       ref = self.session.nav.getCurrentlyPlayingServiceReference()
+                                       if ref.getPath(): # check if a movie is playing
+                                               # it is , get the eServicereference if available
+                                               self.serviceHandler = eServiceCenter.getInstance()
+                                               info = self.serviceHandler.info(ref)
+                                               if info:
+                                                       ref = eServiceReference(info.getInfoString(ref, iServiceInformation.sServiceref)) # get new eServicereference from meta file
+                                       ajvol = self.serviceList.get(ref.toString(), self.defaultValue) # get delta from config
+                                       if vol >= 100 - ajvol: # check if delta + vol < 100
+                                               ajvol = 100 - vol # correct delta value
+                                       self.lastAdjustedValue = ajvol # save delta value
+                                       if (ajvol !=0 or self.defaultValue == 0) and (vol+ajvol != currentvol): # only adjust volume when delta != 0 and current vol != new volume
+                                               if ajvol == 0:
+                                                       ajvol = vol+self.lastAdjustedValue - currentvol # correction for debug -print only
+                                               self.volctrl.setVolume(vol+self.lastAdjustedValue, vol+self.lastAdjustedValue)
+                                               if self.volumeControlInstance is not None:
+                                                       self.volumeControlInstance.volumeDialog.setValue(vol+self.lastAdjustedValue)
+                                                       if self.showVolumeBar:
+                                                               self.volumeControlInstance.volumeDialog.show()
+                                                               self.volumeControlInstance.hideVolTimer.start(3000, True)
+                                               print "[AutomaticVolumeAdjustment] Change volume for service: %s (+%d) to %d"%(ServiceReference(ref).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), ajvol, self.volctrl.getVolume())
+                                       self.currentVolume = self.volctrl.getVolume() # ac3||dts service , save current volume
+                               else:
+                                       # mpeg or whatever audio
+                                       if self.lastAdjustedValue != 0:
+                                               # go back to origin value
+                                               vol = self.volctrl.getVolume()
+                                               ajvol = vol-self.lastAdjustedValue
+                                               if ajvol > self.maxMPEGVolume:
+                                                               ajvol = self.maxMPEGVolume
+                                               self.volctrl.setVolume(ajvol, ajvol)
+                                               if self.volumeControlInstance is not None:
+                                                       self.volumeControlInstance.volumeDialog.setValue(ajvol)
+                                                       if self.showVolumeBar:
+                                                               self.volumeControlInstance.volumeDialog.show()
+                                                               self.volumeControlInstance.hideVolTimer.start(3000, True)
+                                               print "[AutomaticVolumeAdjustment] Change volume for service: %s (-%d) to %d"%(ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), vol-ajvol, self.volctrl.getVolume())
+                                               self.lastAdjustedValue = 0 # mpeg audio, no delta here
+                               # save new volume in config
+                               config.audio.volume.value = self.volctrl.getVolume()
+                               config.audio.volume.save()
+                       else:
+                               # starting plugin, if service audio is ac3 or dts --> get delta from config...volume value is set by enigma2-system at start
+                               if self.currentAC3DTS:
+                                       self.lastAdjustedValue = self.serviceList.get(self.session.nav.getCurrentlyPlayingServiceReference().toString(), self.defaultValue)
+                                       self.currentVolume = self.volctrl.getVolume() # ac3||dts service , save current volume
+                               # only images >= 05.08.2010, must use try/except
+                               try: self.volumeControlInstance = VolumeControl.instance
+                               except: pass
+                               self.pluginStarted = True # plugin started...
+
+       def isCurrentAudioAC3DTS(self):
+               service = self.session.nav.getCurrentService()
+               audio = service.audioTracks()
+               if audio:
+                       try: # uhh, servicemp3 leads sometimes to OverflowError Error
+                               tracknr = audio.getCurrentTrack()
+                               i = audio.getTrackInfo(tracknr)
+                               description = i.getDescription();
+                               if "AC3" in description or "DTS" in description:
+                                       return True
+                       except:
+                               return False
+               return False
+
+
+# VolumeControl Class --> overwrite setVolume
+# only for max. mpeg-volume restriction
+baseVolumeControl_setVolume = None
+               
+def VolumeControlInit(enabled, maxVolume):
+       global baseVolumeControl_setVolume
+       if baseVolumeControl_setVolume is None:
+               baseVolumeControl_setVolume = VolumeControl.setVolume
+       if enabled and maxVolume <> 100:
+               VolumeControl.setVolume = AVA_setVolume
+               VolumeControl.maxVolume = maxVolume
+       else:
+               VolumeControl.setVolume = baseVolumeControl_setVolume
+               baseVolumeControl_setVolume = None
+
+def AVA_setVolume(self, direction):
+       ok = True
+       if direction > 0:
+               oldvol = self.volctrl.getVolume()
+               if not AutomaticVolumeAdjustment.instance.currentAC3DTS:        
+                       if oldvol+1 > self.maxVolume:
+                               ok = False
+                               self.volumeDialog.setValue(oldvol)
+                               self.volumeDialog.show()
+                               self.hideVolTimer.start(3000, True)
+       if ok:
+               baseVolumeControl_setVolume(self, direction)
\ No newline at end of file
diff --git a/automaticvolumeadjustment/src/AutomaticVolumeAdjustmentConfig.py b/automaticvolumeadjustment/src/AutomaticVolumeAdjustmentConfig.py
new file mode 100644 (file)
index 0000000..51e4ec3
--- /dev/null
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+#
+#  AutomaticVolumeAdjustment E2
+#
+#  $Id$
+#
+#  Coded by Dr.Best (c) 2010
+#  Support: www.dreambox-tools.info
+#
+#  This plugin is licensed under the Creative Commons 
+#  Attribution-NonCommercial-ShareAlike 3.0 Unported 
+#  License. To view a copy of this license, visit
+#  http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative
+#  Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
+#
+#  Alternatively, this plugin may be distributed and executed on hardware which
+#  is licensed by Dream Multimedia GmbH.
+
+#  This plugin is NOT free software. It is open source, you are allowed to
+#  modify it (if you keep the license), but it may not be commercially 
+#  distributed other than under the conditions noted above.
+#
+from Components.config import ConfigSubsection, ConfigText, \
+       config, ConfigInteger, Config, ConfigSubList, ConfigDirectory, NoSave, ConfigYesNo
+from os import path as os_path, open as os_open, close as os_close, O_RDWR as os_O_RDWR, O_CREAT  as os_O_CREAT 
+
+class AutomaticVolumeAdjustmentConfig():
+       def __init__(self):
+               self.CONFIG_FILE = '/usr/lib/enigma2/python/Plugins/SystemPlugins/AutomaticVolumeAdjustment/config'
+               # load config file
+               self.loadConfigFile()
+
+       # load config file and initialize 
+       def loadConfigFile(self):
+               print "[AutomaticVolumeAdjustmentConfig] Loading config file..."
+               self.config = Config()
+               if not os_path.exists(self.CONFIG_FILE):
+                       fd = os_open( self.CONFIG_FILE, os_O_RDWR|os_O_CREAT)
+                       os_close( fd )
+               self.config.loadFromFile(self.CONFIG_FILE)
+               self.config.entriescount =  ConfigInteger(0)
+               self.config.Entries = ConfigSubList()
+               self.config.enable = ConfigYesNo(default = False)
+               self.config.adustvalue = ConfigInteger(default=25, limits=(0,50))
+               self.config.mpeg_max_volume = ConfigInteger(default=100, limits=(10,100))
+               self.config.show_volumebar = ConfigYesNo(default = False)
+               self.initConfig()
+
+       def initConfig(self):
+               count = self.config.entriescount.value
+               if count != 0:
+                       i = 0
+                       while i < count:
+                               self.initEntryConfig()
+                               i += 1
+               print "[AutomaticVolumeAdjustmentConfig] Loaded %s entries from config file..." % count
+
+       def initEntryConfig(self):
+               self.config.Entries.append(ConfigSubsection())
+               i = len(self.config.Entries) - 1
+               self.config.Entries[i].servicereference = ConfigText(default = "")
+               self.config.Entries[i].name = NoSave(ConfigDirectory(default = _("Press OK to select a service")))
+               self.config.Entries[i].adjustvalue = ConfigInteger(default=25, limits=(5,50))
+               return self.config.Entries[i]
+       
+       def remove(self, configItem):
+               self.config.entriescount.value = self.config.entriescount.value - 1
+               self.config.entriescount.save()
+               self.config.Entries.remove(configItem)
+               self.config.Entries.save()
+               self.save()
+       
+       def save(self):
+               print "[AutomaticVolumeAdjustmentConfig] saving config file..."
+               self.config.saveToFile(self.CONFIG_FILE)
diff --git a/automaticvolumeadjustment/src/AutomaticVolumeAdjustmentSetup.py b/automaticvolumeadjustment/src/AutomaticVolumeAdjustmentSetup.py
new file mode 100644 (file)
index 0000000..6235e30
--- /dev/null
@@ -0,0 +1,272 @@
+# -*- coding: utf-8 -*-
+#
+#  AutomaticVolumeAdjustment E2
+#
+#  $Id$
+#
+#  Coded by Dr.Best (c) 2010
+#  Support: www.dreambox-tools.info
+#
+#  This plugin is licensed under the Creative Commons 
+#  Attribution-NonCommercial-ShareAlike 3.0 Unported 
+#  License. To view a copy of this license, visit
+#  http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative
+#  Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
+#
+#  Alternatively, this plugin may be distributed and executed on hardware which
+#  is licensed by Dream Multimedia GmbH.
+
+#  This plugin is NOT free software. It is open source, you are allowed to
+#  modify it (if you keep the license), but it may not be commercially 
+#  distributed other than under the conditions noted above.
+#
+from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT, RT_VALIGN_CENTER, eServiceReference
+from Screens.Screen import Screen
+from Screens.MessageBox import MessageBox
+from Screens.ChannelSelection import SimpleChannelSelection
+from Components.MenuList import MenuList
+from Components.Sources.StaticText import StaticText
+from Components.ActionMap import ActionMap
+from Components.ConfigList import ConfigListScreen
+from Components.config import getConfigListEntry, config
+from ServiceReference import ServiceReference
+from AutomaticVolumeAdjustment import AutomaticVolumeAdjustment
+from AutomaticVolumeAdjustmentConfig import AutomaticVolumeAdjustmentConfig
+
+               
+class AutomaticVolumeAdjustmentConfigScreen(ConfigListScreen, Screen):
+       skin = """
+               <screen name="AutomaticVolumeAdjustmentConfigScreen" position="center,center" size="550,400">
+                       <widget name="config" position="20,10" size="520,330" scrollbarMode="showOnDemand" />
+                       <ePixmap position="0,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
+                       <ePixmap position="140,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
+                       <ePixmap position="280,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
+                       <ePixmap position="420,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
+
+                       <widget source="key_red" render="Label" position="0,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+                       <widget source="key_green" render="Label" position="140,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+                       <widget render="Label" source="key_blue" position="420,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               </screen>"""
+
+       def __init__(self, session):
+               Screen.__init__(self, session)
+               self.title = _("Automatic Volume Adjustment - Config")
+               self["actions"] = ActionMap(["SetupActions", "ColorActions"],
+               {
+                       "green": self.keySave,
+                       "red": self.keyCancel,
+                       "blue": self.blue,
+                       "cancel": self.keyCancel,
+               }, -2)
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("OK"))
+               self["key_blue"] = StaticText(_("Services"))
+               self.configVA = AutomaticVolumeAdjustmentConfig()
+               self.list = []
+               self.list.append(getConfigListEntry(_("Enable"), self.configVA.config.enable))
+               self.list.append(getConfigListEntry(_("Default volume adjustment value for AC3/DTS"), self.configVA.config.adustvalue))
+               self.list.append(getConfigListEntry(_("Max. volume for mpeg audio"), self.configVA.config.mpeg_max_volume))
+               self.list.append(getConfigListEntry(_("Show volumebar when volume-value was changed"), self.configVA.config.show_volumebar))
+               self.automaticVolumeAdjustmentInstance = AutomaticVolumeAdjustment.instance
+               ConfigListScreen.__init__(self, self.list, session)
+               
+       def blue(self):
+               self.session.open(AutomaticVolumeAdjustmentEntriesListConfigScreen, self.configVA)
+
+       def keySave(self):
+               for x in self["config"].list:
+                       x[1].save()
+               self.configVA.save()
+               if self.automaticVolumeAdjustmentInstance is not None:
+                       self.automaticVolumeAdjustmentInstance.initializeConfigValues(self.configVA, True) # submit config values
+               self.close()
+
+       def keyCancel(self):
+               ConfigListScreen.cancelConfirm(self, True)
+               
+
+class AutomaticVolumeAdjustmentEntriesListConfigScreen(Screen):
+       skin = """
+               <screen position="center,center" size="550,400">
+                       <widget render="Label" source="name" position="5,0" size="350,50" font="Regular;20" halign="left"/>
+                       <widget render="Label" source="adjustvalue" position="355,0" size="200,50" font="Regular;20" halign="left"/>
+                       <widget name="entrylist" position="0,50" size="550,300" scrollbarMode="showOnDemand"/>
+                       <widget render="Label" source="key_red" position="0,350" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+                       <widget source="key_green" render="Label" position="140,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+                       <widget render="Label" source="key_yellow" position="280,350" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="yellow" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+                       <widget render="Label" source="key_blue" position="420,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+                       <ePixmap position="0,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
+                       <ePixmap position="140,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
+                       <ePixmap position="280,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
+                       <ePixmap position="420,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
+               </screen>"""
+
+       def __init__(self, session, configVA):
+               Screen.__init__(self, session)
+               self.title = _("Automatic Volume Adjustment - Service Config")
+               self["name"] = StaticText(_("Servicename"))
+               self["adjustvalue"] = StaticText(_("Adjustment value"))
+               self["key_red"] = StaticText(_("Add"))
+               self["key_green"] = StaticText(_("OK"))
+               self["key_yellow"] = StaticText(_("Edit"))
+               self["key_blue"] = StaticText(_("Delete"))
+               self["entrylist"] = AutomaticVolumeAdjustmentEntryList([])
+               self["actions"] = ActionMap(["WizardActions","MenuActions","ShortcutActions"],
+                       {
+                        "ok"   :       self.keyOK,
+                        "back" :       self.keyClose,
+                        "red"  :       self.keyRed,
+                        "green":       self.keyClose,
+                        "yellow":      self.keyYellow,
+                        "blue":        self.keyDelete,
+                        }, -1)
+               self.automaticVolumeAdjustmentInstance = AutomaticVolumeAdjustment.instance
+               self["entrylist"].setConfig(configVA)
+               self.updateList()
+
+       def updateList(self):
+               self["entrylist"].buildList()
+
+       def keyClose(self):
+               self.close(-1, None)
+
+       def keyRed(self):
+               self.session.openWithCallback(self.updateList,AutomaticVolumeAdjustmentEntryConfigScreen,None, self["entrylist"].configVA)
+
+       def keyOK(self):
+               try:sel = self["entrylist"].l.getCurrentSelection()[0]
+               except: sel = None
+               self.close(self["entrylist"].getCurrentIndex(), sel)
+
+       def keyYellow(self):
+               try:sel = self["entrylist"].l.getCurrentSelection()[0]
+               except: sel = None
+               if sel is None:
+                       return
+               self.session.openWithCallback(self.updateList,AutomaticVolumeAdjustmentEntryConfigScreen,sel, self["entrylist"].configVA)
+
+       def keyDelete(self):
+               try:sel = self["entrylist"].l.getCurrentSelection()[0]
+               except: sel = None
+               if sel is None:
+                       return
+               self.session.openWithCallback(self.deleteConfirm, MessageBox, _("Do you really want to delete this entry?"))
+
+       def deleteConfirm(self, result):
+               if not result:
+                       return
+               sel = self["entrylist"].l.getCurrentSelection()[0]
+               self["entrylist"].configVA.remove(sel)
+               if self.automaticVolumeAdjustmentInstance is not None:
+                       self.automaticVolumeAdjustmentInstance.initializeConfigValues(self["entrylist"].configVA, True) # submit config values
+               self.updateList()
+
+class AutomaticVolumeAdjustmentEntryList(MenuList):
+       def __init__(self, list, enableWrapAround = True):
+               MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
+               self.l.setFont(0, gFont("Regular", 20))
+               self.l.setFont(1, gFont("Regular", 18))
+               self.configVA = None
+
+       def postWidgetCreate(self, instance):
+               MenuList.postWidgetCreate(self, instance)
+               instance.setItemHeight(20)
+
+       def getCurrentIndex(self):
+               return self.instance.getCurrentIndex()
+               
+       def setConfig(self, configVA):
+               self.configVA = configVA
+               
+       def buildList(self):
+               list = []
+               for c in self.configVA.config.Entries:
+                       c.name.value = ServiceReference(eServiceReference(c.servicereference.value)).getServiceName()
+                       res = [
+                               c,
+                               (eListboxPythonMultiContent.TYPE_TEXT, 5, 0, 350, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, c.name.value),
+                               (eListboxPythonMultiContent.TYPE_TEXT, 355, 0,200, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, str(c.adjustvalue.value)),
+                       ]
+                       list.append(res)
+               self.list = list
+               self.l.setList(list)
+               self.moveToIndex(0)
+
+class AutomaticVolumeAdjustmentEntryConfigScreen(ConfigListScreen, Screen):
+       skin = """
+               <screen name="AutomaticVolumeAdjustmentEntryConfigScreen" position="center,center" size="550,400">
+                       <widget name="config" position="20,10" size="520,330" scrollbarMode="showOnDemand" />
+                       <ePixmap position="0,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
+                       <ePixmap position="140,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
+                       <ePixmap position="280,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
+                       <ePixmap position="420,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
+
+                       <widget source="key_red" render="Label" position="0,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+                       <widget source="key_green" render="Label" position="140,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
+               </screen>"""
+
+       def __init__(self, session, entry, configVA):   
+               self.session = session
+               Screen.__init__(self, session)
+               self.title = _("Automatic Volume Adjustment - Entry Config")
+               self["actions"] = ActionMap(["SetupActions", "ColorActions"],
+               {
+                       "green": self.keySave,
+                       "red": self.keyCancel,
+                       "cancel": self.keyCancel,
+                       "ok": self.keySelect,
+               }, -2)
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("OK"))
+               self.configVA = configVA
+               if entry is None:
+                       self.newmode = 1
+                       self.current = self.configVA.initEntryConfig()
+                       self.currentvalue = self.current.adjustvalue.value
+               else:
+                       self.newmode = 0
+                       self.current = entry
+                       self.currentref = entry.servicereference.value
+                       self.currentvalue = entry.adjustvalue.value
+               self.list = [ ]
+               self.service = getConfigListEntry(_("Servicename"), self.current.name)
+               self.list.append(self.service)
+               self.adjustValue = getConfigListEntry(_("Adjustment value"), self.current.adjustvalue)
+               self.list.append(self.adjustValue)
+               ConfigListScreen.__init__(self, self.list, session)
+               self.automaticVolumeAdjustmentInstance = AutomaticVolumeAdjustment.instance
+               
+       def keySelect(self):
+               cur = self["config"].getCurrent()
+               if cur == self.service:
+                       self.session.openWithCallback(self.channelSelected, SimpleChannelSelection, _("Channel Selection"))
+                       
+       def channelSelected(self, ref = None):
+               if ref:
+                       self.current.name.value = ServiceReference(ref).getServiceName()
+                       self.current.servicereference.value = ref.toString()
+                       self.current.save()
+
+       def keySave(self):
+               if self.current.servicereference.value:
+                       if self.newmode == 1:
+                               self.configVA.config.entriescount.value = self.configVA.config.entriescount.value + 1
+                               self.configVA.config.entriescount.save()
+                       for x in self["config"].list:
+                               x[1].save()
+                       self.configVA.save()
+                       if self.automaticVolumeAdjustmentInstance is not None:
+                               self.automaticVolumeAdjustmentInstance.initializeConfigValues(self.configVA, True) # submit config values
+                       self.close()
+               else:
+                       self.session.open(MessageBox, _("You must select a valid service!"), type = MessageBox.TYPE_INFO)
+
+       def keyCancel(self):
+               if self.newmode == 1:
+                       self.configVA.config.Entries.remove(self.current)
+                       self.configVA.config.Entries.save()
+               else:
+                       self.current.servicereference.value = self.currentref
+                       self.current.adjustvalue.value = self.currentvalue
+                       self.current.save()
+               ConfigListScreen.cancelConfirm(self, True)
index 5b28384..fd22300 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 #
 #  AutomaticVolumeAdjustment E2
 #
 #  distributed other than under the conditions noted above.
 #
 from Plugins.Plugin import PluginDescriptor
-from Screens.Screen import Screen
-from Components.ActionMap import ActionMap
-from Components.Sources.StaticText import StaticText
-from Components.config import config
-from setup import AutomaticVolumeAdjustmentConfigScreen, AutomaticVolumeAdjustmentConfig
-from Components.ServiceEventTracker import ServiceEventTracker
-from enigma import iPlayableService, iServiceInformation, eDVBVolumecontrol, eServiceCenter, eServiceReference
-from ServiceReference import ServiceReference
-
-automaticvolumeadjustment = None # global, so setup can use method initializeConfigValues and enable/disable the plugin without gui restart
-
-class AutomaticVolumeAdjustment(Screen):
-       def __init__(self, session):
-               self.session = session
-               Screen.__init__(self, session)
-               print "[AutomaticVolumeAdjustment] Starting AutomaticVolumeAdjustment..."
-               self.__event_tracker = ServiceEventTracker(screen = self, eventmap =
-                       {
-                               iPlayableService.evUpdatedInfo: self.__evUpdatedInfo,
-                               iPlayableService.evStart: self.__evStart,
-                               iPlayableService.evEnd: self.__evEnd
-                       })
-               self.newService = False # switching flag
-               self.pluginStarted = False # is plugin started?
-               self.lastAdjustedValue = 0 # remember delta from last automatic volume up/down
-               self.currentVolume = 0 # only set when AC3 or DTS is available
-               self.enabled = False # AutomaticVolumeAdjustment enabled in setup?
-               self.serviceList = { } # values from config
-               configVA = AutomaticVolumeAdjustmentConfig()
-               self.initializeConfigValues(configVA, False)
-               self.volctrl = eDVBVolumecontrol.getInstance()
-
-       def initializeConfigValues(self, configVA, fromOutside):
-               print "[AutomaticVolumeAdjustment] initialize config values..."
-               self.serviceList = { }
-               for c in configVA.config.Entries:
-                       self.serviceList[c.servicereference.value] = int(c.adjustvalue.value)
-               self.defaultValue = int(configVA.config.adustvalue.value)
-               self.enabled = configVA.config.enable.value
-               if not self.pluginStarted and self.enabled and fromOutside:
-                       self.newService = True
-                       self.__evUpdatedInfo()
-               
-       def __evEnd(self):
-               if self.pluginStarted and self.enabled:
-                       # if played service had AC3||DTS audio and volume value was changed with RC, take new delta value from the config
-                       if self.currentVolume and self.volctrl.getVolume() != self.currentVolume:
-                               self.lastAdjustedValue = self.serviceList.get(self.session.nav.getCurrentlyPlayingServiceReference().toString(), self.defaultValue)
-                                       
-       def __evStart(self):
-               self.newService = True
-
-       def __evUpdatedInfo(self):
-               if self.newService and self.session.nav.getCurrentlyPlayingServiceReference() and self.enabled:
-                       print "[AutomaticVolumeAdjustment] service changed"
-                       self.newService = False
-                       self.currentVolume = 0 # init
-                       currentAC3DTS = self.isCurrentAudioAC3DTS()
-                       if self.pluginStarted:
-                               if currentAC3DTS: # ac3 dts?
-                                       vol = self.volctrl.getVolume()
-                                       currentvol = vol # remember current vol
-                                       vol -= self.lastAdjustedValue # go back to origin value first
-                                       ref = self.session.nav.getCurrentlyPlayingServiceReference()
-                                       if ref.getPath(): # check if a moving is playing
-                                               # it is , get the eServicereference if available
-                                               self.serviceHandler = eServiceCenter.getInstance()
-                                               info = self.serviceHandler.info(ref)
-                                               if info:
-                                                       ref = eServiceReference(info.getInfoString(ref, iServiceInformation.sServiceref)) # get new eServicereference from meta file
-                                       ajvol = self.serviceList.get(ref.toString(), self.defaultValue) # get delta from config
-                                       if vol >= 100 - ajvol: # check if delta + vol < 100
-                                               ajvol = 100 - vol # correct delta value
-                                       self.lastAdjustedValue = ajvol # save delta value
-                                       if (ajvol !=0 or self.defaultValue == 0) and (vol+ajvol != currentvol): # only adjust volume when delta != 0 and current vol != new volume
-                                               if ajvol == 0:
-                                                       ajvol = vol - currentvol # correction for debug -print only
-                                               self.volctrl.setVolume(vol+self.lastAdjustedValue, vol+self.lastAdjustedValue)
-                                               print "[AutomaticVolumeAdjustment] Change volume for service: %s (+%d) to %d"%(ServiceReference(ref).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), ajvol, self.volctrl.getVolume())
-                                       self.currentVolume = self.volctrl.getVolume() # ac3||dts service , save current volume
-                               else:
-                                       # mpeg or whatever audio
-                                       if self.lastAdjustedValue != 0:
-                                               # go back to origin value
-                                               vol = self.volctrl.getVolume()
-                                               self.volctrl.setVolume(vol-self.lastAdjustedValue, vol-self.lastAdjustedValue)
-                                               print "[AutomaticVolumeAdjustment] Change volume for service: %s (-%d) to %d"%(ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), self.lastAdjustedValue, self.volctrl.getVolume())
-                                               self.lastAdjustedValue = 0 # mpeg audio, no delta here
-                               # save new volume in config
-                               config.audio.volume.value = self.volctrl.getVolume()
-                               config.audio.volume.save()
-                       else:
-                               # starting plugin, if service audio is ac3 or dts --> get delta from config...volume value is set by enigma2-system at start
-                               if currentAC3DTS:
-                                       self.lastAdjustedValue = self.serviceList.get(self.session.nav.getCurrentlyPlayingServiceReference().toString(), self.defaultValue)
-                                       self.currentVolume = self.volctrl.getVolume() # ac3||dts service , save current volume
-                               self.pluginStarted = True # plugin started...
-
-       def isCurrentAudioAC3DTS(self):
-               service = self.session.nav.getCurrentService()
-               audio = service.audioTracks()
-               if audio:
-                       try: # uhh, servicemp3 leads sometimes to OverflowError Error
-                               tracknr = audio.getCurrentTrack()
-                               i = audio.getTrackInfo(tracknr)
-                               description = i.getDescription();
-                               if "AC3" in description or "DTS" in description:
-                                       return True
-                       except:
-                               return False
-               return False
+from AutomaticVolumeAdjustmentSetup import AutomaticVolumeAdjustmentConfigScreen
+from AutomaticVolumeAdjustment import AutomaticVolumeAdjustment
 
 def autostart(reason, **kwargs):
-       if "session" in kwargs and automaticvolumeadjustment is None:
-               global automaticvolumeadjustment
+       if "session" in kwargs:
                session = kwargs["session"]
-               automaticvolumeadjustment = AutomaticVolumeAdjustment(session)
+               AutomaticVolumeAdjustment(session)
        
 def setup(session, **kwargs):
        session.open(AutomaticVolumeAdjustmentConfigScreen) # start setup
diff --git a/automaticvolumeadjustment/src/setup.py b/automaticvolumeadjustment/src/setup.py
deleted file mode 100644 (file)
index 9b48729..0000000
+++ /dev/null
@@ -1,329 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-#  AutomaticVolumeAdjustment E2
-#
-#  $Id$
-#
-#  Coded by Dr.Best (c) 2009
-#  Support: www.dreambox-tools.info
-#
-#  This program is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU General Public License
-#  as published by the Free Software Foundation; either version 2
-#  of the License, or (at your option) any later version.
-#
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-#
-
-from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT, \
-       RT_VALIGN_CENTER
-from Screens.Screen import Screen
-from Screens.MessageBox import MessageBox
-from Components.MenuList import MenuList
-from Components.Sources.StaticText import StaticText
-from Components.ActionMap import ActionMap
-from Components.ConfigList import ConfigList, ConfigListScreen
-from Components.config import ConfigSubsection, ConfigText, \
-       getConfigListEntry, config, ConfigInteger, Config, ConfigSubList, ConfigDirectory, NoSave, ConfigYesNo
-from os import path as os_path, open as os_open, close as os_close, O_RDWR as os_O_RDWR, O_CREAT  as os_O_CREAT 
-from Screens.ChannelSelection import SimpleChannelSelection
-from enigma import eServiceReference
-from ServiceReference import ServiceReference
-
-import plugin as AutomaticVolumeAdjustmentPlugin # import to submit config-values
-       
-class AutomaticVolumeAdjustmentConfig():
-       def __init__(self):
-               self.CONFIG_FILE = '/usr/lib/enigma2/python/Plugins/SystemPlugins/AutomaticVolumeAdjustment/config'
-               # load config file
-               self.loadConfigFile()
-
-       # load config file and initialize 
-       def loadConfigFile(self):
-               print "[AutomaticVolumeAdjustmentConfig] Loading config file..."
-               self.config = Config()
-               if not os_path.exists(self.CONFIG_FILE):
-                       fd = os_open( self.CONFIG_FILE, os_O_RDWR|os_O_CREAT)
-                       os_close( fd )
-               self.config.loadFromFile(self.CONFIG_FILE)
-               self.config.entriescount =  ConfigInteger(0)
-               self.config.Entries = ConfigSubList()
-               self.config.enable = ConfigYesNo(default = False)
-               self.config.adustvalue = ConfigInteger(default=25, limits=(0,50))
-               self.initConfig()
-
-       def initConfig(self):
-               count = self.config.entriescount.value
-               if count != 0:
-                       i = 0
-                       while i < count:
-                               self.initEntryConfig()
-                               i += 1
-               print "[AutomaticVolumeAdjustmentConfig] Loaded %s entries from config file..." % count
-
-       def initEntryConfig(self):
-               self.config.Entries.append(ConfigSubsection())
-               i = len(self.config.Entries) - 1
-               self.config.Entries[i].servicereference = ConfigText(default = "")
-               self.config.Entries[i].name = NoSave(ConfigDirectory(default = _("Press OK to select a service")))
-               self.config.Entries[i].adjustvalue = ConfigInteger(default=25, limits=(5,50))
-               return self.config.Entries[i]
-       
-       def remove(self, configItem):
-               self.config.entriescount.value = self.config.entriescount.value - 1
-               self.config.entriescount.save()
-               self.config.Entries.remove(configItem)
-               self.config.Entries.save()
-               self.save()
-       
-       def save(self):
-               print "[AutomaticVolumeAdjustmentConfig] saving config file..."
-               self.config.saveToFile(self.CONFIG_FILE)
-               
-class AutomaticVolumeAdjustmentConfigScreen(ConfigListScreen, Screen):
-       skin = """
-               <screen name="AutomaticVolumeAdjustmentConfigScreen" position="center,center" size="550,400">
-                       <widget name="config" position="20,10" size="520,330" scrollbarMode="showOnDemand" />
-                       <ePixmap position="0,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
-                       <ePixmap position="140,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
-                       <ePixmap position="280,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
-                       <ePixmap position="420,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
-
-                       <widget source="key_red" render="Label" position="0,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-                       <widget source="key_green" render="Label" position="140,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-                       <widget render="Label" source="key_blue" position="420,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-               </screen>"""
-
-       def __init__(self, session):
-               Screen.__init__(self, session)
-               self.title = _("Automatic Volume Adjustment - Config")
-               self["actions"] = ActionMap(["SetupActions", "ColorActions"],
-               {
-                       "green": self.keySave,
-                       "red": self.keyCancel,
-                       "blue": self.blue,
-                       "cancel": self.keyCancel,
-               }, -2)
-               self["key_red"] = StaticText(_("Cancel"))
-               self["key_green"] = StaticText(_("OK"))
-               self["key_blue"] = StaticText(_("Services"))
-               self.configVA = AutomaticVolumeAdjustmentConfig()
-               self.list = []
-               self.list.append(getConfigListEntry(_("Enable"), self.configVA.config.enable))
-               self.list.append(getConfigListEntry(_("Default volume adjustment value for AC3/DTS"), self.configVA.config.adustvalue))
-               ConfigListScreen.__init__(self, self.list, session)
-               
-       def blue(self):
-               self.session.open(AutomaticVolumeAdjustmentEntriesListConfigScreen, self.configVA)
-
-       def keySave(self):
-               for x in self["config"].list:
-                       x[1].save()
-               self.configVA.save()
-               if AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment is not None:
-                       AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment.initializeConfigValues(self.configVA, True) # submit config values
-               self.close()
-
-       def keyCancel(self):
-               ConfigListScreen.cancelConfirm(self, True)
-               
-
-class AutomaticVolumeAdjustmentEntriesListConfigScreen(Screen):
-       skin = """
-               <screen position="center,center" size="550,400">
-                       <widget render="Label" source="name" position="5,0" size="350,50" font="Regular;20" halign="left"/>
-                       <widget render="Label" source="adjustvalue" position="355,0" size="200,50" font="Regular;20" halign="left"/>
-                       <widget name="entrylist" position="0,50" size="550,300" scrollbarMode="showOnDemand"/>
-                       <widget render="Label" source="key_red" position="0,350" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-                       <widget source="key_green" render="Label" position="140,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-                       <widget render="Label" source="key_yellow" position="280,350" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="yellow" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-                       <widget render="Label" source="key_blue" position="420,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-                       <ePixmap position="0,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
-                       <ePixmap position="140,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
-                       <ePixmap position="280,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
-                       <ePixmap position="420,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
-               </screen>"""
-
-       def __init__(self, session, configVA):
-               Screen.__init__(self, session)
-               self.title = _("Automatic Volume Adjustment - Service Config")
-               self["name"] = StaticText(_("Servicename"))
-               self["adjustvalue"] = StaticText(_("Adjustment value"))
-               self["key_red"] = StaticText(_("Add"))
-               self["key_green"] = StaticText(_("OK"))
-               self["key_yellow"] = StaticText(_("Edit"))
-               self["key_blue"] = StaticText(_("Delete"))
-               self["entrylist"] = AutomaticVolumeAdjustmentEntryList([])
-               self["actions"] = ActionMap(["WizardActions","MenuActions","ShortcutActions"],
-                       {
-                        "ok"   :       self.keyOK,
-                        "back" :       self.keyClose,
-                        "red"  :       self.keyRed,
-                        "green":       self.keyClose,
-                        "yellow":      self.keyYellow,
-                        "blue":        self.keyDelete,
-                        }, -1)
-               self["entrylist"].setConfig(configVA)
-               self.updateList()
-
-       def updateList(self):
-               self["entrylist"].buildList()
-
-       def keyClose(self):
-               self.close(-1, None)
-
-       def keyRed(self):
-               self.session.openWithCallback(self.updateList,AutomaticVolumeAdjustmentEntryConfigScreen,None, self["entrylist"].configVA)
-
-       def keyOK(self):
-               try:sel = self["entrylist"].l.getCurrentSelection()[0]
-               except: sel = None
-               self.close(self["entrylist"].getCurrentIndex(), sel)
-
-       def keyYellow(self):
-               try:sel = self["entrylist"].l.getCurrentSelection()[0]
-               except: sel = None
-               if sel is None:
-                       return
-               self.session.openWithCallback(self.updateList,AutomaticVolumeAdjustmentEntryConfigScreen,sel, self["entrylist"].configVA)
-
-       def keyDelete(self):
-               try:sel = self["entrylist"].l.getCurrentSelection()[0]
-               except: sel = None
-               if sel is None:
-                       return
-               self.session.openWithCallback(self.deleteConfirm, MessageBox, _("Do you really want to delete this entry?"))
-
-       def deleteConfirm(self, result):
-               if not result:
-                       return
-               sel = self["entrylist"].l.getCurrentSelection()[0]
-               self["entrylist"].configVA.remove(sel)
-               if AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment is not None:
-                       AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment.initializeConfigValues(self["entrylist"].configVA, True) # submit config values
-               self.updateList()
-
-class AutomaticVolumeAdjustmentEntryList(MenuList):
-       def __init__(self, list, enableWrapAround = True):
-               MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
-               self.l.setFont(0, gFont("Regular", 20))
-               self.l.setFont(1, gFont("Regular", 18))
-               self.configVA = None
-
-       def postWidgetCreate(self, instance):
-               MenuList.postWidgetCreate(self, instance)
-               instance.setItemHeight(20)
-
-       def getCurrentIndex(self):
-               return self.instance.getCurrentIndex()
-               
-       def setConfig(self, configVA):
-               self.configVA = configVA
-               
-       def buildList(self):
-               list = []
-               for c in self.configVA.config.Entries:
-                       c.name.value = ServiceReference(eServiceReference(c.servicereference.value)).getServiceName()
-                       res = [
-                               c,
-                               (eListboxPythonMultiContent.TYPE_TEXT, 5, 0, 350, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, c.name.value),
-                               (eListboxPythonMultiContent.TYPE_TEXT, 355, 0,200, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, str(c.adjustvalue.value)),
-                       ]
-                       list.append(res)
-               self.list = list
-               self.l.setList(list)
-               self.moveToIndex(0)
-
-class AutomaticVolumeAdjustmentEntryConfigScreen(ConfigListScreen, Screen):
-       skin = """
-               <screen name="AutomaticVolumeAdjustmentEntryConfigScreen" position="center,center" size="550,400">
-                       <widget name="config" position="20,10" size="520,330" scrollbarMode="showOnDemand" />
-                       <ePixmap position="0,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
-                       <ePixmap position="140,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
-                       <ePixmap position="280,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
-                       <ePixmap position="420,350" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
-
-                       <widget source="key_red" render="Label" position="0,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-                       <widget source="key_green" render="Label" position="140,350" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
-               </screen>"""
-
-       def __init__(self, session, entry, configVA):
-               Screen.__init__(self, session)
-               self.title = _("Automatic Volume Adjustment - Entry Config")
-               self["actions"] = ActionMap(["SetupActions", "ColorActions"],
-               {
-                       "green": self.keySave,
-                       "red": self.keyCancel,
-                       "cancel": self.keyCancel,
-                       "ok": self.keySelect,
-               }, -2)
-               self["key_red"] = StaticText(_("Cancel"))
-               self["key_green"] = StaticText(_("OK"))
-               self.configVA = configVA
-               if entry is None:
-                       self.newmode = 1
-                       self.current = self.configVA.initEntryConfig()
-               else:
-                       self.newmode = 0
-                       self.current = entry
-                       self.currentref = entry.servicereference.value
-                       self.currentvalue = entry.adjustvalue.value
-               self.list = [ ]
-               self.service = getConfigListEntry(_("Servicename"), self.current.name)
-               self.list.append(self.service)
-               self.list.append(getConfigListEntry(_("Adjustment value"), self.current.adjustvalue))
-               ConfigListScreen.__init__(self, self.list, session)
-               
-       def keySelect(self):
-               cur = self["config"].getCurrent()
-               if cur == self.service:
-                       self.session.openWithCallback(self.channelSelected, ConfigChannelSelection)
-                       
-       def channelSelected(self, ref = None):
-               if ref:
-                       self.current.name.value = ServiceReference(ref).getServiceName()
-                       self.current.servicereference.value = ref.toString()
-                       self.current.save()
-
-       def keySave(self):
-               if self.current.servicereference.value:
-                       if self.newmode == 1:
-                               self.configVA.config.entriescount.value = self.configVA.config.entriescount.value + 1
-                               self.configVA.config.entriescount.save()
-                       for x in self["config"].list:
-                               x[1].save()
-                       self.configVA.save()
-                       if AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment is not None:
-                               AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment.initializeConfigValues(self.configVA, True) # submit config values
-                       self.close()
-               else:
-                       self.session.open(MessageBox, _("You must select a valid service!"), type = MessageBox.TYPE_INFO)
-
-       def keyCancel(self):
-               if self.newmode == 1:
-                       self.configVA.config.Entries.remove(self.current)
-                       self.configVA.config.Entries.save()
-               else:
-                       self.current.servicereference.value = self.currentref
-                       self.current.adjustvalue.value = self.currentvalue
-                       self.current.save()
-               ConfigListScreen.cancelConfirm(self, True)
-
-class ConfigChannelSelection(SimpleChannelSelection):
-       def __init__(self, session):
-               SimpleChannelSelection.__init__(self, session, _("Channel Selection"))
-               self.skinName = ["SimpleChannelSelection"]
-               self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"],
-               {
-                               "showEPGList": self.channelSelected
-               })
-
-       def channelSelected(self):
-               ref = self.getCurrentSelection()
-               if (ref.flags & 7) == 7:
-                       self.enterPath(ref)
-               elif not (ref.flags & eServiceReference.isMarker):
-                       self.close(ref)