From 4ddcad1e3e3728889894a72a0cd28515c8830ee5 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Sat, 2 Nov 2024 06:39:05 +0900 Subject: [PATCH] =?UTF-8?q?[bugfix]=20DeviceManager=20:=20Device=E3=82=92?= =?UTF-8?q?=E6=8E=A5=E7=B6=9A=E3=81=97=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=AB=E7=99=BA=E7=94=9F=E3=81=99=E3=82=8B?= =?UTF-8?q?=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 関数設定されていない変数をコールする問題を修正 - Deviceソート時にindexを参照しているため、NoDeviceにindex=-1を設定するように変更 --- src-python/device_manager.py | 48 +++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src-python/device_manager.py b/src-python/device_manager.py index bae8b8a7..e94e40af 100644 --- a/src-python/device_manager.py +++ b/src-python/device_manager.py @@ -1,3 +1,4 @@ +from typing import Callable from time import sleep from threading import Thread import comtypes @@ -36,10 +37,10 @@ class DeviceManager: return cls._instance def init(self): - self.mic_devices = {"NoHost": [{"name": "NoDevice"}]} - self.default_mic_device = {"host": {"name": "NoHost"}, "device": {"name": "NoDevice"}} - self.speaker_devices = [{"name": "NoDevice"}] - self.default_speaker_device = {"device": {"name": "NoDevice"}} + self.mic_devices = {"NoHost": [{"index": -1, "name": "NoDevice"}]} + self.default_mic_device = {"host": {"index": -1, "name": "NoHost"}, "device": {"index": -1, "name": "NoDevice"}} + self.speaker_devices = [{"index": -1, "name": "NoDevice"}] + self.default_speaker_device = {"device": {"index": -1, "name": "NoDevice"}} self.update() @@ -68,9 +69,9 @@ class DeviceManager: def update(self): buffer_mic_devices = {} - buffer_default_mic_device = {"host": {"name": "NoHost"}, "device": {"name": "NoDevice"}} + buffer_default_mic_device = {"host": {"index": -1, "name": "NoHost"}, "device": {"index": -1, "name": "NoDevice"}} buffer_speaker_devices = [] - buffer_default_speaker_device = {"device": {"name": "NoDevice"}} + buffer_default_speaker_device = {"device": {"index": -1, "name": "NoDevice"}} with PyAudio() as p: for host_index in range(p.get_host_api_count()): @@ -81,7 +82,7 @@ class DeviceManager: if device.get("maxInputChannels", 0) > 0 and not device.get("isLoopbackDevice", True): buffer_mic_devices.setdefault(host["name"], []).append(device) if not buffer_mic_devices: - buffer_mic_devices = {"NoHost": [{"name": "NoDevice"}]} + buffer_mic_devices = {"NoHost": [{"index": -1, "name": "NoDevice"}]} api_info = p.get_default_host_api_info() default_mic_device = api_info["defaultInputDevice"] @@ -111,7 +112,7 @@ class DeviceManager: for loopback in p.get_loopback_device_info_generator(): if device["name"] in loopback["name"]: speaker_devices.append(loopback) - speaker_devices = [dict(t) for t in {tuple(d.items()) for d in speaker_devices}] or [{"name": "NoDevice"}] + speaker_devices = [dict(t) for t in {tuple(d.items()) for d in speaker_devices}] or [{"index": -1, "name": "NoDevice"}] buffer_speaker_devices = sorted(speaker_devices, key=lambda d: d['index']) wasapi_info = p.get_host_api_info_by_type(paWASAPI) @@ -240,7 +241,8 @@ class DeviceManager: self.callback_process_before_update_devices = None def runProcessBeforeUpdateDevices(self): - self.callback_process_before_update_devices() + if isinstance(self.callback_process_before_update_devices, Callable): + self.callback_process_before_update_devices() def setCallbackProcessAfterUpdateDevices(self, callback): self.callback_process_after_update_devices = callback @@ -249,18 +251,19 @@ class DeviceManager: self.callback_process_after_update_devices = None def runProcessAfterUpdateDevices(self): - self.callback_process_after_update_devices() + if isinstance(self.callback_process_after_update_devices, Callable): + self.callback_process_after_update_devices() def noticeUpdateDevices(self): - if self.callback_default_mic_device is not None and self.update_flag_default_mic_device is True: + if self.update_flag_default_mic_device is True: self.setMicDefaultDevice() - if self.callback_default_speaker_device is not None and self.update_flag_default_speaker_device is True: + if self.update_flag_default_speaker_device is True: self.setSpeakerDefaultDevice() - if self.callback_host_list is not None and self.update_flag_host_list is True: + if self.update_flag_host_list is True: self.setMicHostList() - if self.callback_mic_device_list is not None and self.update_flag_mic_device_list is True: + if self.update_flag_mic_device_list is True: self.setMicDeviceList() - if self.callback_speaker_device_list is not None and self.update_flag_speaker_device_list is True: + if self.update_flag_speaker_device_list is True: self.setSpeakerDeviceList() self.update_flag_default_mic_device = False @@ -270,19 +273,24 @@ class DeviceManager: self.update_flag_speaker_device_list = False def setMicDefaultDevice(self): - self.callback_default_mic_device(self.default_mic_device["host"]["name"], self.default_mic_device["device"]["name"]) + if isinstance(self.callback_default_mic_device, Callable): + self.callback_default_mic_device(self.default_mic_device["host"]["name"], self.default_mic_device["device"]["name"]) def setSpeakerDefaultDevice(self): - self.callback_default_speaker_device(self.default_speaker_device["device"]["name"]) + if isinstance(self.callback_default_speaker_device, Callable): + self.callback_default_speaker_device(self.default_speaker_device["device"]["name"]) def setMicHostList(self): - self.callback_host_list() + if isinstance(self.callback_host_list, Callable): + self.callback_host_list() def setMicDeviceList(self): - self.callback_mic_device_list() + if isinstance(self.callback_mic_device_list, Callable): + self.callback_mic_device_list() def setSpeakerDeviceList(self): - self.callback_speaker_device_list() + if isinstance(self.callback_speaker_device_list, Callable): + self.callback_speaker_device_list() def getMicDevices(self): return self.mic_devices