Skip to content

Commit

Permalink
ao_pipewire: warn on unknown channels
Browse files Browse the repository at this point in the history
  • Loading branch information
t-8ch committed Jan 6, 2022
1 parent f3957fa commit be678a0
Showing 1 changed file with 44 additions and 29 deletions.
73 changes: 44 additions & 29 deletions audio/out/ao_pipewire.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,34 +46,49 @@ static enum spa_audio_format af_fmt_to_pw(enum af_format format)
}
}

static const enum spa_audio_channel mp_speaker_id_to_spa[] = {
[MP_SPEAKER_ID_FL] = SPA_AUDIO_CHANNEL_FL,
[MP_SPEAKER_ID_FR] = SPA_AUDIO_CHANNEL_FR,
[MP_SPEAKER_ID_FC] = SPA_AUDIO_CHANNEL_FC,
[MP_SPEAKER_ID_LFE] = SPA_AUDIO_CHANNEL_LFE,
[MP_SPEAKER_ID_BL] = SPA_AUDIO_CHANNEL_RL,
[MP_SPEAKER_ID_BR] = SPA_AUDIO_CHANNEL_RR,
[MP_SPEAKER_ID_FLC] = SPA_AUDIO_CHANNEL_FLC,
[MP_SPEAKER_ID_FRC] = SPA_AUDIO_CHANNEL_FRC,
[MP_SPEAKER_ID_BC] = SPA_AUDIO_CHANNEL_RC,
[MP_SPEAKER_ID_SL] = SPA_AUDIO_CHANNEL_SL,
[MP_SPEAKER_ID_SR] = SPA_AUDIO_CHANNEL_SR,
[MP_SPEAKER_ID_TC] = SPA_AUDIO_CHANNEL_TC,
[MP_SPEAKER_ID_TFL] = SPA_AUDIO_CHANNEL_TFL,
[MP_SPEAKER_ID_TFC] = SPA_AUDIO_CHANNEL_TFC,
[MP_SPEAKER_ID_TFR] = SPA_AUDIO_CHANNEL_TFR,
[MP_SPEAKER_ID_TBL] = SPA_AUDIO_CHANNEL_TRL,
[MP_SPEAKER_ID_TBC] = SPA_AUDIO_CHANNEL_TRC,
[MP_SPEAKER_ID_TBR] = SPA_AUDIO_CHANNEL_TRR,
[MP_SPEAKER_ID_DL] = SPA_AUDIO_CHANNEL_FL,
[MP_SPEAKER_ID_DR] = SPA_AUDIO_CHANNEL_FR,
[MP_SPEAKER_ID_WL] = SPA_AUDIO_CHANNEL_FL,
[MP_SPEAKER_ID_WR] = SPA_AUDIO_CHANNEL_FR,
[MP_SPEAKER_ID_SDL] = SPA_AUDIO_CHANNEL_SL,
[MP_SPEAKER_ID_SDR] = SPA_AUDIO_CHANNEL_SL,
[MP_SPEAKER_ID_LFE2] = SPA_AUDIO_CHANNEL_LFE2,
[MP_SPEAKER_ID_NA] = SPA_AUDIO_CHANNEL_NA,
};

static enum spa_audio_channel mp_speaker_id_to_spa(struct ao *ao, enum mp_speaker_id mp_speaker_id)
{
static const enum spa_audio_channel mapping[] = {
[MP_SPEAKER_ID_FL] = SPA_AUDIO_CHANNEL_FL,
[MP_SPEAKER_ID_FR] = SPA_AUDIO_CHANNEL_FR,
[MP_SPEAKER_ID_FC] = SPA_AUDIO_CHANNEL_FC,
[MP_SPEAKER_ID_LFE] = SPA_AUDIO_CHANNEL_LFE,
[MP_SPEAKER_ID_BL] = SPA_AUDIO_CHANNEL_RL,
[MP_SPEAKER_ID_BR] = SPA_AUDIO_CHANNEL_RR,
[MP_SPEAKER_ID_FLC] = SPA_AUDIO_CHANNEL_FLC,
[MP_SPEAKER_ID_FRC] = SPA_AUDIO_CHANNEL_FRC,
[MP_SPEAKER_ID_BC] = SPA_AUDIO_CHANNEL_RC,
[MP_SPEAKER_ID_SL] = SPA_AUDIO_CHANNEL_SL,
[MP_SPEAKER_ID_SR] = SPA_AUDIO_CHANNEL_SR,
[MP_SPEAKER_ID_TC] = SPA_AUDIO_CHANNEL_TC,
[MP_SPEAKER_ID_TFL] = SPA_AUDIO_CHANNEL_TFL,
[MP_SPEAKER_ID_TFC] = SPA_AUDIO_CHANNEL_TFC,
[MP_SPEAKER_ID_TFR] = SPA_AUDIO_CHANNEL_TFR,
[MP_SPEAKER_ID_TBL] = SPA_AUDIO_CHANNEL_TRL,
[MP_SPEAKER_ID_TBC] = SPA_AUDIO_CHANNEL_TRC,
[MP_SPEAKER_ID_TBR] = SPA_AUDIO_CHANNEL_TRR,
[MP_SPEAKER_ID_DL] = SPA_AUDIO_CHANNEL_FL,
[MP_SPEAKER_ID_DR] = SPA_AUDIO_CHANNEL_FR,
[MP_SPEAKER_ID_WL] = SPA_AUDIO_CHANNEL_FL,
[MP_SPEAKER_ID_WR] = SPA_AUDIO_CHANNEL_FR,
[MP_SPEAKER_ID_SDL] = SPA_AUDIO_CHANNEL_SL,
[MP_SPEAKER_ID_SDR] = SPA_AUDIO_CHANNEL_SL,
[MP_SPEAKER_ID_LFE2] = SPA_AUDIO_CHANNEL_LFE2,
[MP_SPEAKER_ID_NA] = SPA_AUDIO_CHANNEL_NA,
};

// MP_SPEAKER_ID_FL is zero which we also check as a sentinel value for
// an unknown channel, so test this here explicitly
if (MP_SPEAKER_ID_FL == mp_speaker_id)
return SPA_AUDIO_CHANNEL_FL;
enum spa_audio_channel spa_audio_channel = mapping[mp_speaker_id];
if (!spa_audio_channel) {
return SPA_AUDIO_CHANNEL_NA;
MP_WARN(ao, "Unhandled channel %d\n", mp_speaker_id);
}
return spa_audio_channel;
}

static void on_process(void *userdata)
{
Expand Down Expand Up @@ -239,7 +254,7 @@ static int init(struct ao *ao)
};

for (int i = 0; i < ao->channels.num; i++)
audio_info.position[i] = mp_speaker_id_to_spa[ao->channels.speaker[i]];
audio_info.position[i] = mp_speaker_id_to_spa(ao, ao->channels.speaker[i]);

params[0] = spa_format_audio_raw_build(&b, SPA_PARAM_EnumFormat, &audio_info);

Expand Down

0 comments on commit be678a0

Please sign in to comment.