aboutsummaryrefslogtreecommitdiffstats
path: root/src/pcm_format.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pcm_format.c')
-rw-r--r--src/pcm_format.c75
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;
+}