Merge pull request #231 from DJ2LS/issue_174_fix

This commit is contained in:
DJ2LS 2022-09-24 21:10:13 +02:00 committed by GitHub
commit 52e1af908b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 4 deletions

View file

@ -223,7 +223,6 @@ jobs:
uses: actions/checkout@v3
with:
repository: DJ2LS/FreeDATA
ref: main
- name: Set up Python 3.9
uses: actions/setup-python@v4

View file

@ -4,10 +4,14 @@ Gather information about audio devices.
import atexit
import multiprocessing
import crcengine
import sounddevice as sd
import structlog
atexit.register(sd._terminate)
log = structlog.get_logger("audio")
def get_audio_devices():
"""
@ -24,6 +28,7 @@ def get_audio_devices():
sd._terminate()
sd._initialize()
log.error("[AUD] get_audio_devices")
with multiprocessing.Manager() as manager:
proxy_input_devices = manager.list()
proxy_output_devices = manager.list()
@ -34,9 +39,19 @@ def get_audio_devices():
proc.start()
proc.join()
log.error(f"[AUD] get_audio_devices: input_devices: {proxy_input_devices}")
log.error(f"[AUD] get_audio_devices: output_devices: {proxy_output_devices}")
return list(proxy_input_devices), list(proxy_output_devices)
def device_crc(device) -> str:
crc_algorithm = crcengine.new("crc16-ccitt-false") # load crc8 library
crc_hwid = crc_algorithm(bytes(f"{device}", encoding="utf-8"))
crc_hwid = crc_hwid.to_bytes(2, byteorder="big")
crc_hwid = crc_hwid.hex()
return f"{device['name']} [{crc_hwid}]"
def fetch_audio_devices(input_devices, output_devices):
"""
get audio devices from portaudio
@ -49,7 +64,12 @@ def fetch_audio_devices(input_devices, output_devices):
"""
devices = sd.query_devices(device=None, kind=None)
for index, device in enumerate(devices):
# The use of set forces the list to contain only unique entries.
input_devs = set()
output_devs = set()
for device in devices:
# Use a try/except block because Windows doesn't have an audio device range
try:
name = device["name"]
@ -57,6 +77,8 @@ def fetch_audio_devices(input_devices, output_devices):
max_output_channels = device["max_output_channels"]
max_input_channels = device["max_input_channels"]
except KeyError:
continue
except Exception as err:
print(err)
max_input_channels = 0
@ -64,6 +86,11 @@ def fetch_audio_devices(input_devices, output_devices):
name = ""
if max_input_channels > 0:
input_devices.append({"id": index, "name": name})
input_devs.add(device_crc(device))
if max_output_channels > 0:
output_devices.append({"id": index, "name": name})
output_devs.add(device_crc(device))
for index, item in enumerate(input_devs):
input_devices.append({"id": index, "name": item})
for index, item in enumerate(output_devs):
output_devices.append({"id": index, "name": item})