From 047501c5190ae30000b816e10a0adb9e8b8bc6dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=85=AC=E4=B8=8D=E8=A7=A3=E6=A2=A6?= Date: Fri, 13 Sep 2024 11:30:44 +0800 Subject: [PATCH 1/5] WASAPI multi-channel microphone input MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Support multi-channel microphone input by downmixing to stereo - Enhanced the WASAPI audio driver to support microphones with any number of channels. - This modification ensures compatibility with a broader range of multi-channel microphones, allowing for more versatile input handling in Godot. Regarding “WASAPI: unsupported channel count in microphone!” error. --- drivers/wasapi/audio_driver_wasapi.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/wasapi/audio_driver_wasapi.cpp b/drivers/wasapi/audio_driver_wasapi.cpp index a349a66f754..2f4e9d4dfd6 100644 --- a/drivers/wasapi/audio_driver_wasapi.cpp +++ b/drivers/wasapi/audio_driver_wasapi.cpp @@ -850,6 +850,26 @@ void AudioDriverWASAPI::thread_func(void *p_udata) { r = read_sample(ad->audio_input.format_tag, ad->audio_input.bits_per_sample, data, j * 2 + 1); } else if (ad->audio_input.channels == 1) { l = r = read_sample(ad->audio_input.format_tag, ad->audio_input.bits_per_sample, data, j); + } else if (ad->audio_input.channels >= 2) { + int channels = ad->audio_input.channels; + for (int ch = 0; ch < channels - 1; ch++) { + int32_t sample = read_sample(ad->audio_input.format_tag, ad->audio_input.bits_per_sample, data, j * channels + ch); + if (ch % 2 == 0) { + r += sample; + } else { + l += sample; + } + } + int32_t last_sample = read_sample(ad->audio_input.format_tag, ad->audio_input.bits_per_sample, data, j * channels + (channels - 1)); + r += last_sample; + if (channels % 2 != 0) { + l += last_sample; + l /= ((channels + 1) / 2); + r /= ((channels + 1) / 2); + } else { + l /= (channels / 2); + r /= (channels / 2); + } } else { l = r = 0; ERR_PRINT("WASAPI: unsupported channel count in microphone!"); From 880b0665c1c46d33600631afe008b78623d493af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=85=AC=E4=B8=8D=E8=A7=A3=E6=A2=A6?= Date: Fri, 13 Sep 2024 15:01:37 +0800 Subject: [PATCH 2/5] Fix bugs --- drivers/wasapi/audio_driver_wasapi.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/wasapi/audio_driver_wasapi.cpp b/drivers/wasapi/audio_driver_wasapi.cpp index 2f4e9d4dfd6..0832ec1558b 100644 --- a/drivers/wasapi/audio_driver_wasapi.cpp +++ b/drivers/wasapi/audio_driver_wasapi.cpp @@ -850,7 +850,8 @@ void AudioDriverWASAPI::thread_func(void *p_udata) { r = read_sample(ad->audio_input.format_tag, ad->audio_input.bits_per_sample, data, j * 2 + 1); } else if (ad->audio_input.channels == 1) { l = r = read_sample(ad->audio_input.format_tag, ad->audio_input.bits_per_sample, data, j); - } else if (ad->audio_input.channels >= 2) { + } else if (ad->audio_input.channels > 2) { + l = r = 0; int channels = ad->audio_input.channels; for (int ch = 0; ch < channels - 1; ch++) { int32_t sample = read_sample(ad->audio_input.format_tag, ad->audio_input.bits_per_sample, data, j * channels + ch); From b8c404039cf9b6ab3a6aec9b6eac4125602a6a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=85=AC=E4=B8=8D=E8=A7=A3=E6=A2=A6?= Date: Fri, 13 Sep 2024 16:32:14 +0800 Subject: [PATCH 3/5] Improve robustness --- drivers/wasapi/audio_driver_wasapi.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/wasapi/audio_driver_wasapi.cpp b/drivers/wasapi/audio_driver_wasapi.cpp index 0832ec1558b..6b599c18d71 100644 --- a/drivers/wasapi/audio_driver_wasapi.cpp +++ b/drivers/wasapi/audio_driver_wasapi.cpp @@ -851,26 +851,28 @@ void AudioDriverWASAPI::thread_func(void *p_udata) { } else if (ad->audio_input.channels == 1) { l = r = read_sample(ad->audio_input.format_tag, ad->audio_input.bits_per_sample, data, j); } else if (ad->audio_input.channels > 2) { - l = r = 0; + int64_t ltemp = 0, rtemp = 0; int channels = ad->audio_input.channels; for (int ch = 0; ch < channels - 1; ch++) { int32_t sample = read_sample(ad->audio_input.format_tag, ad->audio_input.bits_per_sample, data, j * channels + ch); if (ch % 2 == 0) { - r += sample; + rtemp += sample; } else { - l += sample; + ltemp += sample; } } int32_t last_sample = read_sample(ad->audio_input.format_tag, ad->audio_input.bits_per_sample, data, j * channels + (channels - 1)); r += last_sample; if (channels % 2 != 0) { - l += last_sample; - l /= ((channels + 1) / 2); - r /= ((channels + 1) / 2); + ltemp += last_sample; + ltemp /= ((channels + 1) / 2); + rtemp /= ((channels + 1) / 2); } else { - l /= (channels / 2); - r /= (channels / 2); + ltemp /= (channels / 2); + rtemp /= (channels / 2); } + l = static_cast(ltemp) + r = static_cast(rtemp) } else { l = r = 0; ERR_PRINT("WASAPI: unsupported channel count in microphone!"); From ce41fc39e0da2ccbc03d0cacb7b63eb8aa6ff182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=85=AC=E4=B8=8D=E8=A7=A3=E6=A2=A6?= Date: Fri, 13 Sep 2024 17:01:28 +0800 Subject: [PATCH 4/5] Fix bugs --- drivers/wasapi/audio_driver_wasapi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/wasapi/audio_driver_wasapi.cpp b/drivers/wasapi/audio_driver_wasapi.cpp index 6b599c18d71..effb6cc7f41 100644 --- a/drivers/wasapi/audio_driver_wasapi.cpp +++ b/drivers/wasapi/audio_driver_wasapi.cpp @@ -871,8 +871,8 @@ void AudioDriverWASAPI::thread_func(void *p_udata) { ltemp /= (channels / 2); rtemp /= (channels / 2); } - l = static_cast(ltemp) - r = static_cast(rtemp) + l = static_cast(ltemp); + r = static_cast(rtemp); } else { l = r = 0; ERR_PRINT("WASAPI: unsupported channel count in microphone!"); From 0d2f1e8be78e20993ee5dc31290f41bbf3e8a8ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=85=AC=E4=B8=8D=E8=A7=A3=E6=A2=A6?= Date: Fri, 13 Sep 2024 17:34:44 +0800 Subject: [PATCH 5/5] Fix initialization --- drivers/wasapi/audio_driver_wasapi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/wasapi/audio_driver_wasapi.cpp b/drivers/wasapi/audio_driver_wasapi.cpp index effb6cc7f41..9d63e6c9607 100644 --- a/drivers/wasapi/audio_driver_wasapi.cpp +++ b/drivers/wasapi/audio_driver_wasapi.cpp @@ -840,7 +840,7 @@ void AudioDriverWASAPI::thread_func(void *p_udata) { // fixme: Only works for floating point atm for (UINT32 j = 0; j < num_frames_available; j++) { - int32_t l, r; + int32_t l = 0, r = 0; if (flags & AUDCLNT_BUFFERFLAGS_SILENT) { l = r = 0;