summaryrefslogtreecommitdiffstats
path: root/src/bswap.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2007-10-02 20:26:08 +0000
committerLennart Poettering <lennart@poettering.net>2007-10-02 20:26:08 +0000
commit18301dfca56ba8545549e80f84423d83a46c6b64 (patch)
tree28854229666a3054a2985cd040d504e860e0623b /src/bswap.c
parent0ec595d89d9e1c10cd3f8a3d8dd3a1235c6f5fda (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.c74
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];
+}