mirror of
				https://github.com/OpenVoiceOS/OpenVoiceOS
				synced 2025-06-05 22:19:21 +02:00 
			
		
		
		
	Test volume skill - phal migration
This commit is contained in:
		| @@ -0,0 +1,192 @@ | |||||||
|  | From 79c82a85765730f3c719faa74e1ffd74b63c56ae Mon Sep 17 00:00:00 2001 | ||||||
|  | From: jarbasai <jarbasai@mailfence.com> | ||||||
|  | Date: Wed, 16 Mar 2022 15:03:33 +0000 | ||||||
|  | Subject: [PATCH] integrate with PHAL | ||||||
|  |  | ||||||
|  | https://github.com/OpenVoiceOS/ovos-PHAL-plugin-alsa | ||||||
|  | --- | ||||||
|  |  __init__.py            | 125 +++++++++-------------------------------- | ||||||
|  |  blop-mark-diangelo.wav | Bin 87676 -> 0 bytes | ||||||
|  |  2 files changed, 27 insertions(+), 98 deletions(-) | ||||||
|  |  delete mode 100644 blop-mark-diangelo.wav | ||||||
|  |  | ||||||
|  | diff --git a/__init__.py b/__init__.py | ||||||
|  | index e85793c..03bb87f 100644 | ||||||
|  | --- a/__init__.py | ||||||
|  | +++ b/__init__.py | ||||||
|  | @@ -1,86 +1,18 @@ | ||||||
|  | -from os.path import dirname, join | ||||||
|  | - | ||||||
|  |  from adapt.intent import IntentBuilder | ||||||
|  |  from mycroft.skills.core import MycroftSkill, intent_handler, intent_file_handler | ||||||
|  | -from mycroft.util import play_wav, normalize | ||||||
|  | +from mycroft.util import normalize | ||||||
|  |  from mycroft.util.parse import extract_number | ||||||
|  | -from ovos_utils.sound.alsa import AlsaControl | ||||||
|  | -from mycroft_bus_client import Message | ||||||
|  |   | ||||||
|  |   | ||||||
|  |  class VolumeSkill(MycroftSkill): | ||||||
|  | -    def __init__(self): | ||||||
|  | -        super(VolumeSkill, self).__init__("VolumeSkill") | ||||||
|  | -        self.volume_sound = join(dirname(__file__), "blop-mark-diangelo.wav") | ||||||
|  | - | ||||||
|  | -    # bus api | ||||||
|  | -    def initialize(self): | ||||||
|  | -        self.add_event("mycroft.volume.get", self.handle_volume_request) | ||||||
|  | -        self.add_event("mycroft.volume.set", self.handle_volume_change) | ||||||
|  | -        self.add_event("mycroft.volume.set.gui", | ||||||
|  | -                       self.handle_volume_change_gui) | ||||||
|  | -        self.handle_volume_request(Message("mycroft.volume.get")) | ||||||
|  | -        self.add_event("mycroft.volume.mute", | ||||||
|  | -                       self.handle_mute_intent) | ||||||
|  | -        self.add_event("mycroft.volume.unmute", | ||||||
|  | -                       self.handle_unmute_intent) | ||||||
|  | - | ||||||
|  | -    def handle_volume_request(self, message): | ||||||
|  | -        percent = self.get_volume() / 100 | ||||||
|  | -        self.bus.emit(message.response({"percent": percent})) | ||||||
|  | - | ||||||
|  | -    def handle_volume_change(self, message): | ||||||
|  | -        percent = message.data["percent"] * 100 | ||||||
|  | -        self.set_volume(percent) | ||||||
|  | - | ||||||
|  | -    def handle_volume_change_gui(self, message): | ||||||
|  | -        percent = message.data["percent"] * 100 | ||||||
|  | -        self.set_volume(percent, set_by_gui=True) | ||||||
|  | - | ||||||
|  | -    # volume control | ||||||
|  | -    def get_intro_message(self): | ||||||
|  | -        # just pretend this method is called "on_first_boot" | ||||||
|  | -        # will only run once when the skill is loaded for the first time | ||||||
|  | -        self.set_volume(50) | ||||||
|  | - | ||||||
|  | -    def get_volume(self): | ||||||
|  | -        return AlsaControl().get_volume_percent() | ||||||
|  | - | ||||||
|  | -    def set_volume(self, percent=None, set_by_gui=False): | ||||||
|  | -        volume = int(percent) | ||||||
|  | -        volume = min(100, volume) | ||||||
|  | -        volume = max(0, volume) | ||||||
|  | -        AlsaControl().set_volume_percent(volume) | ||||||
|  | -        play_wav(self.volume_sound) | ||||||
|  | - | ||||||
|  | -        # report change to GUI | ||||||
|  | -        if not set_by_gui: | ||||||
|  | -            percent = volume / 100 | ||||||
|  | -            self.handle_volume_request( | ||||||
|  | -                Message("mycroft.volume.get", {"percent": percent})) | ||||||
|  | - | ||||||
|  | -    def increase_volume(self, volume_change=None): | ||||||
|  | -        if not volume_change: | ||||||
|  | -            volume_change = 15 | ||||||
|  | -        AlsaControl().increase_volume(volume_change) | ||||||
|  | -        play_wav(self.volume_sound) | ||||||
|  | -        self.handle_volume_request(Message("mycroft.volume.get")) | ||||||
|  | - | ||||||
|  | -    def decrease_volume(self, volume_change=None): | ||||||
|  | -        if not volume_change: | ||||||
|  | -            volume_change = -15 | ||||||
|  | -        if volume_change > 0: | ||||||
|  | -            volume_change = 0 - volume_change | ||||||
|  | -        AlsaControl().increase_volume(volume_change) | ||||||
|  | -        play_wav(self.volume_sound) | ||||||
|  | -        self.handle_volume_request(Message("mycroft.volume.get")) | ||||||
|  |   | ||||||
|  |      # intents | ||||||
|  |      @intent_handler(IntentBuilder("change_volume").require('change_volume')) | ||||||
|  |      def handle_change_volume_intent(self, message): | ||||||
|  |          utterance = message.data['utterance'] | ||||||
|  |          volume_change = extract_number(normalize(utterance)) | ||||||
|  | -        self.set_volume(volume_change) | ||||||
|  | +        self.bus.emit(message.forward("mycroft.volume.set", | ||||||
|  | +                                      {"percent": volume_change / 100})) | ||||||
|  |          if volume_change >= 100: | ||||||
|  |              self.speak_dialog('max.volume') | ||||||
|  |          else: | ||||||
|  | @@ -91,61 +23,58 @@ def handle_change_volume_intent(self, message): | ||||||
|  |      def handle_less_volume_intent(self, message): | ||||||
|  |          utterance = message.data['utterance'] | ||||||
|  |          volume_change = extract_number(normalize(utterance)) | ||||||
|  | -        if volume_change > 0: | ||||||
|  | -            volume_change = 0 - volume_change | ||||||
|  | -        self.decrease_volume(volume_change) | ||||||
|  | +        self.bus.emit(message.forward("mycroft.volume.decrease", | ||||||
|  | +                                      {"percent": volume_change / 100})) | ||||||
|  |   | ||||||
|  | -    @intent_handler( | ||||||
|  | -        IntentBuilder("increase_volume").require('increase_volume')) | ||||||
|  | +    @intent_handler(IntentBuilder("increase_volume").require('increase_volume')) | ||||||
|  |      def handle_increase_volume_intent(self, message): | ||||||
|  |          utterance = message.data['utterance'] | ||||||
|  |          volume_change = extract_number(normalize(utterance)) | ||||||
|  | -        self.increase_volume(volume_change) | ||||||
|  | +        self.bus.emit(message.forward("mycroft.volume.increase", | ||||||
|  | +                                      {"percent": volume_change / 100})) | ||||||
|  |   | ||||||
|  |      @intent_file_handler('max_volume.intent') | ||||||
|  |      def handle_max_volume_intent(self, message): | ||||||
|  | -        self.set_volume(100) | ||||||
|  | +        self.bus.emit(message.forward("mycroft.volume.set", | ||||||
|  | +                                      {"percent": 1.0})) | ||||||
|  |          self.speak_dialog('max.volume') | ||||||
|  |   | ||||||
|  |      @intent_file_handler('high_volume.intent') | ||||||
|  |      def handle_high_volume_intent(self, message): | ||||||
|  | -        self.set_volume(85) | ||||||
|  | +        self.bus.emit(message.forward("mycroft.volume.set", | ||||||
|  | +                                      {"percent": 0.9})) | ||||||
|  |   | ||||||
|  |      @intent_file_handler('default_volume.intent') | ||||||
|  | -    def handle_default_volume_ntent(self, message): | ||||||
|  | -        self.set_volume(70) | ||||||
|  | +    def handle_default_volume_intent(self, message): | ||||||
|  | +        self.bus.emit(message.forward("mycroft.volume.set", | ||||||
|  | +                                      {"percent": 0.7})) | ||||||
|  |   | ||||||
|  |      @intent_file_handler('low_volume.intent') | ||||||
|  |      def handle_low_volume_intent(self, message): | ||||||
|  | -        self.set_volume(30) | ||||||
|  | +        self.bus.emit(message.forward("mycroft.volume.set", | ||||||
|  | +                                      {"percent": 0.3})) | ||||||
|  |   | ||||||
|  |      @intent_file_handler('mute.intent') | ||||||
|  |      def handle_mute_intent(self, message): | ||||||
|  | -        self.log.info("User muted audio.") | ||||||
|  | -        AlsaControl().mute() | ||||||
|  | -        self.bus.emit(Message("mycroft.volume.get").response({"percent" : 0})) | ||||||
|  | +        self.bus.emit(message.forward("mycroft.volume.mute")) | ||||||
|  |   | ||||||
|  |      @intent_file_handler('unmute.intent') | ||||||
|  |      def handle_unmute_intent(self, message): | ||||||
|  | -        alsa = AlsaControl() | ||||||
|  | -        self.log.info("User unmuted audio.") | ||||||
|  | -        alsa.unmute() | ||||||
|  | -        volume = alsa.get_volume_percent() | ||||||
|  | -        self.bus.emit(Message("mycroft.volume.get").response({"percent" : volume / 100})) | ||||||
|  | +        self.bus.emit(message.forward("mycroft.volume.unmute")) | ||||||
|  |   | ||||||
|  |      @intent_file_handler('toggle_mute.intent') | ||||||
|  |      def handle_toggle_unmute_intent(self, message): | ||||||
|  | -        alsa = AlsaControl() | ||||||
|  | -        alsa.toggle_mute() | ||||||
|  | -        muted = alsa.is_muted()  | ||||||
|  | -        self.log.info(f"User toggled mute. Result: {'muted' if muted else 'unmuted'}") | ||||||
|  | -        self.bus.emit(Message("mycroft.volume.get").response( | ||||||
|  | -            {"percent" : 0 if muted else (alsa.get_volume_percent() / 100)})) | ||||||
|  | +        self.bus.emit(message.forward("mycroft.volume.mute.toggle")) | ||||||
|  |   | ||||||
|  |      @intent_handler(IntentBuilder("current_volume").require('current_volume')) | ||||||
|  |      def handle_query_volume(self, message): | ||||||
|  | -        volume = AlsaControl().get_volume() | ||||||
|  | -        self.speak_dialog('volume.is', data={'volume': volume}) | ||||||
|  | +        response = self.bus.wait_for_response(message.forward("volume.get")) | ||||||
|  | +        if response: | ||||||
|  | +            volume = response.data["percent"] * 100 | ||||||
|  | +            self.speak_dialog('volume.is', data={'volume': volume}) | ||||||
|  | +        else: | ||||||
|  | +            # TODO dedicated error dialog | ||||||
|  | +            raise TimeoutError("Failed to get volume") | ||||||
|  |   | ||||||
|  |   | ||||||
|  |  def create_skill(): | ||||||
		Reference in New Issue
	
	Block a user