From bf60281ffb6f47986fa6ef9ee559689be0075050 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 10 Nov 2013 23:15:02 +0100 Subject: audio/out: reject non-interleaved formats No AO can handle these, so it would be a problem if they get added later, and non-interleaved formats get accepted erroneously. Let them gracefully fall back to other formats. Most AOs actually would fall back, but to an unrelated formats. This is covered by this commit too, and if possible they should pick the interleaved variant if a non-interleaved format is requested. --- audio/out/ao_alsa.c | 2 ++ audio/out/ao_coreaudio.c | 2 ++ audio/out/ao_dsound.c | 2 +- audio/out/ao_lavc.c | 1 + audio/out/ao_null.c | 2 ++ audio/out/ao_oss.c | 2 ++ audio/out/ao_pcm.c | 3 +++ audio/out/ao_portaudio.c | 2 ++ audio/out/ao_pulse.c | 2 ++ audio/out/ao_rsound.c | 2 ++ audio/out/ao_sdl.c | 2 ++ audio/out/ao_sndio.c | 3 +++ audio/out/ao_wasapi.c | 1 + 13 files changed, 25 insertions(+), 1 deletion(-) (limited to 'audio') diff --git a/audio/out/ao_alsa.c b/audio/out/ao_alsa.c index 5816ee5f5f..0d1c589e34 100644 --- a/audio/out/ao_alsa.c +++ b/audio/out/ao_alsa.c @@ -436,6 +436,8 @@ static int init(struct ao *ao) (p->alsa, alsa_hwparams, SND_PCM_ACCESS_RW_INTERLEAVED); CHECK_ALSA_ERROR("Unable to set access type"); + ao->format = af_fmt_from_planar(ao->format); + p->alsa_fmt = find_alsa_format(ao->format); if (p->alsa_fmt == SND_PCM_FORMAT_UNKNOWN) { p->alsa_fmt = SND_PCM_FORMAT_S16; diff --git a/audio/out/ao_coreaudio.c b/audio/out/ao_coreaudio.c index da526ada20..4823eb43e1 100644 --- a/audio/out/ao_coreaudio.c +++ b/audio/out/ao_coreaudio.c @@ -285,6 +285,8 @@ static int init(struct ao *ao) // Save selected device id p->device = selected_device; + ao->format = af_fmt_from_planar(ao->format); + bool supports_digital = false; /* Probe whether device support S/PDIF stream output if input is AC3 stream. */ if (AF_FORMAT_IS_AC3(ao->format)) { diff --git a/audio/out/ao_dsound.c b/audio/out/ao_dsound.c index 464947c0dc..58812d80e6 100644 --- a/audio/out/ao_dsound.c +++ b/audio/out/ao_dsound.c @@ -388,7 +388,7 @@ static int init(struct ao *ao) WAVEFORMATEXTENSIBLE wformat; DSBUFFERDESC dsbpridesc; DSBUFFERDESC dsbdesc; - int format = ao->format; + int format = af_fmt_from_planar(ao->format); int rate = ao->samplerate; if (AF_FORMAT_IS_AC3(format)) diff --git a/audio/out/ao_lavc.c b/audio/out/ao_lavc.c index 4364b9054d..b849f9b2b4 100644 --- a/audio/out/ao_lavc.c +++ b/audio/out/ao_lavc.c @@ -105,6 +105,7 @@ static int init(struct ao *ao) ac->stream->codec->channel_layout = mp_chmap_to_lavc(&ao->channels); ac->stream->codec->sample_fmt = AV_SAMPLE_FMT_NONE; + ao->format = af_fmt_from_planar(ao->format); { // first check if the selected format is somewhere in the list of diff --git a/audio/out/ao_null.c b/audio/out/ao_null.c index ff6b12a1a6..75e812b238 100644 --- a/audio/out/ao_null.c +++ b/audio/out/ao_null.c @@ -51,6 +51,8 @@ static int init(struct ao *ao) struct priv *priv = talloc_zero(ao, struct priv); ao->priv = priv; + ao->format = af_fmt_from_planar(ao->format); + struct mp_chmap_sel sel = {0}; mp_chmap_sel_add_any(&sel); if (!ao_chmap_sel_adjust(ao, &sel, &ao->channels)) diff --git a/audio/out/ao_oss.c b/audio/out/ao_oss.c index db9847851d..a97424c1cb 100644 --- a/audio/out/ao_oss.c +++ b/audio/out/ao_oss.c @@ -261,6 +261,8 @@ static int init(struct ao *ao) fcntl(p->audio_fd, F_SETFD, FD_CLOEXEC); #endif + ao->format = af_fmt_from_planar(ao->format); + if (AF_FORMAT_IS_AC3(ao->format)) { ioctl(p->audio_fd, SNDCTL_DSP_SPEED, &ao->samplerate); } diff --git a/audio/out/ao_pcm.c b/audio/out/ao_pcm.c index f7d793700d..e94e6b569a 100644 --- a/audio/out/ao_pcm.c +++ b/audio/out/ao_pcm.c @@ -118,6 +118,9 @@ static int init(struct ao *ao) if (!priv->outputfilename) priv->outputfilename = talloc_strdup(priv, priv->waveheader ? "audiodump.wav" : "audiodump.pcm"); + + ao->format = af_fmt_from_planar(ao->format); + if (priv->waveheader) { // WAV files must have one of the following formats diff --git a/audio/out/ao_portaudio.c b/audio/out/ao_portaudio.c index 8b235f8806..d75fad0aca 100644 --- a/audio/out/ao_portaudio.c +++ b/audio/out/ao_portaudio.c @@ -242,6 +242,8 @@ static int init(struct ao *ao) = Pa_GetDeviceInfo(pa_device)->defaultHighOutputLatency, }; + ao->format = af_fmt_from_planar(ao->format); + const struct format_map *fmt = format_maps; while (fmt->pa_format) { if (fmt->mp_format == ao->format) { diff --git a/audio/out/ao_pulse.c b/audio/out/ao_pulse.c index a4da2a179b..1d7fcdd382 100644 --- a/audio/out/ao_pulse.c +++ b/audio/out/ao_pulse.c @@ -286,6 +286,8 @@ static int init(struct ao *ao) ss.channels = ao->channels.num; ss.rate = ao->samplerate; + ao->format = af_fmt_from_planar(ao->format); + const struct format_map *fmt_map = format_maps; while (fmt_map->mp_format != ao->format) { if (fmt_map->mp_format == AF_FORMAT_UNKNOWN) { diff --git a/audio/out/ao_rsound.c b/audio/out/ao_rsound.c index 162fb21feb..95fadf7188 100644 --- a/audio/out/ao_rsound.c +++ b/audio/out/ao_rsound.c @@ -114,6 +114,8 @@ static int init(struct ao *ao) rsd_set_param(priv->rd, RSD_SAMPLERATE, &ao->samplerate); rsd_set_param(priv->rd, RSD_CHANNELS, &ao->channels.num); + ao->format = af_fmt_from_planar(ao->format); + int rsd_format = set_format(ao); rsd_set_param(priv->rd, RSD_FORMAT, &rsd_format); diff --git a/audio/out/ao_sdl.c b/audio/out/ao_sdl.c index a42c0812cb..d95a82615b 100644 --- a/audio/out/ao_sdl.c +++ b/audio/out/ao_sdl.c @@ -144,6 +144,8 @@ static int init(struct ao *ao) return -1; } + ao->format = af_fmt_from_planar(ao->format); + SDL_AudioSpec desired, obtained; switch (ao->format) { diff --git a/audio/out/ao_sndio.c b/audio/out/ao_sndio.c index ab9eaf8197..1786c0158d 100644 --- a/audio/out/ao_sndio.c +++ b/audio/out/ao_sndio.c @@ -130,6 +130,9 @@ static int init(struct ao *ao) MP_ERR(ao, "can't open sndio %s\n", p->dev); goto error; } + + ao->format = af_fmt_from_planar(ao->format); + sio_initpar(&p->par); for (i = 0, ap = af_to_par;; i++, ap++) { if (i == sizeof(af_to_par) / sizeof(struct af_to_par)) { diff --git a/audio/out/ao_wasapi.c b/audio/out/ao_wasapi.c index c605e1cd5d..5d9f33278c 100644 --- a/audio/out/ao_wasapi.c +++ b/audio/out/ao_wasapi.c @@ -1231,6 +1231,7 @@ static void uninit(struct ao *ao, bool immed) static int init(struct ao *ao) { mp_msg(MSGT_AO, MSGL_V, "ao-wasapi: init!\n"); + ao->format = af_fmt_from_planar(ao->format); struct mp_chmap_sel sel = {0}; mp_chmap_sel_add_waveext(&sel); if (!ao_chmap_sel_adjust(ao, &sel, &ao->channels)) -- cgit v1.2.3