pcm_utils: generic pcm_convert_size() implementation
The old pcm_convert_size() ignored most of the destination format, e.g. it did not check its sample size, and assumed it is 16 bit. Simplify and universalize it by using audio_format_frame_size().
This commit is contained in:
@ -343,33 +343,14 @@ size_t pcm_convert_size(const struct audio_format *inFormat, size_t src_size,
|
|||||||
{
|
{
|
||||||
const double ratio = (double)outFormat->sample_rate /
|
const double ratio = (double)outFormat->sample_rate /
|
||||||
(double)inFormat->sample_rate;
|
(double)inFormat->sample_rate;
|
||||||
const int shift = 2 * outFormat->channels;
|
|
||||||
size_t dest_size = src_size;
|
size_t dest_size = src_size;
|
||||||
|
|
||||||
/* no partial frames allowed */
|
/* no partial frames allowed */
|
||||||
assert((src_size % audio_format_frame_size(inFormat)) == 0);
|
assert((src_size % audio_format_frame_size(inFormat)) == 0);
|
||||||
|
|
||||||
switch (inFormat->bits) {
|
dest_size /= audio_format_frame_size(inFormat);
|
||||||
case 8:
|
|
||||||
dest_size <<= 1;
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
dest_size = (dest_size / 4) * 2;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
FATAL("only 8 or 16 bits are supported for conversion!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inFormat->channels != outFormat->channels) {
|
|
||||||
dest_size /= inFormat->channels;
|
|
||||||
dest_size *= outFormat->channels;
|
|
||||||
}
|
|
||||||
|
|
||||||
dest_size /= shift;
|
|
||||||
dest_size = floor(0.5 + (double)dest_size * ratio);
|
dest_size = floor(0.5 + (double)dest_size * ratio);
|
||||||
dest_size *= shift;
|
dest_size *= audio_format_frame_size(outFormat);
|
||||||
|
|
||||||
return dest_size;
|
return dest_size;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user