pcm_format: added conversion from 32 bit

Support converting 32 bit samples to any other supported sample
format.
This commit is contained in:
Max Kellermann 2009-03-02 16:41:08 +01:00
parent d4e4c57b8d
commit 3165e26f9a
1 changed files with 37 additions and 0 deletions

View File

@ -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,
(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,
} }
} }
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,
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");