diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-10-02 20:26:08 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-10-02 20:26:08 +0000 |
commit | 18301dfca56ba8545549e80f84423d83a46c6b64 (patch) | |
tree | 28854229666a3054a2985cd040d504e860e0623b /src/bswap.c | |
parent | 0ec595d89d9e1c10cd3f8a3d8dd3a1235c6f5fda (diff) |
a lot of minor cleanups
git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@36 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce
Diffstat (limited to 'src/bswap.c')
-rw-r--r-- | src/bswap.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/bswap.c b/src/bswap.c new file mode 100644 index 0000000..501f98a --- /dev/null +++ b/src/bswap.c @@ -0,0 +1,74 @@ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_BYTESWAP_H +#include <byteswap.h> +#endif + +#include <inttypes.h> + +#include "macro.h" +#include "bswap.h" + +static void byteswap16(void *_dst, size_t dstr, const void *_src, size_t sstr, size_t bytes) { + uint16_t *dst = _dst; + const uint16_t *src = _src; + unsigned n = bytes / sizeof(uint16_t); + + for (; n > 0; n--) { + +#ifdef HAVE_BYTESWAP_H + *dst = bswap_16(*src); +#else + *dst = (*src >> 8) | (*src << 8); +#endif + + src += sstr / sizeof(uint16_t); + dst += dstr / sizeof(uint16_t); + } +} + +static void byteswap24(void *_dst, size_t dstr, const void *_src, size_t sstr, size_t bytes) { + uint8_t *dst = _dst; + const uint8_t *src = _src; + unsigned n = bytes / (sizeof(uint8_t)*3); + + for (; n > 0; n--) { + dst[0] = src[2]; + dst[2] = src[0]; + + src += sstr / (sizeof(uint8_t)*3); + dst += dstr / (sizeof(uint8_t)*3); + } +} + +static void byteswap32(void *_dst, size_t dstr, const void *_src, size_t sstr, size_t bytes) { + uint32_t *dst = _dst; + const uint32_t *src = _src; + unsigned n = bytes / sizeof(uint32_t); + + for (; n > 0; n--) { +#ifdef HAVE_BYTESWAP_H + *dst = bswap_32(*src); +#else + *dst = (*src << 24) | ((*src & 0xFF00) << 8) | ((*src >> 8) & 0xFF00) | (*src >> 24); +#endif + src += sstr / sizeof(uint32_t); + dst += dstr / sizeof(uint32_t); + } +} + +sa_byteswap_func_t sa_get_byteswap_func(sa_pcm_format_t f) { + + static const sa_byteswap_func_t funcs[_SA_PCM_FORMAT_MAX] = { + [SA_PCM_FORMAT_S16_RE] = byteswap16, + [SA_PCM_FORMAT_S24_RE] = byteswap24, + [SA_PCM_FORMAT_S32_RE] = byteswap32, + [SA_PCM_FORMAT_FLOAT32_BE] = byteswap32, + }; + + sa_assert(f < _SA_PCM_FORMAT_MAX); + + return funcs[f]; +} |