#include <stdio.h>
#include <limits.h>
//
void mix(short *output, size_t length_output, long *mixing, size_t length_mixing)
{
float f = 1.0f;
if (!output || !mixing || length_output == 0 || length_output != length_mixing) {
goto Exit;
}
{long value = 0;
for (size_t i=0; i<length_output; ++i) {
value = static_cast<long>(mixing[i] * f);
if (value > SHRT_MAX) {
f = SHRT_MAX/value - 0.0001f;
mixing[i] = SHRT_MAX;
}
else if (value < SHRT_MIN) {
f = SHRT_MIN/value + 0.0001f;
mixing[i] = SHRT_MIN;
}
if (f < 1.0f) {
f += (1 - f) / 32;
}}}
Exit:;
}
const size_t length = 128;
int main(int, char *[])
{
short output[length]= { 0 };
long mixing[length] = { 56000, 234, 65650, 13245, 234340, };
mix(output, length, mixing, length);
return 0;
}