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()
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)