From b19a44e0465ea987e9c791ab3d81909ada1fa9fa Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Tue, 15 Nov 2016 10:37:32 -0800 Subject: [PATCH] On Windows, set audio format to match the internal mix format. This works around multichannel bugs in the Qt audio framework. --- libraries/audio-client/src/AudioClient.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 0f55537586..769b7f7646 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -379,7 +379,23 @@ bool adjustedFormatForAudioDevice(const QAudioDeviceInfo& audioDevice, adjustedAudioFormat = desiredAudioFormat; -#ifdef Q_OS_ANDROID +#if defined(Q_OS_WIN) + + // NOTE: On Windows, testing for supported formats is unreliable for channels > 2, + // due to WAVEFORMATEX based implementation. To work around, the sample rate and + // channel count are directly set to the WASAPI shared-mode mix format. + + adjustedAudioFormat = audioDevice.preferredFormat(); // returns mixFormat + + adjustedAudioFormat.setCodec("audio/pcm"); + adjustedAudioFormat.setSampleSize(16); + adjustedAudioFormat.setSampleType(QAudioFormat::SignedInt); + adjustedAudioFormat.setByteOrder(QAudioFormat::LittleEndian); + + // resampling should produce an integral number of samples + return (adjustedAudioFormat.sampleRate() * AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL % AudioConstants::SAMPLE_RATE == 0); + +#elif defined(Q_OS_ANDROID) // FIXME: query the native sample rate of the device? adjustedAudioFormat.setSampleRate(48000); #else