summaryrefslogtreecommitdiffstats
path: root/byteswap.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2007-05-12 23:38:38 +0000
committerLennart Poettering <lennart@poettering.net>2007-05-12 23:38:38 +0000
commita64e85acf96bc0c55363fe55c9e9116aef2a8584 (patch)
tree69ec57b46bdebe0e7496bf11ea9a54cdf5806904 /byteswap.c
parent2eb6dec8e9f0114bdbad59cf8f11f197f8fdaaf3 (diff)
resampling works
git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@4 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce
Diffstat (limited to 'byteswap.c')
-rw-r--r--byteswap.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/byteswap.c b/byteswap.c
new file mode 100644
index 0000000..0c80b8d
--- /dev/null
+++ b/byteswap.c
@@ -0,0 +1,57 @@
+#include <inttypes.h>
+
+#include "macro.h"
+#include "byteswap.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--) {
+ *dst = (*src >> 8) | (*src << 8);
+ 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--) {
+ *dst = (*src << 24) | ((*src & 0xFF00) << 8) | ((*src >> 8) & 0xFF00) | (*src >> 24);
+ src += sstr / sizeof(uint32_t);
+ dst += dstr / sizeof(uint32_t);
+ }
+}
+
+byteswap_func_t get_byteswap_func(sa_pcm_format_t f) {
+
+ static const 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];
+}
+