Skip to content

Commit a818014

Browse files
Use PipeWire's channels format instead of Microsoft's
In addition to supporting extra channels, the values are sequential. We don't need a mask because our API uses a position array to define the positioning.
1 parent 68093b2 commit a818014

3 files changed

Lines changed: 53 additions & 76 deletions

File tree

include/crossaudio/Channel.h

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,48 @@
66
#ifndef CROSSAUDIO_CHANNEL_H
77
#define CROSSAUDIO_CHANNEL_H
88

9-
#define CROSSAUDIO_CH_NUM (18)
9+
#define CROSSAUDIO_CH_NUM (64)
1010

11+
// Keep values in sync with PipeWire's spa_audio_channel.
1112
enum CrossAudio_Channel {
12-
CROSSAUDIO_CH_NONE = 0,
13-
CROSSAUDIO_CH_FRONT_LEFT = 1 << 0,
14-
CROSSAUDIO_CH_FRONT_RIGHT = 1 << 1,
15-
CROSSAUDIO_CH_FRONT_CENTER = 1 << 2,
16-
CROSSAUDIO_CH_LOW_FREQUENCY = 1 << 3,
17-
CROSSAUDIO_CH_REAR_LEFT = 1 << 4,
18-
CROSSAUDIO_CH_REAR_RIGHT = 1 << 5,
19-
CROSSAUDIO_CH_FRONT_LEFT_CENTER = 1 << 6,
20-
CROSSAUDIO_CH_FRONT_RIGHT_CENTER = 1 << 7,
21-
CROSSAUDIO_CH_REAR_CENTER = 1 << 8,
22-
CROSSAUDIO_CH_SIDE_LEFT = 1 << 9,
23-
CROSSAUDIO_CH_SIDE_RIGHT = 1 << 10,
24-
CROSSAUDIO_CH_TOP_CENTER = 1 << 11,
25-
CROSSAUDIO_CH_TOP_FRONT_LEFT = 1 << 12,
26-
CROSSAUDIO_CH_TOP_FRONT_CENTER = 1 << 13,
27-
CROSSAUDIO_CH_TOP_FRONT_RIGHT = 1 << 14,
28-
CROSSAUDIO_CH_TOP_REAR_LEFT = 1 << 15,
29-
CROSSAUDIO_CH_TOP_REAR_CENTER = 1 << 16,
30-
CROSSAUDIO_CH_TOP_REAR_RIGHT = 1 << 17
13+
CROSSAUDIO_CH_UNKNOWN = 0,
14+
CROSSAUDIO_CH_MONO = 2,
15+
16+
CROSSAUDIO_CH_FRONT_LEFT,
17+
CROSSAUDIO_CH_FRONT_RIGHT,
18+
CROSSAUDIO_CH_FRONT_CENTER,
19+
CROSSAUDIO_CH_LFE,
20+
CROSSAUDIO_CH_SIDE_LEFT,
21+
CROSSAUDIO_CH_SIDE_RIGHT,
22+
CROSSAUDIO_CH_FRONT_LEFT_CENTER,
23+
CROSSAUDIO_CH_FRONT_RIGHT_CENTER,
24+
CROSSAUDIO_CH_REAR_CENTER,
25+
CROSSAUDIO_CH_REAR_LEFT,
26+
CROSSAUDIO_CH_REAR_RIGHT,
27+
CROSSAUDIO_CH_TOP_CENTER,
28+
CROSSAUDIO_CH_TOP_FRONT_LEFT,
29+
CROSSAUDIO_CH_TOP_FRONT_CENTER,
30+
CROSSAUDIO_CH_TOP_FRONT_RIGHT,
31+
CROSSAUDIO_CH_TOP_REAR_LEFT,
32+
CROSSAUDIO_CH_TOP_REAR_CENTER,
33+
CROSSAUDIO_CH_TOP_REAR_RIGHT,
34+
CROSSAUDIO_CH_REAR_LEFT_CENTER,
35+
CROSSAUDIO_CH_REAR_RIGHT_CENTER,
36+
CROSSAUDIO_CH_FRONT_LEFT_WIDE,
37+
CROSSAUDIO_CH_FRONT_RIGHT_WIDE,
38+
CROSSAUDIO_CH_LFE2,
39+
CROSSAUDIO_CH_FRONT_LEFT_HIGH,
40+
CROSSAUDIO_CH_FRONT_CENTER_HIGH,
41+
CROSSAUDIO_CH_FRONT_RIGHT_HIGH,
42+
CROSSAUDIO_CH_TOP_FRONT_LEFT_CENTER,
43+
CROSSAUDIO_CH_TOP_FRONT_RIGHT_CENTER,
44+
CROSSAUDIO_CH_TOP_SIDE_LEFT,
45+
CROSSAUDIO_CH_TOP_SIDE_RIGHT,
46+
CROSSAUDIO_CH_LEFT_LFE,
47+
CROSSAUDIO_CH_RIGHT_LFE,
48+
CROSSAUDIO_CH_BOTTOM_CENTER,
49+
CROSSAUDIO_CH_BOTTOM_LEFT_CENTER,
50+
CROSSAUDIO_CH_BOTTOM_RIGHT_CENTER,
3151
};
3252

3353
#endif

src/backends/PipeWire/Flux.cpp

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ typedef CrossAudio_FluxData FluxData;
2424

2525
static constexpr spa_audio_info_raw configToInfo(const FluxConfig &config);
2626
static constexpr spa_audio_format translateFormat(CrossAudio_BitFormat format, uint8_t sampleBits);
27-
static constexpr spa_audio_channel translateChannel(CrossAudio_Channel channel);
2827

2928
static constexpr pw_stream_events eventsInput = {
3029
PW_VERSION_STREAM_EVENTS, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
@@ -190,7 +189,7 @@ static constexpr spa_audio_info_raw configToInfo(const FluxConfig &config) {
190189
info.rate = config.sampleRate;
191190

192191
for (uint8_t i = 0; i < SPA_MIN(config.channels, CROSSAUDIO_ARRAY_SIZE(config.position)); ++i) {
193-
info.position[i] = translateChannel(config.position[i]);
192+
info.position[i] = config.position[i];
194193
}
195194

196195
return info;
@@ -240,47 +239,3 @@ static constexpr spa_audio_format translateFormat(const CrossAudio_BitFormat for
240239

241240
return SPA_AUDIO_FORMAT_UNKNOWN;
242241
}
243-
244-
static constexpr spa_audio_channel translateChannel(const CrossAudio_Channel channel) {
245-
switch (channel) {
246-
default:
247-
case CROSSAUDIO_CH_NONE:
248-
return SPA_AUDIO_CHANNEL_UNKNOWN;
249-
case CROSSAUDIO_CH_FRONT_LEFT:
250-
return SPA_AUDIO_CHANNEL_FL;
251-
case CROSSAUDIO_CH_FRONT_RIGHT:
252-
return SPA_AUDIO_CHANNEL_FR;
253-
case CROSSAUDIO_CH_FRONT_CENTER:
254-
return SPA_AUDIO_CHANNEL_FC;
255-
case CROSSAUDIO_CH_LOW_FREQUENCY:
256-
return SPA_AUDIO_CHANNEL_LFE;
257-
case CROSSAUDIO_CH_REAR_LEFT:
258-
return SPA_AUDIO_CHANNEL_RL;
259-
case CROSSAUDIO_CH_REAR_RIGHT:
260-
return SPA_AUDIO_CHANNEL_RR;
261-
case CROSSAUDIO_CH_FRONT_LEFT_CENTER:
262-
return SPA_AUDIO_CHANNEL_FLC;
263-
case CROSSAUDIO_CH_FRONT_RIGHT_CENTER:
264-
return SPA_AUDIO_CHANNEL_FRC;
265-
case CROSSAUDIO_CH_REAR_CENTER:
266-
return SPA_AUDIO_CHANNEL_RC;
267-
case CROSSAUDIO_CH_SIDE_LEFT:
268-
return SPA_AUDIO_CHANNEL_SL;
269-
case CROSSAUDIO_CH_SIDE_RIGHT:
270-
return SPA_AUDIO_CHANNEL_SR;
271-
case CROSSAUDIO_CH_TOP_CENTER:
272-
return SPA_AUDIO_CHANNEL_TC;
273-
case CROSSAUDIO_CH_TOP_FRONT_LEFT:
274-
return SPA_AUDIO_CHANNEL_TFL;
275-
case CROSSAUDIO_CH_TOP_FRONT_CENTER:
276-
return SPA_AUDIO_CHANNEL_TFC;
277-
case CROSSAUDIO_CH_TOP_FRONT_RIGHT:
278-
return SPA_AUDIO_CHANNEL_TFR;
279-
case CROSSAUDIO_CH_TOP_REAR_LEFT:
280-
return SPA_AUDIO_CHANNEL_TRL;
281-
case CROSSAUDIO_CH_TOP_REAR_CENTER:
282-
return SPA_AUDIO_CHANNEL_TRC;
283-
case CROSSAUDIO_CH_TOP_REAR_RIGHT:
284-
return SPA_AUDIO_CHANNEL_TRR;
285-
}
286-
}

src/backends/PulseAudio/Flux.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -229,30 +229,32 @@ static constexpr pa_sample_format translateFormat(const CrossAudio_BitFormat for
229229
static constexpr pa_channel_position translateChannel(const CrossAudio_Channel channel) {
230230
switch (channel) {
231231
default:
232-
case CROSSAUDIO_CH_NONE:
232+
case CROSSAUDIO_CH_UNKNOWN:
233233
return PA_CHANNEL_POSITION_INVALID;
234+
case CROSSAUDIO_CH_MONO:
235+
return PA_CHANNEL_POSITION_MONO;
234236
case CROSSAUDIO_CH_FRONT_LEFT:
235237
return PA_CHANNEL_POSITION_FRONT_LEFT;
236238
case CROSSAUDIO_CH_FRONT_RIGHT:
237239
return PA_CHANNEL_POSITION_FRONT_RIGHT;
238240
case CROSSAUDIO_CH_FRONT_CENTER:
239241
return PA_CHANNEL_POSITION_FRONT_CENTER;
240-
case CROSSAUDIO_CH_LOW_FREQUENCY:
242+
case CROSSAUDIO_CH_LFE:
241243
return PA_CHANNEL_POSITION_LFE;
242-
case CROSSAUDIO_CH_REAR_LEFT:
243-
return PA_CHANNEL_POSITION_REAR_LEFT;
244-
case CROSSAUDIO_CH_REAR_RIGHT:
245-
return PA_CHANNEL_POSITION_REAR_RIGHT;
244+
case CROSSAUDIO_CH_SIDE_LEFT:
245+
return PA_CHANNEL_POSITION_SIDE_LEFT;
246+
case CROSSAUDIO_CH_SIDE_RIGHT:
247+
return PA_CHANNEL_POSITION_SIDE_RIGHT;
246248
case CROSSAUDIO_CH_FRONT_LEFT_CENTER:
247249
return PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;
248250
case CROSSAUDIO_CH_FRONT_RIGHT_CENTER:
249251
return PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;
250252
case CROSSAUDIO_CH_REAR_CENTER:
251253
return PA_CHANNEL_POSITION_REAR_CENTER;
252-
case CROSSAUDIO_CH_SIDE_LEFT:
253-
return PA_CHANNEL_POSITION_SIDE_LEFT;
254-
case CROSSAUDIO_CH_SIDE_RIGHT:
255-
return PA_CHANNEL_POSITION_SIDE_RIGHT;
254+
case CROSSAUDIO_CH_REAR_LEFT:
255+
return PA_CHANNEL_POSITION_REAR_LEFT;
256+
case CROSSAUDIO_CH_REAR_RIGHT:
257+
return PA_CHANNEL_POSITION_REAR_RIGHT;
256258
case CROSSAUDIO_CH_TOP_CENTER:
257259
return PA_CHANNEL_POSITION_TOP_CENTER;
258260
case CROSSAUDIO_CH_TOP_FRONT_LEFT:

0 commit comments

Comments
 (0)