From cc9cbb4e3b4f649a5cc91a16586be638d5f4ffa6 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 3 Dec 2021 11:12:53 +0100 Subject: PulseAudio: correctly specify the preferred format for sources/sinks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I616fd1ab143bbdaeeb4943f6f6d997a76e51a409 Reviewed-by: Piotr Srebrny Reviewed-by: André de la Rocha Reviewed-by: Lars Knoll (cherry picked from commit a1f4ea7f397f6ab112bc5b31e001c5dc5c4beb68) Reviewed-by: Qt Cherry-pick Bot --- .../platform/pulseaudio/qaudioengine_pulse.cpp | 2 ++ .../platform/pulseaudio/qpulsehelpers.cpp | 31 ++++++++++++++++++++++ .../platform/pulseaudio/qpulsehelpers_p.h | 1 + 3 files changed, 34 insertions(+) diff --git a/src/multimedia/platform/pulseaudio/qaudioengine_pulse.cpp b/src/multimedia/platform/pulseaudio/qaudioengine_pulse.cpp index 53ffffe53..59b0ff90d 100644 --- a/src/multimedia/platform/pulseaudio/qaudioengine_pulse.cpp +++ b/src/multimedia/platform/pulseaudio/qaudioengine_pulse.cpp @@ -126,6 +126,7 @@ static void sinkInfoCallback(pa_context *context, const pa_sink_info *info, int QWriteLocker locker(&pulseEngine->m_sinkLock); bool isDefault = pulseEngine->m_defaultSink == info->name; auto *dinfo = new QPulseAudioDeviceInfo(info->name, info->description, isDefault, QAudioDevice::Output); + dinfo->preferredFormat = QPulseAudioInternal::sampleSpecToAudioFormat(info->sample_spec); pulseEngine->m_sinks.insert(info->index, dinfo->create()); } @@ -164,6 +165,7 @@ static void sourceInfoCallback(pa_context *context, const pa_source_info *info, return; bool isDefault = pulseEngine->m_defaultSink == info->name; auto *dinfo = new QPulseAudioDeviceInfo(info->name, info->description, isDefault, QAudioDevice::Input); + dinfo->preferredFormat = QPulseAudioInternal::sampleSpecToAudioFormat(info->sample_spec); pulseEngine->m_sources.insert(info->index, dinfo->create()); } diff --git a/src/multimedia/platform/pulseaudio/qpulsehelpers.cpp b/src/multimedia/platform/pulseaudio/qpulsehelpers.cpp index c3ca6f8c9..27f8e2602 100644 --- a/src/multimedia/platform/pulseaudio/qpulsehelpers.cpp +++ b/src/multimedia/platform/pulseaudio/qpulsehelpers.cpp @@ -65,6 +65,37 @@ pa_sample_spec audioFormatToSampleSpec(const QAudioFormat &format) return spec; } +QAudioFormat sampleSpecToAudioFormat(const pa_sample_spec &spec) +{ + QAudioFormat format; + + format.setSampleRate(spec.rate); + format.setChannelCount(spec.channels); + QAudioFormat::SampleFormat sampleFormat; + switch (spec.format) { + case PA_SAMPLE_U8: + sampleFormat = QAudioFormat::UInt8; + break; + case PA_SAMPLE_S16LE: + case PA_SAMPLE_S16BE: + sampleFormat = QAudioFormat::Int16; + break; + case PA_SAMPLE_FLOAT32LE: + case PA_SAMPLE_FLOAT32BE: + sampleFormat = QAudioFormat::Float; + break; + case PA_SAMPLE_S32LE: + case PA_SAMPLE_S32BE: + sampleFormat = QAudioFormat::Int32; + break; + default: + return {}; + } + + format.setSampleFormat(sampleFormat); + return format; +} + #ifdef DEBUG_PULSE QString stateToQString(pa_stream_state_t state) { diff --git a/src/multimedia/platform/pulseaudio/qpulsehelpers_p.h b/src/multimedia/platform/pulseaudio/qpulsehelpers_p.h index 5663e73ed..56d9678bf 100644 --- a/src/multimedia/platform/pulseaudio/qpulsehelpers_p.h +++ b/src/multimedia/platform/pulseaudio/qpulsehelpers_p.h @@ -60,6 +60,7 @@ QT_BEGIN_NAMESPACE namespace QPulseAudioInternal { pa_sample_spec audioFormatToSampleSpec(const QAudioFormat &format); +QAudioFormat sampleSpecToAudioFormat(const pa_sample_spec &spec); QString stateToQString(pa_stream_state_t state); QString stateToQString(pa_context_state_t state); QString sampleFormatToQString(pa_sample_format format); -- cgit v1.2.3