8Q_LOGGING_CATEGORY(qLcPulseAudioOut,
"qt.multimedia.pulseaudio.output")
9Q_LOGGING_CATEGORY(qLcPulseAudioIn,
"qt.multimedia.pulseaudio.input")
10Q_LOGGING_CATEGORY(qLcPulseAudioEngine,
"qt.multimedia.pulseaudio.engine")
20 spec.format = PA_SAMPLE_INVALID;
21 const bool isBigEndian = QSysInfo::ByteOrder == QSysInfo::BigEndian;
24 spec.format = PA_SAMPLE_U8;
26 spec.format = isBigEndian ? PA_SAMPLE_S16BE : PA_SAMPLE_S16LE;
28 spec.format = isBigEndian ? PA_SAMPLE_S32BE : PA_SAMPLE_S32LE;
30 spec.format = isBigEndian ? PA_SAMPLE_FLOAT32BE : PA_SAMPLE_FLOAT32LE;
42 if (config == QAudioFormat::ChannelConfigUnknown)
43 config = QAudioFormat::defaultChannelConfigForChannelCount(format.channelCount());
47 map.map[0] = PA_CHANNEL_POSITION_MONO;
50 map.map[map.channels++] = PA_CHANNEL_POSITION_FRONT_LEFT;
52 map.map[map.channels++] = PA_CHANNEL_POSITION_FRONT_RIGHT;
54 map.map[map.channels++] = PA_CHANNEL_POSITION_FRONT_CENTER;
56 map.map[map.channels++] = PA_CHANNEL_POSITION_LFE;
58 map.map[map.channels++] = PA_CHANNEL_POSITION_REAR_LEFT;
60 map.map[map.channels++] = PA_CHANNEL_POSITION_REAR_RIGHT;
62 map.map[map.channels++] = PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;
64 map.map[map.channels++] = PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;
66 map.map[map.channels++] = PA_CHANNEL_POSITION_REAR_CENTER;
68 map.map[map.channels++] = PA_CHANNEL_POSITION_LFE;
70 map.map[map.channels++] = PA_CHANNEL_POSITION_SIDE_LEFT;
72 map.map[map.channels++] = PA_CHANNEL_POSITION_SIDE_RIGHT;
74 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_FRONT_LEFT;
76 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_FRONT_RIGHT;
78 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_FRONT_CENTER;
80 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_CENTER;
82 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_REAR_LEFT;
84 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_REAR_RIGHT;
86 map.map[map.channels++] = PA_CHANNEL_POSITION_AUX0;
88 map.map[map.channels++] = PA_CHANNEL_POSITION_AUX1;
90 map.map[map.channels++] = PA_CHANNEL_POSITION_TOP_REAR_CENTER;
92 map.map[map.channels++] = PA_CHANNEL_POSITION_AUX2;
94 map.map[map.channels++] = PA_CHANNEL_POSITION_AUX3;
96 map.map[map.channels++] = PA_CHANNEL_POSITION_AUX4;
99 Q_ASSERT(qPopulationCount(config) == map.channels);
106 for (
int i = 0; i < map.channels; ++i) {
107 switch (map.map[i]) {
108 case PA_CHANNEL_POSITION_MONO:
109 case PA_CHANNEL_POSITION_FRONT_CENTER:
112 case PA_CHANNEL_POSITION_FRONT_LEFT:
115 case PA_CHANNEL_POSITION_FRONT_RIGHT:
118 case PA_CHANNEL_POSITION_REAR_CENTER:
121 case PA_CHANNEL_POSITION_REAR_LEFT:
124 case PA_CHANNEL_POSITION_REAR_RIGHT:
127 case PA_CHANNEL_POSITION_LFE:
130 case PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER:
133 case PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER:
136 case PA_CHANNEL_POSITION_SIDE_LEFT:
139 case PA_CHANNEL_POSITION_SIDE_RIGHT:
143 case PA_CHANNEL_POSITION_TOP_CENTER:
146 case PA_CHANNEL_POSITION_TOP_FRONT_LEFT:
149 case PA_CHANNEL_POSITION_TOP_FRONT_RIGHT:
152 case PA_CHANNEL_POSITION_TOP_FRONT_CENTER:
155 case PA_CHANNEL_POSITION_TOP_REAR_LEFT:
158 case PA_CHANNEL_POSITION_TOP_REAR_RIGHT:
161 case PA_CHANNEL_POSITION_TOP_REAR_CENTER:
178 switch (spec.format) {
182 case PA_SAMPLE_S16LE:
183 case PA_SAMPLE_S16BE:
186 case PA_SAMPLE_FLOAT32LE:
187 case PA_SAMPLE_FLOAT32BE:
190 case PA_SAMPLE_S32LE:
191 case PA_SAMPLE_S32BE:
204 return pa_strerror(pa_context_errno(context));
209 return currentError(pa_stream_get_context(stream));
214 return PAOperationHandle{
215 pa_stream_cork(stream.get(), corkStream ? 1 : 0,
nullptr,
nullptr),
216 PAOperationHandle::HasRef,
224 using namespace Qt::StringLiterals;
227 case PA_STREAM_UNCONNECTED:
return "Unconnected"_L1;
228 case PA_STREAM_CREATING:
return "Creating"_L1;
229 case PA_STREAM_READY:
return "Ready"_L1;
230 case PA_STREAM_FAILED:
return "Failed"_L1;
231 case PA_STREAM_TERMINATED:
return "Terminated"_L1;
232 default: Q_UNREACHABLE_RETURN(
"Unknown stream state"_L1);
238 using namespace Qt::StringLiterals;
241 case PA_SAMPLE_U8:
return "Unsigned 8 Bit PCM."_L1;
242 case PA_SAMPLE_ALAW:
return "8 Bit a-Law "_L1;
243 case PA_SAMPLE_ULAW:
return "8 Bit mu-Law"_L1;
244 case PA_SAMPLE_S16LE:
return "Signed 16 Bit PCM, little endian (PC)."_L1;
245 case PA_SAMPLE_S16BE:
return "Signed 16 Bit PCM, big endian."_L1;
246 case PA_SAMPLE_FLOAT32LE:
return "32 Bit IEEE floating point, little endian (PC), range -1.0 to 1.0"_L1;
247 case PA_SAMPLE_FLOAT32BE:
return "32 Bit IEEE floating point, big endian, range -1.0 to 1.0"_L1;
248 case PA_SAMPLE_S32LE:
return "Signed 32 Bit PCM, little endian (PC)."_L1;
249 case PA_SAMPLE_S32BE:
return "Signed 32 Bit PCM, big endian."_L1;
250 case PA_SAMPLE_S24LE:
return "Signed 24 Bit PCM packed, little endian (PC)."_L1;
251 case PA_SAMPLE_S24BE:
return "Signed 24 Bit PCM packed, big endian."_L1;
252 case PA_SAMPLE_S24_32LE:
return "Signed 24 Bit PCM in LSB of 32 Bit words, little endian (PC)."_L1;
253 case PA_SAMPLE_S24_32BE:
return "Signed 24 Bit PCM in LSB of 32 Bit words, big endian."_L1;
254 case PA_SAMPLE_MAX:
return "Upper limit of valid sample types."_L1;
255 case PA_SAMPLE_INVALID:
return "Invalid sample format"_L1;
256 default: Q_UNREACHABLE_RETURN(
"Unknown sample format"_L1);
262 using namespace Qt::StringLiterals;
265 case PA_CONTEXT_UNCONNECTED:
return "Unconnected"_L1;
266 case PA_CONTEXT_CONNECTING:
return "Connecting"_L1;
267 case PA_CONTEXT_AUTHORIZING:
return "Authorizing"_L1;
268 case PA_CONTEXT_SETTING_NAME:
return "Setting Name"_L1;
269 case PA_CONTEXT_READY:
return "Ready"_L1;
270 case PA_CONTEXT_FAILED:
return "Failed"_L1;
271 case PA_CONTEXT_TERMINATED:
return "Terminated"_L1;
272 default: Q_UNREACHABLE_RETURN(
"Unknown context state"_L1);
279 return dbg << stateToQStringView(state);
284 return dbg << sampleFormatToQStringView(format);
289 return dbg << stateToQStringView(state);
QUtf8StringView currentError(const pa_context *context)
QUtf8StringView currentError(const pa_stream *stream)
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)
PAOperationHandle streamCork(const PAStreamHandle &stream, bool corkStream)
static QLatin1StringView stateToQStringView(pa_stream_state_t state)
static QLatin1StringView stateToQStringView(pa_context_state_t state)
static QLatin1StringView sampleFormatToQStringView(pa_sample_format format)
QDebug operator<<(QDebug dbg, pa_sample_format format)
QDebug operator<<(QDebug dbg, pa_stream_state_t state)
QDebug operator<<(QDebug dbg, pa_context_state_t state)