diff options
Diffstat (limited to 'src/pcm_format.c')
-rw-r--r-- | src/pcm_format.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/pcm_format.c b/src/pcm_format.c index 205966a6e..9ef1a9504 100644 --- a/src/pcm_format.c +++ b/src/pcm_format.c @@ -133,3 +133,78 @@ pcm_convert_to_24(struct pcm_buffer *buffer, g_warning("only 8 or 24 bits are supported for conversion!\n"); return NULL; } + +static void +pcm_convert_8_to_32(int32_t *out, const int8_t *in, + unsigned num_samples) +{ + while (num_samples > 0) { + *out++ = *in++ << 24; + --num_samples; + } +} + +static void +pcm_convert_16_to_32(int32_t *out, const int16_t *in, + unsigned num_samples) +{ + while (num_samples > 0) { + *out++ = *in++ << 16; + --num_samples; + } +} + +static void +pcm_convert_24_to_32(int32_t *out, const int32_t *in, + unsigned num_samples) +{ + while (num_samples > 0) { + *out++ = *in++ << 8; + --num_samples; + } +} + +const int32_t * +pcm_convert_to_32(struct pcm_buffer *buffer, + uint8_t bits, const void *src, + size_t src_size, size_t *dest_size_r) +{ + unsigned num_samples; + int32_t *dest; + + switch (bits) { + case 8: + num_samples = src_size; + *dest_size_r = src_size * sizeof(*dest); + dest = pcm_buffer_get(buffer, *dest_size_r); + + pcm_convert_8_to_32(dest, (const int8_t *)src, + num_samples); + return dest; + + case 16: + num_samples = src_size / 2; + *dest_size_r = num_samples * sizeof(*dest); + dest = pcm_buffer_get(buffer, *dest_size_r); + + pcm_convert_16_to_32(dest, (const int16_t *)src, + num_samples); + return dest; + + case 24: + num_samples = src_size / 4; + *dest_size_r = num_samples * sizeof(*dest); + dest = pcm_buffer_get(buffer, *dest_size_r); + + pcm_convert_24_to_32(dest, (const int32_t *)src, + num_samples); + return dest; + + case 32: + *dest_size_r = src_size; + return src; + } + + g_warning("only 8 or 32 bits are supported for conversion!\n"); + return NULL; +} |