summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/af.rst5
-rw-r--r--audio/decode/ad_lavc.c42
-rw-r--r--audio/filter/af_bs2b.c69
-rw-r--r--audio/filter/af_convert24.c1
-rw-r--r--audio/filter/af_convertsignendian.c50
-rw-r--r--audio/format.c53
-rw-r--r--audio/format.h72
-rw-r--r--audio/out/ao_alsa.c32
-rw-r--r--audio/out/ao_coreaudio_utils.c3
-rw-r--r--audio/out/ao_dsound.c6
-rw-r--r--audio/out/ao_oss.c58
-rw-r--r--audio/out/ao_pcm.c21
-rw-r--r--audio/out/ao_pulse.c9
-rw-r--r--audio/out/ao_rsound.c42
-rw-r--r--audio/out/ao_sdl.c76
-rw-r--r--audio/out/ao_sndio.c42
-rwxr-xr-xaudio/out/ao_wasapi_utils.c5
-rw-r--r--demux/demux_raw.c10
-rw-r--r--demux/demux_tv.c13
-rw-r--r--demux/stheader.h1
-rw-r--r--osdep/endian.h6
-rw-r--r--stream/ai_alsa1x.c4
-rw-r--r--stream/ai_oss.c4
-rw-r--r--stream/ai_sndio.c2
-rw-r--r--stream/tvi_v4l2.c2
25 files changed, 258 insertions, 370 deletions
diff --git a/DOCS/man/af.rst b/DOCS/man/af.rst
index d6361bcede..557ee193de 100644
--- a/DOCS/man/af.rst
+++ b/DOCS/man/af.rst
@@ -265,9 +265,8 @@ Available filters are:
Filter for internal use only. Converts between 24-bit and 32-bit sample
formats.
-``convertsignendian``
- Filter for internal use only. Converts between signed/unsigned formats
- and formats with different endian.
+``convertsign``
+ Filter for internal use only. Converts between signed/unsigned formats.
``volume[=<volumedb>[:...]]``
Implements software volume control. Use this filter with caution since it
diff --git a/audio/decode/ad_lavc.c b/audio/decode/ad_lavc.c
index afff84ef00..443cfdad54 100644
--- a/audio/decode/ad_lavc.c
+++ b/audio/decode/ad_lavc.c
@@ -96,25 +96,30 @@ static const struct pcm_map tag_map[] = {
// For demux_rawaudio.c; needed because ffmpeg doesn't have these sample
// formats natively.
-static const struct pcm_map af_map[] = {
+static const struct pcm_map af_map_le[] = {
{AF_FORMAT_U8, {"pcm_u8"}},
{AF_FORMAT_S8, {"pcm_u8"}},
- {AF_FORMAT_U16_LE, {"pcm_u16le"}},
- {AF_FORMAT_U16_BE, {"pcm_u16be"}},
- {AF_FORMAT_S16_LE, {"pcm_s16le"}},
- {AF_FORMAT_S16_BE, {"pcm_s16be"}},
- {AF_FORMAT_U24_LE, {"pcm_u24le"}},
- {AF_FORMAT_U24_BE, {"pcm_u24be"}},
- {AF_FORMAT_S24_LE, {"pcm_s24le"}},
- {AF_FORMAT_S24_BE, {"pcm_s24be"}},
- {AF_FORMAT_U32_LE, {"pcm_u32le"}},
- {AF_FORMAT_U32_BE, {"pcm_u32be"}},
- {AF_FORMAT_S32_LE, {"pcm_s32le"}},
- {AF_FORMAT_S32_BE, {"pcm_s32be"}},
- {AF_FORMAT_FLOAT_LE, {"pcm_f32le"}},
- {AF_FORMAT_FLOAT_BE, {"pcm_f32be"}},
- {AF_FORMAT_DOUBLE_LE, {"pcm_f64le"}},
- {AF_FORMAT_DOUBLE_BE, {"pcm_f64be"}},
+ {AF_FORMAT_U16, {"pcm_u16le"}},
+ {AF_FORMAT_S16, {"pcm_s16le"}},
+ {AF_FORMAT_U24, {"pcm_u24le"}},
+ {AF_FORMAT_S24, {"pcm_s24le"}},
+ {AF_FORMAT_U32, {"pcm_u32le"}},
+ {AF_FORMAT_S32, {"pcm_s32le"}},
+ {AF_FORMAT_FLOAT, {"pcm_f32le"}},
+ {AF_FORMAT_DOUBLE, {"pcm_f64le"}},
+ {-1},
+};
+static const struct pcm_map af_map_be[] = {
+ {AF_FORMAT_U8, {"pcm_u8"}},
+ {AF_FORMAT_S8, {"pcm_u8"}},
+ {AF_FORMAT_U16, {"pcm_u16be"}},
+ {AF_FORMAT_S16, {"pcm_s16be"}},
+ {AF_FORMAT_U24, {"pcm_u24be"}},
+ {AF_FORMAT_S24, {"pcm_s24be"}},
+ {AF_FORMAT_U32, {"pcm_u32be"}},
+ {AF_FORMAT_S32, {"pcm_s32be"}},
+ {AF_FORMAT_FLOAT, {"pcm_f32be"}},
+ {AF_FORMAT_DOUBLE, {"pcm_f64be"}},
{-1},
};
@@ -198,7 +203,8 @@ static int init(struct dec_audio *da, const char *decoder)
decoder = find_pcm_decoder(tag_map, sh->format,
sh_audio->wf->wBitsPerSample);
} else if (sh_audio->wf && strcmp(decoder, "mp-pcm") == 0) {
- decoder = find_pcm_decoder(af_map, sh->format, 0);
+ const struct pcm_map *map = sh_audio->big_endian ? af_map_be : af_map_le;
+ decoder = find_pcm_decoder(map, sh->format, 0);
ctx->force_channel_map = true;
}
diff --git a/audio/filter/af_bs2b.c b/audio/filter/af_bs2b.c
index 0a2bd8e552..29d646a9a9 100644
--- a/audio/filter/af_bs2b.c
+++ b/audio/filter/af_bs2b.c
@@ -48,20 +48,12 @@ static int filter_##name(struct af_instance *af, struct mp_audio *data, int f) \
}
FILTER(f, float)
-FILTER(fbe, float)
-FILTER(fle, float)
-FILTER(s32be, int32_t)
-FILTER(u32be, uint32_t)
-FILTER(s32le, int32_t)
-FILTER(u32le, uint32_t)
-FILTER(s24be, bs2b_int24_t)
-FILTER(u24be, bs2b_uint24_t)
-FILTER(s24le, bs2b_int24_t)
-FILTER(u24le, bs2b_uint24_t)
-FILTER(s16be, int16_t)
-FILTER(u16be, uint16_t)
-FILTER(s16le, int16_t)
-FILTER(u16le, uint16_t)
+FILTER(s32, int32_t)
+FILTER(u32, uint32_t)
+FILTER(s24, bs2b_int24_t)
+FILTER(u24, bs2b_uint24_t)
+FILTER(s16, int16_t)
+FILTER(u16, uint16_t)
FILTER(s8, int8_t)
FILTER(u8, uint8_t)
@@ -85,47 +77,26 @@ static int control(struct af_instance *af, int cmd, void *arg)
/* check for formats supported by libbs2b
and assign corresponding handlers */
switch (format) {
- case AF_FORMAT_FLOAT_BE:
- af->filter = filter_fbe;
- break;
- case AF_FORMAT_FLOAT_LE:
- af->filter = filter_fle;
- break;
- case AF_FORMAT_S32_BE:
- af->filter = filter_s32be;
- break;
- case AF_FORMAT_U32_BE:
- af->filter = filter_u32be;
- break;
- case AF_FORMAT_S32_LE:
- af->filter = filter_s32le;
- break;
- case AF_FORMAT_U32_LE:
- af->filter = filter_u32le;
- break;
- case AF_FORMAT_S24_BE:
- af->filter = filter_s24be;
- break;
- case AF_FORMAT_U24_BE:
- af->filter = filter_u24be;
+ case AF_FORMAT_FLOAT:
+ af->filter = filter_f;
break;
- case AF_FORMAT_S24_LE:
- af->filter = filter_s24le;
+ case AF_FORMAT_S32:
+ af->filter = filter_s32;
break;
- case AF_FORMAT_U24_LE:
- af->filter = filter_u24le;
+ case AF_FORMAT_U32:
+ af->filter = filter_u32;
break;
- case AF_FORMAT_S16_BE:
- af->filter = filter_s16be;
+ case AF_FORMAT_S24:
+ af->filter = filter_s24;
break;
- case AF_FORMAT_U16_BE:
- af->filter = filter_u16be;
+ case AF_FORMAT_U24:
+ af->filter = filter_u24;
break;
- case AF_FORMAT_S16_LE:
- af->filter = filter_s16le;
+ case AF_FORMAT_S16:
+ af->filter = filter_s16;
break;
- case AF_FORMAT_U16_LE:
- af->filter = filter_u16le;
+ case AF_FORMAT_U16:
+ af->filter = filter_u16;
break;
case AF_FORMAT_S8:
af->filter = filter_s8;
diff --git a/audio/filter/af_convert24.c b/audio/filter/af_convert24.c
index 38799bd8fc..e59317fe1b 100644
--- a/audio/filter/af_convert24.c
+++ b/audio/filter/af_convert24.c
@@ -20,6 +20,7 @@
#include "audio/format.h"
#include "af.h"
+#include "osdep/endian.h"
static bool test_conversion(int src_format, int dst_format)
{
diff --git a/audio/filter/af_convertsignendian.c b/audio/filter/af_convertsignendian.c
index a0b47b38a3..7e7e436352 100644
--- a/audio/filter/af_convertsignendian.c
+++ b/audio/filter/af_convertsignendian.c
@@ -20,21 +20,16 @@
#include "af.h"
#include "audio/format.h"
-#include "osdep/mpbswap.h"
+#include "osdep/endian.h"
static bool test_conversion(int src_format, int dst_format)
{
if ((src_format & AF_FORMAT_PLANAR) ||
(dst_format & AF_FORMAT_PLANAR))
return false;
- int src_noend = src_format & ~AF_FORMAT_END_MASK;
- int dst_noend = dst_format & ~AF_FORMAT_END_MASK;
- // We can swap endian for all formats, but sign only for integer formats.
- if (src_noend == dst_noend)
- return true;
- if (((src_noend & ~AF_FORMAT_SIGN_MASK) ==
- (dst_noend & ~AF_FORMAT_SIGN_MASK)) &&
- ((src_noend & AF_FORMAT_POINT_MASK) == AF_FORMAT_I))
+ if (((src_format & ~AF_FORMAT_SIGN_MASK) ==
+ (dst_format & ~AF_FORMAT_SIGN_MASK)) &&
+ ((src_format & AF_FORMAT_POINT_MASK) == AF_FORMAT_I))
return true;
return false;
}
@@ -63,34 +58,11 @@ static int control(struct af_instance *af, int cmd, void *arg)
return AF_UNKNOWN;
}
-static void endian(void *data, int len, int bps)
-{
- switch (bps) {
- case 2:
- for (int i = 0; i < len; i++) {
- ((uint16_t*)data)[i] = bswap_16(((uint16_t *)data)[i]);
- }
- break;
- case 3:
- for(int i = 0; i < len; i++) {
- uint8_t s = ((uint8_t *)data)[3 * i];
- ((uint8_t *)data)[3 * i] = ((uint8_t *)data)[3 * i + 2];
- ((uint8_t *)data)[3 * i + 2] = s;
- }
- break;
- case 4:
- for(int i = 0; i < len; i++) {
- ((uint32_t*)data)[i] = bswap_32(((uint32_t *)data)[i]);
- }
- break;
- }
-}
-
-static void si2us(void *data, int len, int bps, bool le)
+static void si2us(void *data, int len, int bps)
{
ptrdiff_t i = -(len * bps);
uint8_t *p = &((uint8_t *)data)[len * bps];
- if (le && bps > 1)
+ if (BYTE_ORDER == LITTLE_ENDIAN && bps > 1)
p += bps - 1;
if (len <= 0)
return;
@@ -105,12 +77,8 @@ static int filter(struct af_instance *af, struct mp_audio *data, int flags)
int outfmt = af->data->format;
size_t len = data->samples * data->nch;
- if ((infmt & AF_FORMAT_END_MASK) != (outfmt & AF_FORMAT_END_MASK))
- endian(data->planes[0], len, data->bps);
-
if ((infmt & AF_FORMAT_SIGN_MASK) != (outfmt & AF_FORMAT_SIGN_MASK))
- si2us(data->planes[0], len, data->bps,
- (outfmt & AF_FORMAT_END_MASK) == AF_FORMAT_LE);
+ si2us(data->planes[0], len, data->bps);
mp_audio_set_format(data, outfmt);
return 0;
@@ -124,8 +92,8 @@ static int af_open(struct af_instance *af)
}
const struct af_info af_info_convertsignendian = {
- .info = "Convert between sample format sign/endian",
- .name = "convertsignendian",
+ .info = "Convert between sample format sign",
+ .name = "convertsign",
.open = af_open,
.test_conversion = test_conversion,
};
diff --git a/audio/format.c b/audio/format.c
index b10e574a9e..60a86ea5ae 100644
--- a/audio/format.c
+++ b/audio/format.c
@@ -109,35 +109,27 @@ bool af_fmt_is_planar(int format)
return !!(format & AF_FORMAT_PLANAR);
}
-#define FMT(string, id) \
- {string, id},
-
-#define FMT_ENDIAN(string, id) \
- {string, id}, \
- {string "le", MP_CONCAT(id, _LE)}, \
- {string "be", MP_CONCAT(id, _BE)}, \
-
const struct af_fmt_entry af_fmtstr_table[] = {
- FMT("mpeg2", AF_FORMAT_MPEG2)
- FMT("ac3", AF_FORMAT_AC3)
- FMT("iec61937", AF_FORMAT_IEC61937)
-
- FMT("u8", AF_FORMAT_U8)
- FMT("s8", AF_FORMAT_S8)
- FMT_ENDIAN("u16", AF_FORMAT_U16)
- FMT_ENDIAN("s16", AF_FORMAT_S16)
- FMT_ENDIAN("u24", AF_FORMAT_U24)
- FMT_ENDIAN("s24", AF_FORMAT_S24)
- FMT_ENDIAN("u32", AF_FORMAT_U32)
- FMT_ENDIAN("s32", AF_FORMAT_S32)
- FMT_ENDIAN("float", AF_FORMAT_FLOAT)
- FMT_ENDIAN("double", AF_FORMAT_DOUBLE)
-
- FMT("u8p", AF_FORMAT_U8P)
- FMT("s16p", AF_FORMAT_S16P)
- FMT("s32p", AF_FORMAT_S32P)
- FMT("floatp", AF_FORMAT_FLOATP)
- FMT("doublep", AF_FORMAT_DOUBLEP)
+ {"mpeg2", AF_FORMAT_MPEG2},
+ {"ac3", AF_FORMAT_AC3},
+ {"iec61937", AF_FORMAT_IEC61937},
+
+ {"u8", AF_FORMAT_U8},
+ {"s8", AF_FORMAT_S8},
+ {"u16", AF_FORMAT_U16},
+ {"s16", AF_FORMAT_S16},
+ {"u24", AF_FORMAT_U24},
+ {"s24", AF_FORMAT_S24},
+ {"u32", AF_FORMAT_U32},
+ {"s32", AF_FORMAT_S32},
+ {"float", AF_FORMAT_FLOAT},
+ {"double", AF_FORMAT_DOUBLE},
+
+ {"u8p", AF_FORMAT_U8P},
+ {"s16p", AF_FORMAT_S16P},
+ {"s32p", AF_FORMAT_S32P},
+ {"floatp", AF_FORMAT_FLOATP},
+ {"doublep", AF_FORMAT_DOUBLEP},
{0}
};
@@ -199,17 +191,12 @@ int af_format_conversion_score(int dst_format, int src_format)
return INT_MIN;
if (dst_format == src_format)
return 1024;
- // Just endian swapping (separate because it works for special formats)
- if ((dst_format & ~AF_FORMAT_END_MASK) == (src_format & ~AF_FORMAT_END_MASK))
- return 1024 - 2;
// Can't be normally converted
if (AF_FORMAT_IS_SPECIAL(dst_format) || AF_FORMAT_IS_SPECIAL(src_format))
return INT_MIN;
int score = 1024;
if (FMT_DIFF(AF_FORMAT_INTERLEAVING_MASK, dst_format, src_format))
score -= 1; // has to (de-)planarize
- if (FMT_DIFF(AF_FORMAT_END_MASK, dst_format, src_format))
- score -= 2; // has to swap endian
if (FMT_DIFF(AF_FORMAT_SIGN_MASK, dst_format, src_format))
score -= 4; // has to swap sign
if (FMT_DIFF(AF_FORMAT_POINT_MASK, dst_format, src_format)) {
diff --git a/audio/format.h b/audio/format.h
index a14d8fe367..3662d817f1 100644
--- a/audio/format.h
+++ b/audio/format.h
@@ -25,22 +25,8 @@
#include <stdbool.h>
-#include "osdep/endian.h"
#include "misc/bstr.h"
-#if BYTE_ORDER == BIG_ENDIAN
-#define AF_SELECT_LE_BE(LE, BE) BE
-#else
-#define AF_SELECT_LE_BE(LE, BE) LE
-#endif
-
-// Endianness
-#define AF_FORMAT_BE (0<<0) // Big Endian
-#define AF_FORMAT_LE (1<<0) // Little Endian
-#define AF_FORMAT_END_MASK (1<<0)
-
-#define AF_FORMAT_NE AF_SELECT_LE_BE(AF_FORMAT_LE, AF_FORMAT_BE)
-
// Signed/unsigned
#define AF_FORMAT_SI (0<<1) // Signed
#define AF_FORMAT_US (1<<1) // Unsigned
@@ -80,48 +66,28 @@
enum af_format {
AF_FORMAT_UNKNOWN = 0,
- AF_FORMAT_U8 = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_8BIT|AF_FORMAT_NE),
- AF_FORMAT_S8 = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_8BIT|AF_FORMAT_NE),
- AF_FORMAT_U16_LE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_16BIT|AF_FORMAT_LE),
- AF_FORMAT_U16_BE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_16BIT|AF_FORMAT_BE),
- AF_FORMAT_S16_LE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_16BIT|AF_FORMAT_LE),
- AF_FORMAT_S16_BE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_16BIT|AF_FORMAT_BE),
- AF_FORMAT_U24_LE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_24BIT|AF_FORMAT_LE),
- AF_FORMAT_U24_BE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_24BIT|AF_FORMAT_BE),
- AF_FORMAT_S24_LE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_24BIT|AF_FORMAT_LE),
- AF_FORMAT_S24_BE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_24BIT|AF_FORMAT_BE),
- AF_FORMAT_U32_LE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_32BIT|AF_FORMAT_LE),
- AF_FORMAT_U32_BE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_32BIT|AF_FORMAT_BE),
- AF_FORMAT_S32_LE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_32BIT|AF_FORMAT_LE),
- AF_FORMAT_S32_BE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_32BIT|AF_FORMAT_BE),
-
- AF_FORMAT_FLOAT_LE = (AF_FORMAT_F|AF_FORMAT_32BIT|AF_FORMAT_LE),
- AF_FORMAT_FLOAT_BE = (AF_FORMAT_F|AF_FORMAT_32BIT|AF_FORMAT_BE),
-
- AF_FORMAT_DOUBLE_LE = (AF_FORMAT_F|AF_FORMAT_64BIT|AF_FORMAT_LE),
- AF_FORMAT_DOUBLE_BE = (AF_FORMAT_F|AF_FORMAT_64BIT|AF_FORMAT_BE),
-
- AF_FORMAT_AC3 = (AF_FORMAT_S_AC3|AF_FORMAT_16BIT|AF_FORMAT_LE),
- AF_FORMAT_IEC61937 = (AF_FORMAT_S_IEC61937|AF_FORMAT_16BIT|AF_FORMAT_LE),
+ AF_FORMAT_U8 = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_8BIT),
+ AF_FORMAT_S8 = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_8BIT),
+ AF_FORMAT_U16 = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_16BIT),
+ AF_FORMAT_S16 = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_16BIT),
+ AF_FORMAT_U24 = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_24BIT),
+ AF_FORMAT_S24 = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_24BIT),
+ AF_FORMAT_U32 = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_32BIT),
+ AF_FORMAT_S32 = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_32BIT),
+
+ AF_FORMAT_FLOAT = (AF_FORMAT_F|AF_FORMAT_32BIT),
+ AF_FORMAT_DOUBLE = (AF_FORMAT_F|AF_FORMAT_64BIT),
+
+ AF_FORMAT_AC3 = (AF_FORMAT_S_AC3|AF_FORMAT_16BIT),
+ AF_FORMAT_IEC61937 = (AF_FORMAT_S_IEC61937|AF_FORMAT_16BIT),
AF_FORMAT_MPEG2 = (AF_FORMAT_S_MPEG2),
// Planar variants
- AF_FORMAT_U8P = (AF_INTP|AF_FORMAT_US|AF_FORMAT_8BIT|AF_FORMAT_NE),
- AF_FORMAT_S16P = (AF_INTP|AF_FORMAT_SI|AF_FORMAT_16BIT|AF_FORMAT_NE),
- AF_FORMAT_S32P = (AF_INTP|AF_FORMAT_SI|AF_FORMAT_32BIT|AF_FORMAT_NE),
- AF_FORMAT_FLOATP = (AF_FLTP|AF_FORMAT_32BIT|AF_FORMAT_NE),
- AF_FORMAT_DOUBLEP = (AF_FLTP|AF_FORMAT_64BIT|AF_FORMAT_NE),
-
- // Native endian variants
- AF_FORMAT_U16 = AF_SELECT_LE_BE(AF_FORMAT_U16_LE, AF_FORMAT_U16_BE),
- AF_FORMAT_S16 = AF_SELECT_LE_BE(AF_FORMAT_S16_LE, AF_FORMAT_S16_BE),
- AF_FORMAT_U24 = AF_SELECT_LE_BE(AF_FORMAT_U24_LE, AF_FORMAT_U24_BE),
- AF_FORMAT_S24 = AF_SELECT_LE_BE(AF_FORMAT_S24_LE, AF_FORMAT_S24_BE),
- AF_FORMAT_U32 = AF_SELECT_LE_BE(AF_FORMAT_U32_LE, AF_FORMAT_U32_BE),
- AF_FORMAT_S32 = AF_SELECT_LE_BE(AF_FORMAT_S32_LE, AF_FORMAT_S32_BE),
-
- AF_FORMAT_FLOAT = AF_SELECT_LE_BE(AF_FORMAT_FLOAT_LE, AF_FORMAT_FLOAT_BE),
- AF_FORMAT_DOUBLE = AF_SELECT_LE_BE(AF_FORMAT_DOUBLE_LE, AF_FORMAT_DOUBLE_BE),
+ AF_FORMAT_U8P = (AF_INTP|AF_FORMAT_US|AF_FORMAT_8BIT),
+ AF_FORMAT_S16P = (AF_INTP|AF_FORMAT_SI|AF_FORMAT_16BIT),
+ AF_FORMAT_S32P = (AF_INTP|AF_FORMAT_SI|AF_FORMAT_32BIT),
+ AF_FORMAT_FLOATP = (AF_FLTP|AF_FORMAT_32BIT),
+ AF_FORMAT_DOUBLEP = (AF_FLTP|AF_FORMAT_64BIT),
};
#define AF_FORMAT_IS_AC3(fmt) \
diff --git a/audio/out/ao_alsa.c b/audio/out/ao_alsa.c
index 60b8338f9d..c344f6f20e 100644
--- a/audio/out/ao_alsa.c
+++ b/audio/out/ao_alsa.c
@@ -38,6 +38,7 @@
#include "options/options.h"
#include "options/m_option.h"
#include "common/msg.h"
+#include "osdep/endian.h"
#define ALSA_PCM_NEW_HW_PARAMS_API
#define ALSA_PCM_NEW_SW_PARAMS_API
@@ -208,22 +209,17 @@ alsa_error:
static const int mp_to_alsa_format[][2] = {
{AF_FORMAT_S8, SND_PCM_FORMAT_S8},
{AF_FORMAT_U8, SND_PCM_FORMAT_U8},
- {AF_FORMAT_U16_LE, SND_PCM_FORMAT_U16_LE},
- {AF_FORMAT_U16_BE, SND_PCM_FORMAT_U16_BE},
- {AF_FORMAT_S16_LE, SND_PCM_FORMAT_S16_LE},
- {AF_FORMAT_S16_BE, SND_PCM_FORMAT_S16_BE},
- {AF_FORMAT_U32_LE, SND_PCM_FORMAT_U32_LE},
- {AF_FORMAT_U32_BE, SND_PCM_FORMAT_U32_BE},
- {AF_FORMAT_S32_LE, SND_PCM_FORMAT_S32_LE},
- {AF_FORMAT_S32_BE, SND_PCM_FORMAT_S32_BE},
- {AF_FORMAT_U24_LE, SND_PCM_FORMAT_U24_3LE},
- {AF_FORMAT_U24_BE, SND_PCM_FORMAT_U24_3BE},
- {AF_FORMAT_S24_LE, SND_PCM_FORMAT_S24_3LE},
- {AF_FORMAT_S24_BE, SND_PCM_FORMAT_S24_3BE},
- {AF_FORMAT_FLOAT_LE, SND_PCM_FORMAT_FLOAT_LE},
- {AF_FORMAT_FLOAT_BE, SND_PCM_FORMAT_FLOAT_BE},
- {AF_FORMAT_AC3, SND_PCM_FORMAT_S16_LE},
- {AF_FORMAT_IEC61937, SND_PCM_FORMAT_S16_LE},
+ {AF_FORMAT_U16, SND_PCM_FORMAT_U16},
+ {AF_FORMAT_S16, SND_PCM_FORMAT_S16},
+ {AF_FORMAT_U32, SND_PCM_FORMAT_U32},
+ {AF_FORMAT_S32, SND_PCM_FORMAT_S32},
+ {AF_FORMAT_U24,
+ MP_SELECT_LE_BE(SND_PCM_FORMAT_U24_3LE, SND_PCM_FORMAT_U24_3BE)},
+ {AF_FORMAT_S24,
+ MP_SELECT_LE_BE(SND_PCM_FORMAT_S24_3LE, SND_PCM_FORMAT_S24_3BE)},
+ {AF_FORMAT_FLOAT, SND_PCM_FORMAT_FLOAT},
+ {AF_FORMAT_AC3, SND_PCM_FORMAT_S16},
+ {AF_FORMAT_IEC61937, SND_PCM_FORMAT_S16},
{AF_FORMAT_MPEG2, SND_PCM_FORMAT_MPEG},
{AF_FORMAT_UNKNOWN, SND_PCM_FORMAT_UNKNOWN},
};
@@ -417,13 +413,13 @@ static int init(struct ao *ao)
if (err < 0) {
MP_INFO(ao, "Format %s is not supported by hardware, trying default.\n",
af_fmt_to_str(ao->format));
- p->alsa_fmt = SND_PCM_FORMAT_S16_LE;
+ p->alsa_fmt = SND_PCM_FORMAT_S16;
if (AF_FORMAT_IS_AC3(ao->format))
ao->format = AF_FORMAT_AC3;
else if (AF_FORMAT_IS_IEC61937(ao->format))
ao->format = AF_FORMAT_IEC61937;
else
- ao->format = AF_FORMAT_S16_LE;
+ ao->format = AF_FORMAT_S16;
}
err = snd_pcm_hw_params_set_format(p->alsa, alsa_hwparams, p->alsa_fmt);
diff --git a/audio/out/ao_coreaudio_utils.c b/audio/out/ao_coreaudio_utils.c
index da06656e9d..b39323ce72 100644
--- a/audio/out/ao_coreaudio_utils.c
+++ b/audio/out/ao_coreaudio_utils.c
@@ -25,6 +25,7 @@
#include "audio/out/ao_coreaudio_utils.h"
#include "audio/out/ao_coreaudio_properties.h"
#include "osdep/timer.h"
+#include "osdep/endian.h"
#include "audio/format.h"
void ca_print_device_list(struct ao *ao)
@@ -142,7 +143,7 @@ void ca_fill_asbd(struct ao *ao, AudioStreamBasicDescription *asbd)
if ((ao->format & AF_FORMAT_SIGN_MASK) == AF_FORMAT_SI)
asbd->mFormatFlags |= kAudioFormatFlagIsSignedInteger;
- if ((ao->format & AF_FORMAT_END_MASK) == AF_FORMAT_BE)
+ if (BYTE_ORDER == BIG_ENDIAN)
asbd->mFormatFlags |= kAudioFormatFlagIsBigEndian;
asbd->mFramesPerPacket = 1;
diff --git a/audio/out/ao_dsound.c b/audio/out/ao_dsound.c
index da1742e077..78b39b17b9 100644
--- a/audio/out/ao_dsound.c
+++ b/audio/out/ao_dsound.c
@@ -392,14 +392,14 @@ static int init(struct ao *ao)
}
switch (format) {
case AF_FORMAT_AC3:
- case AF_FORMAT_S24_LE:
- case AF_FORMAT_S16_LE:
+ case AF_FORMAT_S24:
+ case AF_FORMAT_S16:
case AF_FORMAT_U8:
break;
default:
MP_VERBOSE(ao, "format %s not supported defaulting to Signed 16-bit Little-Endian\n",
af_fmt_to_str(format));
- format = AF_FORMAT_S16_LE;
+ format = AF_FORMAT_S16;
}
//set our audio parameters
ao->samplerate = rate;
diff --git a/audio/out/ao_oss.c b/audio/out/ao_oss.c
index b78f244a7b..de71017432 100644
--- a/audio/out/ao_oss.c
+++ b/audio/out/ao_oss.c
@@ -40,6 +40,7 @@
#include "options/options.h"
#include "common/msg.h"
#include "osdep/timer.h"
+#include "osdep/endian.h"
#if HAVE_SYS_SOUNDCARD_H
#include <sys/soundcard.h>
@@ -89,39 +90,46 @@ static const struct mp_chmap oss_layouts[MP_NUM_CHANNELS + 1] = {
MP_CHMAP8(FL, FR, BL, BR, FC, LFE, SL, SR), // 7.1
};
-static const int format_table[][2] = {
- {AFMT_U8, AF_FORMAT_U8},
- {AFMT_S8, AF_FORMAT_S8},
- {AFMT_U16_LE, AF_FORMAT_U16_LE},
- {AFMT_U16_BE, AF_FORMAT_U16_BE},
- {AFMT_S16_LE, AF_FORMAT_S16_LE},
- {AFMT_S16_BE, AF_FORMAT_S16_BE},
-#ifdef AFMT_S24_PACKED
- {AFMT_S24_PACKED, AF_FORMAT_S24_LE},
+#if !defined(AFMT_S16_NE) && defined(AFMT_S16_LE) && defined(AFMT_S16_BE)
+#define AFMT_S16_NE MP_SELECT_LE_BE(AFMT_S16_LE, AFMT_S16_BE)
#endif
-#ifdef AFMT_U24_LE
- {AFMT_U24_LE, AF_FORMAT_U24_LE},
+
+#if !defined(AFMT_U16_NE) && defined(AFMT_U16_LE) && defined(AFMT_U16_BE)
+#define AFMT_U16_NE MP_SELECT_LE_BE(AFMT_U16_LE, AFMT_U16_BE)
#endif
-#ifdef AFMT_U24_BE
- {AFMT_U24_BE, AF_FORMAT_U24_BE},
+
+#if !defined(AFMT_U24_NE) && defined(AFMT_U24_LE) && defined(AFMT_U24_BE)
+#define AFMT_U24_NE MP_SELECT_LE_BE(AFMT_U24_LE, AFMT_U24_BE)
#endif
-#ifdef AFMT_S24_LE
- {AFMT_S24_LE, AF_FORMAT_S24_LE},
+
+#if !defined(AFMT_S24_NE) && defined(AFMT_S24_LE) && defined(AFMT_S24_BE)
+#define AFMT_S24_NE MP_SELECT_LE_BE(AFMT_S24_LE, AFMT_S24_BE)
#endif
-#ifdef AFMT_S24_BE
- {AFMT_S24_BE, AF_FORMAT_S24_BE},
+
+#if !defined(AFMT_U32_NE) && defined(AFMT_U32_LE) && defined(AFMT_U32_BE)
+#define AFMT_U32MP_SELECT_LE_BE(AFMT_U32_LE, AFMT_U32_BE)
#endif
-#ifdef AFMT_U32_LE
- {AFMT_U32_LE, AF_FORMAT_U32_LE},
+
+#if !defined(AFMT_S32_NE) && defined(AFMT_S32_LE) && defined(AFMT_S32_BE)
+#define AFMT_S32MP_SELECT_LE_BE(AFMT_S32_LE, AFMT_S32_BE)
+#endif
+
+static const int format_table[][2] = {
+ {AFMT_U8, AF_FORMAT_U8},
+ {AFMT_S8, AF_FORMAT_S8},
+ {AFMT_U16_NE, AF_FORMAT_U16},
+ {AFMT_S16_NE, AF_FORMAT_S16},
+#ifdef AFMT_U24_NE
+ {AFMT_U24_NE, AF_FORMAT_U24},
#endif
-#ifdef AFMT_U32_BE
- {AFMT_U32_BE, AF_FORMAT_U32_BE},
+#ifdef AFMT_S24_NE
+ {AFMT_S24_NE, AF_FORMAT_S24},
#endif
-#ifdef AFMT_S32_LE
- {AFMT_S32_LE, AF_FORMAT_S32_LE},
+#ifdef AFMT_U32_NE
+ {AFMT_U32_NE, AF_FORMAT_U32},
#endif
-#ifdef AFMT_S32_BE
- {AFMT_S32_BE, AF_FORMAT_S32_BE},
+#ifdef AFMT_S32_NE
+ {AFMT_S32_NE, AF_FORMAT_S32},
#endif
#ifdef AFMT_FLOAT
{AFMT_FLOAT, AF_FORMAT_FLOAT},
diff --git a/audio/out/ao_pcm.c b/audio/out/ao_pcm.c
index 3c1f46409a..eb089c6c42 100644
--- a/audio/out/ao_pcm.c
+++ b/audio/out/ao_pcm.c
@@ -35,6 +35,7 @@
#include "ao.h"
#include "internal.h"
#include "common/msg.h"
+#include "osdep/endian.h"
#ifdef __MINGW32__
// for GetFileType to detect pipes
@@ -72,8 +73,7 @@ static void fput32le(uint32_t val, FILE *fp)
static void write_wave_header(struct ao *ao, FILE *fp, uint64_t data_length)
{
bool use_waveex = true;
- uint16_t fmt = ao->format == AF_FORMAT_FLOAT_LE ?
- WAV_ID_FLOAT_PCM : WAV_ID_PCM;
+ uint16_t fmt = ao->format == AF_FORMAT_FLOAT ? WAV_ID_FLOAT_PCM : WAV_ID_PCM;
uint32_t fmt_chunk_size = use_waveex ? 40 : 16;
int bits = af_fmt2bits(ao->format);
@@ -124,16 +124,23 @@ static int init(struct ao *ao)
if (priv->waveheader) {
// WAV files must have one of the following formats
+ // And they don't work in big endian; fixing it would be simple, but
+ // nobody cares.
+ if (BYTE_ORDER == BIG_ENDIAN) {
+ MP_FATAL(ao, "Not supported on big endian.\n");
+ return -1;
+ }
+
switch (ao->format) {
case AF_FORMAT_U8:
- case AF_FORMAT_S16_LE:
- case AF_FORMAT_S24_LE:
- case AF_FORMAT_S32_LE:
- case AF_FORMAT_FLOAT_LE:
+ case AF_FORMAT_S16:
+ case AF_FORMAT_S24:
+ case AF_FORMAT_S32:
+ case AF_FORMAT_FLOAT:
case AF_FORMAT_AC3:
break;
default:
- ao->format = AF_FORMAT_S16_LE;
+ ao->format = AF_FORMAT_S16;
break;
}
}
diff --git a/audio/out/ao_pulse.c b/audio/out/ao_pulse.c
index 790ecb23dc..fa8a6a46be 100644
--- a/audio/out/ao_pulse.c
+++ b/audio/out/ao_pulse.c
@@ -169,12 +169,9 @@ static const struct format_map {
int mp_format;
pa_sample_format_t pa_format;
} format_maps[] = {
- {AF_FORMAT_S16_LE, PA_SAMPLE_S16LE},
- {AF_FORMAT_S16_BE, PA_SAMPLE_S16BE},
- {AF_FORMAT_S32_LE, PA_SAMPLE_S32LE},
- {AF_FORMAT_S32_BE, PA_SAMPLE_S32BE},
- {AF_FORMAT_FLOAT_LE, PA_SAMPLE_FLOAT32LE},
- {AF_FORMAT_FLOAT_BE, PA_SAMPLE_FLOAT32BE},
+ {AF_FORMAT_S16, PA_SAMPLE_S16NE},
+ {AF_FORMAT_S32, PA_SAMPLE_S32NE},
+ {AF_FORMAT_FLOAT, PA_SAMPLE_FLOAT32NE},
{AF_FORMAT_U8, PA_SAMPLE_U8},
{AF_FORMAT_UNKNOWN, 0}
};
diff --git a/audio/out/ao_rsound.c b/audio/out/ao_rsound.c
index e41a89ae37..fe187144a6 100644
--- a/audio/out/ao_rsound.c
+++ b/audio/out/ao_rsound.c
@@ -52,40 +52,26 @@ static int set_format(struct ao *ao)
case AF_FORMAT_S8:
rsd_format = RSD_S8;
break;
- case AF_FORMAT_S16_LE:
- rsd_format = RSD_S16_LE;
+ case AF_FORMAT_S16:
+ rsd_format = RSD_S16_NE;
break;
- case AF_FORMAT_S16_BE:
- rsd_format = RSD_S16_BE;
+ case AF_FORMAT_U16:
+ rsd_format = RSD_U16_NE;
break;
- case AF_FORMAT_U16_LE:
- rsd_format = RSD_U16_LE;
+ case AF_FORMAT_S24:
+ case AF_FORMAT_U24:
+ rsd_format = RSD_S32_NE;
+ ao->format = AF_FORMAT_S32;
break;
- case AF_FORMAT_U16_BE:
- rsd_format = RSD_U16_BE;
+ case AF_FORMAT_S32:
+ rsd_format = RSD_S32_NE;
break;
- case AF_FORMAT_S24_LE:
- case AF_FORMAT_S24_BE:
- case AF_FORMAT_U24_LE:
- case AF_FORMAT_U24_BE:
- rsd_format = RSD_S32_LE;
- ao->format = AF_FORMAT_S32_LE;
- break;
- case AF_FORMAT_S32_LE:
- rsd_format = RSD_S32_LE;
- break;
- case AF_FORMAT_S32_BE:
- rsd_format = RSD_S32_BE;
- break;
- case AF_FORMAT_U32_LE:
- rsd_format = RSD_U32_LE;
- break;
- case AF_FORMAT_U32_BE:
- rsd_format = RSD_U32_BE;
+ case AF_FORMAT_U32:
+ rsd_format = RSD_U32_NE;
break;
default:
- rsd_format = RSD_S16_LE;
- ao->format = AF_FORMAT_S16_LE;
+ rsd_format = RSD_S16_NE;
+ ao->format = AF_FORMAT_S16;
}
return rsd_format;
diff --git a/audio/out/ao_sdl.c b/audio/out/ao_sdl.c
index 9af5db4021..d2362a723e 100644
--- a/