summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-11-10 23:15:02 +0100
committerwm4 <wm4@nowhere>2013-11-12 23:16:31 +0100
commitbf60281ffb6f47986fa6ef9ee559689be0075050 (patch)
tree28c3472d90683ddc6f374f4d6fa50cee0df30f15 /audio
parentd2e7467eb203d3a34bc1111564c7058b5e9c6b12 (diff)
downloadmpv-bf60281ffb6f47986fa6ef9ee559689be0075050.tar.bz2
mpv-bf60281ffb6f47986fa6ef9ee559689be0075050.tar.xz
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.
Diffstat (limited to 'audio')
-rw-r--r--audio/out/ao_alsa.c2
-rw-r--r--audio/out/ao_coreaudio.c2
-rw-r--r--audio/out/ao_dsound.c2
-rw-r--r--audio/out/ao_lavc.c1
-rw-r--r--audio/out/ao_null.c2
-rw-r--r--audio/out/ao_oss.c2
-rw-r--r--audio/out/ao_pcm.c3
-rw-r--r--audio/out/ao_portaudio.c2
-rw-r--r--audio/out/ao_pulse.c2
-rw-r--r--audio/out/ao_rsound.c2
-rw-r--r--audio/out/ao_sdl.c2
-rw-r--r--audio/out/ao_sndio.c3
-rw-r--r--audio/out/ao_wasapi.c1
13 files changed, 25 insertions, 1 deletions
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))