mirror of
https://github.com/mpv-player/mpv
synced 2025-02-16 12:17:12 +00:00
ao_pipewire: add support for SPDIF formats
This commit is contained in:
parent
790b12da89
commit
5c252715bd
@ -103,6 +103,20 @@ static enum spa_audio_format af_fmt_to_pw(enum af_format format)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum spa_audio_iec958_codec af_fmt_to_codec(enum af_format format)
|
||||||
|
{
|
||||||
|
switch (format) {
|
||||||
|
case AF_FORMAT_S_AAC: return SPA_AUDIO_IEC958_CODEC_MPEG2_AAC;
|
||||||
|
case AF_FORMAT_S_AC3: return SPA_AUDIO_IEC958_CODEC_AC3;
|
||||||
|
case AF_FORMAT_S_DTS: return SPA_AUDIO_IEC958_CODEC_DTS;
|
||||||
|
case AF_FORMAT_S_DTSHD: return SPA_AUDIO_IEC958_CODEC_DTSHD;
|
||||||
|
case AF_FORMAT_S_EAC3: return SPA_AUDIO_IEC958_CODEC_EAC3;
|
||||||
|
case AF_FORMAT_S_MP3: return SPA_AUDIO_IEC958_CODEC_MPEG;
|
||||||
|
case AF_FORMAT_S_TRUEHD: return SPA_AUDIO_IEC958_CODEC_TRUEHD;
|
||||||
|
default: return SPA_AUDIO_IEC958_CODEC_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static enum spa_audio_channel mp_speaker_id_to_spa(struct ao *ao, enum mp_speaker_id mp_speaker_id)
|
static enum spa_audio_channel mp_speaker_id_to_spa(struct ao *ao, enum mp_speaker_id mp_speaker_id)
|
||||||
{
|
{
|
||||||
switch (mp_speaker_id) {
|
switch (mp_speaker_id) {
|
||||||
@ -578,25 +592,42 @@ static int init(struct ao *ao)
|
|||||||
|
|
||||||
pw_properties_setf(props, PW_KEY_NODE_RATE, "1/%d", ao->samplerate);
|
pw_properties_setf(props, PW_KEY_NODE_RATE, "1/%d", ao->samplerate);
|
||||||
|
|
||||||
enum spa_audio_format spa_format = af_fmt_to_pw(ao->format);
|
if (af_fmt_is_spdif(ao->format)) {
|
||||||
if (spa_format == SPA_AUDIO_FORMAT_UNKNOWN) {
|
enum spa_audio_iec958_codec spa_codec = af_fmt_to_codec(ao->format);
|
||||||
MP_ERR(ao, "Unhandled format %d\n", ao->format);
|
if (spa_codec == SPA_AUDIO_IEC958_CODEC_UNKNOWN) {
|
||||||
goto error_props;
|
MP_ERR(ao, "Unhandled codec %d\n", ao->format);
|
||||||
|
goto error_props;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct spa_audio_info_iec958 audio_info = {
|
||||||
|
.codec = spa_codec,
|
||||||
|
.rate = ao->samplerate,
|
||||||
|
};
|
||||||
|
|
||||||
|
params[0] = spa_format_audio_iec958_build(&b, SPA_PARAM_EnumFormat, &audio_info);
|
||||||
|
if (!params[0])
|
||||||
|
goto error_props;
|
||||||
|
} else {
|
||||||
|
enum spa_audio_format spa_format = af_fmt_to_pw(ao->format);
|
||||||
|
if (spa_format == SPA_AUDIO_FORMAT_UNKNOWN) {
|
||||||
|
MP_ERR(ao, "Unhandled format %d\n", ao->format);
|
||||||
|
goto error_props;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct spa_audio_info_raw audio_info = {
|
||||||
|
.format = spa_format,
|
||||||
|
.rate = ao->samplerate,
|
||||||
|
.channels = ao->channels.num,
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int i = 0; i < ao->channels.num; 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);
|
||||||
|
if (!params[0])
|
||||||
|
goto error_props;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct spa_audio_info_raw audio_info = {
|
|
||||||
.format = spa_format,
|
|
||||||
.rate = ao->samplerate,
|
|
||||||
.channels = ao->channels.num,
|
|
||||||
};
|
|
||||||
|
|
||||||
for (int i = 0; i < ao->channels.num; 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);
|
|
||||||
if (!params[0])
|
|
||||||
goto error_props;
|
|
||||||
|
|
||||||
if (af_fmt_is_planar(ao->format)) {
|
if (af_fmt_is_planar(ao->format)) {
|
||||||
ao->num_planes = ao->channels.num;
|
ao->num_planes = ao->channels.num;
|
||||||
ao->sstride = af_fmt_to_bytes(ao->format);
|
ao->sstride = af_fmt_to_bytes(ao->format);
|
||||||
|
Loading…
Reference in New Issue
Block a user