Ejemplo n.º 1
0
    def __init__(self, messaging, settings):
        self._pyaudio = pyaudio.PyAudio()
        self.messaging = messaging
        self.command_manager = CommandManager(self, messaging)
        self._logger = logging.getLogger(__name__)
        self._logger.info("Initializing PyAudio. ALSA/Jack error messages " +
                          "that pop up during this process are normal and " +
                          "can usually be safely ignored.")
        # NOTE: pyaudio SPAMS the terminal, this seperates everything
        print('\n')
        self._logger.info("Initialization of PyAudio engine finished")

        self.devices = {}
        self.get_devices()
Ejemplo n.º 2
0
class PyAudio:
    def __init__(self, messaging, settings):
        self._pyaudio = pyaudio.PyAudio()
        self.messaging = messaging
        self.command_manager = CommandManager(self, messaging)
        self._logger = logging.getLogger(__name__)
        self._logger.info("Initializing PyAudio. ALSA/Jack error messages " +
                          "that pop up during this process are normal and " +
                          "can usually be safely ignored.")
        # NOTE: pyaudio SPAMS the terminal, this seperates everything
        print('\n')
        self._logger.info("Initialization of PyAudio engine finished")

        self.devices = {}
        self.get_devices()

    def __del__(self):
        self._pyaudio.terminate()

    def run(self):
        messaging = self.messaging
        # TODO: create better type here
        startup_frame = create_vex_message('',
                                           'microphone',
                                           'STATUS',
                                           status='recording')

        messaging.publish_socket.send_multipart(startup_frame)

        while True:
            # NOTE: `frame` is a list of byte strings
            # Once we recv here, MUST reply in order to loop again!
            try:
                frame = self.messaging.subscribe_socket.recv_multipart()
            except KeyboardInterrupt:
                break

            msg = decode_vex_message(frame)

            if msg.type == 'CMD':
                self.command_manager.handle_command(msg)

    def get_devices(self, device_type='all'):
        num_devices = self._pyaudio.get_device_count()
        self._logger.debug('Found %d PyAudio devices', num_devices)
        for i in range(num_devices):
            info = self._pyaudio.get_device_info_by_index(i)
            name = info['name']
            if name in self.devices:
                continue
            else:
                self.devices[name] = PyAudioDevice(self, info)

        return self.devices
        """
        if device_type == plugin.audioengine.DEVICE_TYPE_ALL:
            return devs
        else:
            return [device for device in devs if device_type in device.types]
        """

    def invoke_device(self):
        pass

    def get_default_output_device(self):
        info = self._pyaudio.get_default_output_device_info()
        return PyAudioDevice(self, info)

    def get_default_device(self, type='input'):
        try:
            info = self._pyaudio.get_default_input_device_info()
        except IOError:
            devices = self.get_devices(device_type=type)
            if len(devices) == 0:
                msg = 'No %s devices available!' % direction
                self._logger.warning(msg)
                raise plugin.audioengine.DeviceNotFound(msg)
            try:
                device = self.devices['default']
            except KeyError:
                self._logger.warning('default device not found')
                # FIXME
                device = None
            return device
        else:
            return PyAudioDevice(self, info)