summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-12-03 11:12:53 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-12-09 21:26:56 +0000
commitcc9cbb4e3b4f649a5cc91a16586be638d5f4ffa6 (patch)
treea864f41298256ed9ea2f3f4d2b55d4a285075355
parent8b81084996f8f66e5b5d69b1d90b50a29568353f (diff)
downloadqtmultimedia-cc9cbb4e3b4f649a5cc91a16586be638d5f4ffa6.tar.gz
PulseAudio: correctly specify the preferred format for sources/sinks
Change-Id: I616fd1ab143bbdaeeb4943f6f6d997a76e51a409 Reviewed-by: Piotr Srebrny <piotr.srebrny@qt.io> Reviewed-by: André de la Rocha <andre.rocha@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io> (cherry picked from commit a1f4ea7f397f6ab112bc5b31e001c5dc5c4beb68) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/multimedia/platform/pulseaudio/qaudioengine_pulse.cpp2
-rw-r--r--src/multimedia/platform/pulseaudio/qpulsehelpers.cpp31
-rw-r--r--src/multimedia/platform/pulseaudio/qpulsehelpers_p.h1
3 files changed, 34 insertions, 0 deletions
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);