Commit 3165e26f authored by Max Kellermann's avatar Max Kellermann

pcm_format: added conversion from 32 bit

Support converting 32 bit samples to any other supported sample format.
parent d4e4c57b
...@@ -40,6 +40,14 @@ pcm_convert_24_to_16(struct pcm_dither *dither, ...@@ -40,6 +40,14 @@ pcm_convert_24_to_16(struct pcm_dither *dither,
pcm_dither_24_to_16(dither, out, in, num_samples); pcm_dither_24_to_16(dither, out, in, num_samples);
} }
static void
pcm_convert_32_to_16(struct pcm_dither *dither,
int16_t *out, const int32_t *in,
unsigned num_samples)
{
pcm_dither_32_to_16(dither, out, in, num_samples);
}
const int16_t * const int16_t *
pcm_convert_to_16(struct pcm_buffer *buffer, struct pcm_dither *dither, pcm_convert_to_16(struct pcm_buffer *buffer, struct pcm_dither *dither,
uint8_t bits, const void *src, uint8_t bits, const void *src,
...@@ -72,6 +80,16 @@ pcm_convert_to_16(struct pcm_buffer *buffer, struct pcm_dither *dither, ...@@ -72,6 +80,16 @@ pcm_convert_to_16(struct pcm_buffer *buffer, struct pcm_dither *dither,
(const int32_t *)src, (const int32_t *)src,
num_samples); num_samples);
return dest; return dest;
case 32:
num_samples = src_size / 4;
*dest_size_r = num_samples * sizeof(*dest);
dest = pcm_buffer_get(buffer, *dest_size_r);
pcm_convert_32_to_16(dither, dest,
(const int32_t *)src,
num_samples);
return dest;
} }
g_warning("only 8 or 16 bits are supported for conversion!\n"); g_warning("only 8 or 16 bits are supported for conversion!\n");
...@@ -98,6 +116,16 @@ pcm_convert_16_to_24(int32_t *out, const int16_t *in, ...@@ -98,6 +116,16 @@ pcm_convert_16_to_24(int32_t *out, const int16_t *in,
} }
} }
static void
pcm_convert_32_to_24(int32_t *out, const int16_t *in,
unsigned num_samples)
{
while (num_samples > 0) {
*out++ = *in++ >> 8;
--num_samples;
}
}
const int32_t * const int32_t *
pcm_convert_to_24(struct pcm_buffer *buffer, pcm_convert_to_24(struct pcm_buffer *buffer,
uint8_t bits, const void *src, uint8_t bits, const void *src,
...@@ -128,6 +156,15 @@ pcm_convert_to_24(struct pcm_buffer *buffer, ...@@ -128,6 +156,15 @@ pcm_convert_to_24(struct pcm_buffer *buffer,
case 24: case 24:
*dest_size_r = src_size; *dest_size_r = src_size;
return src; return src;
case 32:
num_samples = src_size / 4;
*dest_size_r = num_samples * sizeof(*dest);
dest = pcm_buffer_get(buffer, *dest_size_r);
pcm_convert_32_to_24(dest, (const int16_t *)src,
num_samples);
return dest;
} }
g_warning("only 8 or 24 bits are supported for conversion!\n"); g_warning("only 8 or 24 bits are supported for conversion!\n");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment