Для каждого семпла - преобразуйте его в какой-то больший тип данных - если у вас есть 16-битные подписанные семплы, они изначально помещаются в SHORT - извлеките его из потока, затем приведите к локальному double, затем умножьте, затем CLIP, затем приведите обратноSHORT.
Это ДОЛЖНО работать таким образом ...
Я даже могу предоставить пример кода, если это необходимо.
РЕДАКТИРОВАТЬ:
Ваше изображение является точным доказательством того, что вы не расширили изображение до более крупного шрифта до умножения - вы не можете «захватить» условие отсечения в SHORT, потому что оно будет автоматически переноситься.
short* sampleBuffer;
...
short sample=*sampleBuffer;
double dsample=(double)sample * gain;
if (dsample>32767.0) {dsample=32767.0;}
if (dsample<-32768.0) {dsample=-32768.0;}
*sampleBuffer=(short)dsample;
sampleBuffer++;
И еще один РЕДАКТИРОВАТЬ:
если у вас есть несколько голосов - сначала поместите их все в удвоение - затем ПОЛУЧИТЕ каждый из них - затем добавьте их - и обрежьте их как последний шаг.
Еще один РЕДАКТИРОВАТЬ (+ 1s вдохновляют меня):
Если у вас есть STEREO, то же самое будет работать, просто посчитайте все сэмплы x2, т.е.
number of shorts
=
number of samples
*
2
.