Merge pull request #16029 from kencooke/audio-device-format-robustness

BUGZ-1171: Fix audio output not working (alternate fix)
This commit is contained in:
Ken Cooke 2019-08-05 14:19:46 -07:00 committed by GitHub
commit 6fd3214f48
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -597,11 +597,17 @@ bool AudioClient::getNamedAudioDeviceForModeExists(QAudio::Mode mode, const QStr
// attempt to use the native sample rate and channel count
bool nativeFormatForAudioDevice(const QAudioDeviceInfo& audioDevice,
QAudioFormat& audioFormat) {
bool nativeFormatForAudioDevice(const QAudioDeviceInfo& audioDevice, QAudioFormat& audioFormat) {
audioFormat = audioDevice.preferredFormat();
// converting to/from this rate must produce an integral number of samples
if ((audioFormat.sampleRate() <= 0) ||
(audioFormat.sampleRate() * AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL % AudioConstants::SAMPLE_RATE != 0)) {
qCWarning(audioclient) << "The native sample rate [" << audioFormat.sampleRate() << "] is not supported.";
return false;
}
audioFormat.setCodec("audio/pcm");
audioFormat.setSampleSize(16);
audioFormat.setSampleType(QAudioFormat::SignedInt);
@ -609,12 +615,17 @@ bool nativeFormatForAudioDevice(const QAudioDeviceInfo& audioDevice,
if (!audioDevice.isFormatSupported(audioFormat)) {
qCWarning(audioclient) << "The native format is" << audioFormat << "but isFormatSupported() failed.";
return false;
}
// converting to/from this rate must produce an integral number of samples
if (audioFormat.sampleRate() * AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL % AudioConstants::SAMPLE_RATE != 0) {
qCWarning(audioclient) << "The native sample rate [" << audioFormat.sampleRate() << "] is not supported.";
return false;
// attempt the native sample rate, with channels forced to 2
audioFormat.setChannelCount(2);
if (!audioDevice.isFormatSupported(audioFormat)) {
// attempt the native sample rate, with channels forced to 1
audioFormat.setChannelCount(1);
if (!audioDevice.isFormatSupported(audioFormat)) {
return false;
}
}
}
return true;
}