aboutsummaryrefslogtreecommitdiffstats
path: root/src/pcm_byteswap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pcm_byteswap.c')
-rw-r--r--src/pcm_byteswap.c60
1 files changed, 40 insertions, 20 deletions
diff --git a/src/pcm_byteswap.c b/src/pcm_byteswap.c
index 6577319d4..a1315c475 100644
--- a/src/pcm_byteswap.c
+++ b/src/pcm_byteswap.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2010 The Music Player Daemon Project
+ * Copyright (C) 2003-2011 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -28,43 +28,63 @@
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "pcm"
-static inline uint16_t swab16(uint16_t x)
-{
- return (x << 8) | (x >> 8);
-}
-
const int16_t *pcm_byteswap_16(struct pcm_buffer *buffer,
const int16_t *src, size_t len)
{
- unsigned i;
int16_t *buf = pcm_buffer_get(buffer, len);
assert(buf != NULL);
- for (i = 0; i < len / 2; i++)
- buf[i] = swab16(src[i]);
+ const int16_t *src_end = src + len / sizeof(*src);
+ int16_t *dest = buf;
+ while (src < src_end) {
+ const int16_t x = *src++;
+ *dest++ = GUINT16_SWAP_LE_BE(x);
+ }
return buf;
}
-static inline uint32_t swab32(uint32_t x)
-{
- return (x << 24) |
- ((x & 0xff00) << 8) |
- ((x & 0xff0000) >> 8) |
- (x >> 24);
-}
-
const int32_t *pcm_byteswap_32(struct pcm_buffer *buffer,
const int32_t *src, size_t len)
{
- unsigned i;
int32_t *buf = pcm_buffer_get(buffer, len);
assert(buf != NULL);
- for (i = 0; i < len / 4; i++)
- buf[i] = swab32(src[i]);
+ const int32_t *src_end = src + len / sizeof(*src);
+ int32_t *dest = buf;
+ while (src < src_end) {
+ const int32_t x = *src++;
+ *dest++ = GUINT32_SWAP_LE_BE(x);
+ }
return buf;
}
+
+const void *
+pcm_byteswap(struct pcm_buffer *buffer, enum sample_format format,
+ const void *src, size_t size)
+{
+ switch (format) {
+ case SAMPLE_FORMAT_UNDEFINED:
+ case SAMPLE_FORMAT_S24:
+ case SAMPLE_FORMAT_FLOAT:
+ /* not implemented */
+ return NULL;
+
+ case SAMPLE_FORMAT_S8:
+ return src;
+
+ case SAMPLE_FORMAT_S16:
+ return pcm_byteswap_16(buffer, src, size);
+
+ case SAMPLE_FORMAT_S24_P32:
+ case SAMPLE_FORMAT_S32:
+ return pcm_byteswap_32(buffer, src, size);
+ }
+
+ /* unreachable */
+ assert(false);
+ return NULL;
+}