diff options
Diffstat (limited to 'src/pcm_byteswap.c')
-rw-r--r-- | src/pcm_byteswap.c | 60 |
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; +} |