Skip to content

Commit

Permalink
Use PipeWire's channels format instead of Microsoft's
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
davidebeatrici committed Jan 29, 2025
1 parent 68093b2 commit a818014
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 76 deletions.
60 changes: 40 additions & 20 deletions include/crossaudio/Channel.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,48 @@
#ifndef CROSSAUDIO_CHANNEL_H
#define CROSSAUDIO_CHANNEL_H

#define CROSSAUDIO_CH_NUM (18)
#define CROSSAUDIO_CH_NUM (64)

// Keep values in sync with PipeWire's spa_audio_channel.
enum CrossAudio_Channel {
CROSSAUDIO_CH_NONE = 0,
CROSSAUDIO_CH_FRONT_LEFT = 1 << 0,
CROSSAUDIO_CH_FRONT_RIGHT = 1 << 1,
CROSSAUDIO_CH_FRONT_CENTER = 1 << 2,
CROSSAUDIO_CH_LOW_FREQUENCY = 1 << 3,
CROSSAUDIO_CH_REAR_LEFT = 1 << 4,
CROSSAUDIO_CH_REAR_RIGHT = 1 << 5,
CROSSAUDIO_CH_FRONT_LEFT_CENTER = 1 << 6,
CROSSAUDIO_CH_FRONT_RIGHT_CENTER = 1 << 7,
CROSSAUDIO_CH_REAR_CENTER = 1 << 8,
CROSSAUDIO_CH_SIDE_LEFT = 1 << 9,
CROSSAUDIO_CH_SIDE_RIGHT = 1 << 10,
CROSSAUDIO_CH_TOP_CENTER = 1 << 11,
CROSSAUDIO_CH_TOP_FRONT_LEFT = 1 << 12,
CROSSAUDIO_CH_TOP_FRONT_CENTER = 1 << 13,
CROSSAUDIO_CH_TOP_FRONT_RIGHT = 1 << 14,
CROSSAUDIO_CH_TOP_REAR_LEFT = 1 << 15,
CROSSAUDIO_CH_TOP_REAR_CENTER = 1 << 16,
CROSSAUDIO_CH_TOP_REAR_RIGHT = 1 << 17
CROSSAUDIO_CH_UNKNOWN = 0,
CROSSAUDIO_CH_MONO = 2,

CROSSAUDIO_CH_FRONT_LEFT,
CROSSAUDIO_CH_FRONT_RIGHT,
CROSSAUDIO_CH_FRONT_CENTER,
CROSSAUDIO_CH_LFE,
CROSSAUDIO_CH_SIDE_LEFT,
CROSSAUDIO_CH_SIDE_RIGHT,
CROSSAUDIO_CH_FRONT_LEFT_CENTER,
CROSSAUDIO_CH_FRONT_RIGHT_CENTER,
CROSSAUDIO_CH_REAR_CENTER,
CROSSAUDIO_CH_REAR_LEFT,
CROSSAUDIO_CH_REAR_RIGHT,
CROSSAUDIO_CH_TOP_CENTER,
CROSSAUDIO_CH_TOP_FRONT_LEFT,
CROSSAUDIO_CH_TOP_FRONT_CENTER,
CROSSAUDIO_CH_TOP_FRONT_RIGHT,
CROSSAUDIO_CH_TOP_REAR_LEFT,
CROSSAUDIO_CH_TOP_REAR_CENTER,
CROSSAUDIO_CH_TOP_REAR_RIGHT,
CROSSAUDIO_CH_REAR_LEFT_CENTER,
CROSSAUDIO_CH_REAR_RIGHT_CENTER,
CROSSAUDIO_CH_FRONT_LEFT_WIDE,
CROSSAUDIO_CH_FRONT_RIGHT_WIDE,
CROSSAUDIO_CH_LFE2,
CROSSAUDIO_CH_FRONT_LEFT_HIGH,
CROSSAUDIO_CH_FRONT_CENTER_HIGH,
CROSSAUDIO_CH_FRONT_RIGHT_HIGH,
CROSSAUDIO_CH_TOP_FRONT_LEFT_CENTER,
CROSSAUDIO_CH_TOP_FRONT_RIGHT_CENTER,
CROSSAUDIO_CH_TOP_SIDE_LEFT,
CROSSAUDIO_CH_TOP_SIDE_RIGHT,
CROSSAUDIO_CH_LEFT_LFE,
CROSSAUDIO_CH_RIGHT_LFE,
CROSSAUDIO_CH_BOTTOM_CENTER,
CROSSAUDIO_CH_BOTTOM_LEFT_CENTER,
CROSSAUDIO_CH_BOTTOM_RIGHT_CENTER,
};

#endif
47 changes: 1 addition & 46 deletions src/backends/PipeWire/Flux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ typedef CrossAudio_FluxData FluxData;

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

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

for (uint8_t i = 0; i < SPA_MIN(config.channels, CROSSAUDIO_ARRAY_SIZE(config.position)); ++i) {
info.position[i] = translateChannel(config.position[i]);
info.position[i] = config.position[i];
}

return info;
Expand Down Expand Up @@ -240,47 +239,3 @@ static constexpr spa_audio_format translateFormat(const CrossAudio_BitFormat for

return SPA_AUDIO_FORMAT_UNKNOWN;
}

static constexpr spa_audio_channel translateChannel(const CrossAudio_Channel channel) {
switch (channel) {
default:
case CROSSAUDIO_CH_NONE:
return SPA_AUDIO_CHANNEL_UNKNOWN;
case CROSSAUDIO_CH_FRONT_LEFT:
return SPA_AUDIO_CHANNEL_FL;
case CROSSAUDIO_CH_FRONT_RIGHT:
return SPA_AUDIO_CHANNEL_FR;
case CROSSAUDIO_CH_FRONT_CENTER:
return SPA_AUDIO_CHANNEL_FC;
case CROSSAUDIO_CH_LOW_FREQUENCY:
return SPA_AUDIO_CHANNEL_LFE;
case CROSSAUDIO_CH_REAR_LEFT:
return SPA_AUDIO_CHANNEL_RL;
case CROSSAUDIO_CH_REAR_RIGHT:
return SPA_AUDIO_CHANNEL_RR;
case CROSSAUDIO_CH_FRONT_LEFT_CENTER:
return SPA_AUDIO_CHANNEL_FLC;
case CROSSAUDIO_CH_FRONT_RIGHT_CENTER:
return SPA_AUDIO_CHANNEL_FRC;
case CROSSAUDIO_CH_REAR_CENTER:
return SPA_AUDIO_CHANNEL_RC;
case CROSSAUDIO_CH_SIDE_LEFT:
return SPA_AUDIO_CHANNEL_SL;
case CROSSAUDIO_CH_SIDE_RIGHT:
return SPA_AUDIO_CHANNEL_SR;
case CROSSAUDIO_CH_TOP_CENTER:
return SPA_AUDIO_CHANNEL_TC;
case CROSSAUDIO_CH_TOP_FRONT_LEFT:
return SPA_AUDIO_CHANNEL_TFL;
case CROSSAUDIO_CH_TOP_FRONT_CENTER:
return SPA_AUDIO_CHANNEL_TFC;
case CROSSAUDIO_CH_TOP_FRONT_RIGHT:
return SPA_AUDIO_CHANNEL_TFR;
case CROSSAUDIO_CH_TOP_REAR_LEFT:
return SPA_AUDIO_CHANNEL_TRL;
case CROSSAUDIO_CH_TOP_REAR_CENTER:
return SPA_AUDIO_CHANNEL_TRC;
case CROSSAUDIO_CH_TOP_REAR_RIGHT:
return SPA_AUDIO_CHANNEL_TRR;
}
}
22 changes: 12 additions & 10 deletions src/backends/PulseAudio/Flux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,30 +229,32 @@ static constexpr pa_sample_format translateFormat(const CrossAudio_BitFormat for
static constexpr pa_channel_position translateChannel(const CrossAudio_Channel channel) {
switch (channel) {
default:
case CROSSAUDIO_CH_NONE:
case CROSSAUDIO_CH_UNKNOWN:
return PA_CHANNEL_POSITION_INVALID;
case CROSSAUDIO_CH_MONO:
return PA_CHANNEL_POSITION_MONO;
case CROSSAUDIO_CH_FRONT_LEFT:
return PA_CHANNEL_POSITION_FRONT_LEFT;
case CROSSAUDIO_CH_FRONT_RIGHT:
return PA_CHANNEL_POSITION_FRONT_RIGHT;
case CROSSAUDIO_CH_FRONT_CENTER:
return PA_CHANNEL_POSITION_FRONT_CENTER;
case CROSSAUDIO_CH_LOW_FREQUENCY:
case CROSSAUDIO_CH_LFE:
return PA_CHANNEL_POSITION_LFE;
case CROSSAUDIO_CH_REAR_LEFT:
return PA_CHANNEL_POSITION_REAR_LEFT;
case CROSSAUDIO_CH_REAR_RIGHT:
return PA_CHANNEL_POSITION_REAR_RIGHT;
case CROSSAUDIO_CH_SIDE_LEFT:
return PA_CHANNEL_POSITION_SIDE_LEFT;
case CROSSAUDIO_CH_SIDE_RIGHT:
return PA_CHANNEL_POSITION_SIDE_RIGHT;
case CROSSAUDIO_CH_FRONT_LEFT_CENTER:
return PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;
case CROSSAUDIO_CH_FRONT_RIGHT_CENTER:
return PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;
case CROSSAUDIO_CH_REAR_CENTER:
return PA_CHANNEL_POSITION_REAR_CENTER;
case CROSSAUDIO_CH_SIDE_LEFT:
return PA_CHANNEL_POSITION_SIDE_LEFT;
case CROSSAUDIO_CH_SIDE_RIGHT:
return PA_CHANNEL_POSITION_SIDE_RIGHT;
case CROSSAUDIO_CH_REAR_LEFT:
return PA_CHANNEL_POSITION_REAR_LEFT;
case CROSSAUDIO_CH_REAR_RIGHT:
return PA_CHANNEL_POSITION_REAR_RIGHT;
case CROSSAUDIO_CH_TOP_CENTER:
return PA_CHANNEL_POSITION_TOP_CENTER;
case CROSSAUDIO_CH_TOP_FRONT_LEFT:
Expand Down

0 comments on commit a818014

Please sign in to comment.