pcm_utils: moved code from pcm_convertChannels() to separate functions
Moved code from pcm_convertChannels() to pcm_convert_channels_1_to_2() and pcm_convert_channels_2_to_1(). Improved the quality of pcm_convert_channels_2_to_1() by calculating the arithmetic mean value of both samples.
This commit is contained in:
parent
1a74d7be41
commit
a7924d141d
@ -362,6 +362,29 @@ static size_t pcm_convertSampleRate(int8_t channels, uint32_t inSampleRate,
|
|||||||
}
|
}
|
||||||
#endif /* !HAVE_LIBSAMPLERATE */
|
#endif /* !HAVE_LIBSAMPLERATE */
|
||||||
|
|
||||||
|
static void
|
||||||
|
pcm_convert_channels_1_to_2(int16_t *dest, const int16_t *src,
|
||||||
|
unsigned num_frames)
|
||||||
|
{
|
||||||
|
while (num_frames-- > 0) {
|
||||||
|
int16_t value = *src++;
|
||||||
|
|
||||||
|
*dest++ = value;
|
||||||
|
*dest++ = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pcm_convert_channels_2_to_1(int16_t *dest, const int16_t *src,
|
||||||
|
unsigned num_frames)
|
||||||
|
{
|
||||||
|
while (num_frames-- > 0) {
|
||||||
|
int32_t a = *src++, b = *src++;
|
||||||
|
|
||||||
|
*dest++ = (a + b) / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static const int16_t *
|
static const int16_t *
|
||||||
pcm_convertChannels(int8_t channels, const int16_t *inBuffer,
|
pcm_convertChannels(int8_t channels, const int16_t *inBuffer,
|
||||||
size_t inSize, size_t *outSize)
|
size_t inSize, size_t *outSize)
|
||||||
@ -369,9 +392,6 @@ pcm_convertChannels(int8_t channels, const int16_t *inBuffer,
|
|||||||
static int16_t *buf;
|
static int16_t *buf;
|
||||||
static size_t len;
|
static size_t len;
|
||||||
int16_t *outBuffer = NULL;
|
int16_t *outBuffer = NULL;
|
||||||
const int16_t *in;
|
|
||||||
int16_t *out;
|
|
||||||
int inSamples, i;
|
|
||||||
|
|
||||||
switch (channels) {
|
switch (channels) {
|
||||||
/* convert from 1 -> 2 channels */
|
/* convert from 1 -> 2 channels */
|
||||||
@ -381,17 +401,13 @@ pcm_convertChannels(int8_t channels, const int16_t *inBuffer,
|
|||||||
len = *outSize;
|
len = *outSize;
|
||||||
buf = xrealloc(buf, len);
|
buf = xrealloc(buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
outBuffer = buf;
|
outBuffer = buf;
|
||||||
|
pcm_convert_channels_1_to_2((int16_t *)buf,
|
||||||
inSamples = inSize >> 1;
|
(const int16_t *)inBuffer,
|
||||||
in = (const int16_t *)inBuffer;
|
inSize >> 1);
|
||||||
out = (int16_t *)outBuffer;
|
|
||||||
for (i = 0; i < inSamples; i++) {
|
|
||||||
*out++ = *in;
|
|
||||||
*out++ = *in++;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* convert from 2 -> 1 channels */
|
/* convert from 2 -> 1 channels */
|
||||||
case 2:
|
case 2:
|
||||||
*outSize = inSize >> 1;
|
*outSize = inSize >> 1;
|
||||||
@ -401,15 +417,11 @@ pcm_convertChannels(int8_t channels, const int16_t *inBuffer,
|
|||||||
}
|
}
|
||||||
outBuffer = buf;
|
outBuffer = buf;
|
||||||
|
|
||||||
inSamples = inSize >> 2;
|
pcm_convert_channels_2_to_1((int16_t *)buf,
|
||||||
in = (const int16_t *)inBuffer;
|
(const int16_t *)inBuffer,
|
||||||
out = (int16_t *)outBuffer;
|
inSize >> 2);
|
||||||
for (i = 0; i < inSamples; i++) {
|
|
||||||
*out = (*in++) / 2;
|
|
||||||
*out++ += (*in++) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ERROR("only 1 or 2 channels are supported for conversion!\n");
|
ERROR("only 1 or 2 channels are supported for conversion!\n");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user