[bugfix] DeviceManager : Deviceを接続していない場合に発生する問題を修正

- 関数設定されていない変数をコールする問題を修正
- Deviceソート時にindexを参照しているため、NoDeviceにindex=-1を設定するように変更
This commit is contained in:
misyaguziya
2024-11-02 06:39:05 +09:00
parent 98c14e795a
commit 4ddcad1e3e

View File

@@ -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,6 +241,7 @@ class DeviceManager:
self.callback_process_before_update_devices = None
def runProcessBeforeUpdateDevices(self):
if isinstance(self.callback_process_before_update_devices, Callable):
self.callback_process_before_update_devices()
def setCallbackProcessAfterUpdateDevices(self, callback):
@@ -249,18 +251,19 @@ class DeviceManager:
self.callback_process_after_update_devices = None
def runProcessAfterUpdateDevices(self):
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,18 +273,23 @@ class DeviceManager:
self.update_flag_speaker_device_list = False
def setMicDefaultDevice(self):
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):
if isinstance(self.callback_default_speaker_device, Callable):
self.callback_default_speaker_device(self.default_speaker_device["device"]["name"])
def setMicHostList(self):
if isinstance(self.callback_host_list, Callable):
self.callback_host_list()
def setMicDeviceList(self):
if isinstance(self.callback_mic_device_list, Callable):
self.callback_mic_device_list()
def setSpeakerDeviceList(self):
if isinstance(self.callback_speaker_device_list, Callable):
self.callback_speaker_device_list()
def getMicDevices(self):