mycroft-core/mycroft/skills/volume/__init__.py

128 lines
3.9 KiB
Python

import time
from alsaaudio import Mixer
from os.path import dirname
from adapt.intent import IntentBuilder
from mycroft.skills.core import MycroftSkill
from mycroft.util.log import getLogger
__author__ = 'jdorleans'
LOGGER = getLogger(__name__)
class VolumeSkill(MycroftSkill):
VOLUMES = {0: 0, 1: 15, 2: 25, 3: 35, 4: 45, 5: 55, 6: 65, 7: 70, 8: 80,
9: 90, 10: 95, 11: 100}
def __init__(self):
super(VolumeSkill, self).__init__(name="VolumeSkill")
self.default_volume = int(self.config.get('default_volume'))
def initialize(self):
self.load_data_files(dirname(__file__))
self.register_regex("(?P<VolumeAmount>\d+)")
self.__build_set_volume()
def __build_set_volume(self):
intent = IntentBuilder("SetVolumeIntent").require(
"VolumeKeyword").require("VolumeAmount").build()
self.register_intent(intent, self.handle_set_volume)
intent = IntentBuilder("IncreaseVolumeIntent").require(
"IncreaseVolumeKeyword").build()
self.register_intent(intent, self.handle_increase_volume)
intent = IntentBuilder("DecreaseVolumeIntent").require(
"DecreaseVolumeKeyword").build()
self.register_intent(intent, self.handle_decrease_volume)
intent = IntentBuilder("MuteVolumeIntent").require(
"MuteVolumeKeyword").build()
self.register_intent(intent, self.handle_mute_volume)
intent = IntentBuilder("ResetVolumeIntent").require(
"ResetVolumeKeyword").build()
self.register_intent(intent, self.handle_reset_volume)
def handle_set_volume(self, message):
mixer = Mixer()
code, volume = self.get_volume(message, mixer.getvolume()[0])
mixer.setvolume(volume)
self.speak_dialog('set.volume', data={'volume': code})
def handle_increase_volume(self, message):
code, volume = self.__update_volume(1)
self.speak_dialog('increase.volume', data={'volume': code})
def handle_decrease_volume(self, message):
code, volume = self.__update_volume(-1)
self.speak_dialog('decrease.volume', data={'volume': code})
def handle_mute_volume(self, message):
self.speak_dialog('mute.volume')
time.sleep(2)
Mixer().setvolume(0)
def handle_reset_volume(self, message):
Mixer().setvolume(self.default_volume)
self.speak_dialog(
'reset.volume',
data={'volume': self.get_volume_code(self.default_volume)})
def __update_volume(self, level=0):
mixer = Mixer()
volume = mixer.getvolume()[0]
code = self.get_volume_code(volume) + level
code = self.fix_code(code)
if code in self.VOLUMES:
volume = self.VOLUMES[code]
mixer.setvolume(volume)
return code, volume
def get_volume(self, message, default=None):
amount = message.metadata.get('VolumeAmount', default)
if not amount:
return self.default_volume
if amount in ['loud']:
amount = 9
elif amount in ['normal']:
amount = 6
elif amount in ['quiet']:
amount = 3
elif amount in ['two']:
amount = 2
elif amount in ['one']:
amount = 1
elif amount in ['zero']:
amount = 0
else:
try:
amount = int(amount)
except:
return self.default_volume
amount = self.fix_code(amount)
return amount, self.VOLUMES[amount]
def get_volume_code(self, volume):
for k, v in self.VOLUMES.iteritems():
if volume <= v:
return k
@staticmethod
def fix_code(code):
if code > 11:
code = 11
elif code < 0:
code = 0
return code
def stop(self):
pass
def create_skill():
return VolumeSkill()