Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qpulsehelpers.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qpulsehelpers_p.h"
5
7
8Q_LOGGING_CATEGORY(qLcPulseAudioOut, "qt.multimedia.pulseaudio.output")
9
11{
13{
14 pa_sample_spec spec;
15
16 spec.rate = format.sampleRate();
17 spec.channels = format.channelCount();
18 spec.format = PA_SAMPLE_INVALID;
19 const bool isBigEndian = QSysInfo::ByteOrder == QSysInfo::BigEndian;
20
21 if (format.sampleFormat() == QAudioFormat::UInt8) {
22 spec.format = PA_SAMPLE_U8;
23 } else if (format.sampleFormat() == QAudioFormat::Int16) {
24 spec.format = isBigEndian ? PA_SAMPLE_S16BE : PA_SAMPLE_S16LE;
25 } else if (format.sampleFormat() == QAudioFormat::Int32) {
26 spec.format = isBigEndian ? PA_SAMPLE_S32BE : PA_SAMPLE_S32LE;
27 } else if (format.sampleFormat() == QAudioFormat::Float) {
28 spec.format = isBigEndian ? PA_SAMPLE_FLOAT32BE : PA_SAMPLE_FLOAT32LE;
29 }
30
31 return spec;
32}
33
35{
36 pa_channel_map map;
37 map.channels = 0;
38
39 auto config = format.channelConfig();
42
44 map.channels = 1;
45 map.map[0] = PA_CHANNEL_POSITION_MONO;
46 } else {
48 map.map[map.channels++] = PA_CHANNEL_POSITION_FRONT_LEFT;
50 map.map[map.channels++] = PA_CHANNEL_POSITION_FRONT_RIGHT;
52 map.map[map.channels++] = PA_CHANNEL_POSITION_FRONT_CENTER;
54 map.map[map.channels++] = PA_CHANNEL_POSITION_LFE;
56 map.map[map.channels++] = PA_CHANNEL_POSITION_REAR_LEFT;
58 map.map[map.channels++] = PA_CHANNEL_POSITION_REAR_RIGHT;
60 map.map[map.channels++] = PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;
62 map.map[map.channels++] = PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;
64 map.map[map.channels++] = PA_CHANNEL_POSITION_REAR_CENTER;
66 map.map[map.channels++] = PA_CHANNEL_POSITION_LFE;
68 map.map[map.channels++] = PA_CHANNEL_POSITION_SIDE_LEFT;
70 map.map[map.channels++] = PA_CHANNEL_POSITION_SIDE_RIGHT;
72 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_FRONT_LEFT;
74 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_FRONT_RIGHT;
76 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_FRONT_CENTER;
78 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_CENTER;
80 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_REAR_LEFT;
82 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_REAR_RIGHT;
84 map.map[map.channels++] = PA_CHANNEL_POSITION_AUX0;
86 map.map[map.channels++] = PA_CHANNEL_POSITION_AUX1;
88 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_REAR_CENTER;
90 map.map[map.channels++] = PA_CHANNEL_POSITION_AUX2;
92 map.map[map.channels++] = PA_CHANNEL_POSITION_AUX3;
94 map.map[map.channels++] = PA_CHANNEL_POSITION_AUX4;
95 }
96
97 Q_ASSERT(qPopulationCount(config) == map.channels);
98 return map;
99}
100
102{
103 quint32 config = 0;
104 for (int i = 0; i < map.channels; ++i) {
105 switch (map.map[i]) {
106 case PA_CHANNEL_POSITION_MONO:
107 case PA_CHANNEL_POSITION_FRONT_CENTER:
109 break;
110 case PA_CHANNEL_POSITION_FRONT_LEFT:
112 break;
113 case PA_CHANNEL_POSITION_FRONT_RIGHT:
115 break;
116 case PA_CHANNEL_POSITION_REAR_CENTER:
118 break;
119 case PA_CHANNEL_POSITION_REAR_LEFT:
121 break;
122 case PA_CHANNEL_POSITION_REAR_RIGHT:
124 break;
125 case PA_CHANNEL_POSITION_LFE:
127 break;
128 case PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER:
130 break;
131 case PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER:
133 break;
134 case PA_CHANNEL_POSITION_SIDE_LEFT:
136 break;
137 case PA_CHANNEL_POSITION_SIDE_RIGHT:
139 break;
140
141 case PA_CHANNEL_POSITION_TOP_CENTER:
143 break;
144 case PA_CHANNEL_POSITION_TOP_FRONT_LEFT:
146 break;
147 case PA_CHANNEL_POSITION_TOP_FRONT_RIGHT:
149 break;
150 case PA_CHANNEL_POSITION_TOP_FRONT_CENTER:
152 break;
153 case PA_CHANNEL_POSITION_TOP_REAR_LEFT:
155 break;
156 case PA_CHANNEL_POSITION_TOP_REAR_RIGHT:
158 break;
159 case PA_CHANNEL_POSITION_TOP_REAR_CENTER:
161 break;
162 default:
163 break;
164 }
165 }
167}
168
169QAudioFormat sampleSpecToAudioFormat(const pa_sample_spec &spec)
170{
172
173 format.setSampleRate(spec.rate);
174 format.setChannelCount(spec.channels);
175 QAudioFormat::SampleFormat sampleFormat;
176 switch (spec.format) {
177 case PA_SAMPLE_U8:
178 sampleFormat = QAudioFormat::UInt8;
179 break;
180 case PA_SAMPLE_S16LE:
181 case PA_SAMPLE_S16BE:
182 sampleFormat = QAudioFormat::Int16;
183 break;
184 case PA_SAMPLE_FLOAT32LE:
185 case PA_SAMPLE_FLOAT32BE:
186 sampleFormat = QAudioFormat::Float;
187 break;
188 case PA_SAMPLE_S32LE:
189 case PA_SAMPLE_S32BE:
190 sampleFormat = QAudioFormat::Int32;
191 break;
192 default:
193 return {};
194 }
195
196 format.setSampleFormat(sampleFormat);
197 return format;
198}
199
200}
201
The QAudioFormat class stores audio stream parameter information.
static Q_MULTIMEDIA_EXPORT ChannelConfig defaultChannelConfigForChannelCount(int channelCount)
Returns a default channel configuration for channelCount.
SampleFormat
Qt will always expect and use samples in the endianness of the host platform.
constexpr ChannelConfig channelConfig() const noexcept
Returns the current channel configuration.
ChannelConfig
\variable QAudioFormat::NChannelPositions
@ BigEndian
Definition qsysinfo.h:29
@ ByteOrder
Definition qsysinfo.h:34
QMap< QString, QString > map
[6]
pa_channel_map channelMapForAudioFormat(const QAudioFormat &format)
QAudioFormat::ChannelConfig channelConfigFromMap(const pa_channel_map &map)
QAudioFormat sampleSpecToAudioFormat(const pa_sample_spec &spec)
pa_sample_spec audioFormatToSampleSpec(const QAudioFormat &format)
Combined button and popup list for selecting options.
Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR uint qPopulationCount(quint32 v) noexcept
EGLConfig config
#define Q_LOGGING_CATEGORY(name,...)
GLint GLsizei GLsizei GLenum format
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
unsigned int quint32
Definition qtypes.h:45