Код, который вы опубликовали от Mixer::renderAudio(int16_t *audioData, int32_t numFrames)
.Его задача - объединить значения семплов из отдельных треков в один массив 16-битных семплов.
Если вы микшируете 2 или более треков вместе, не уменьшая сначала значения, то вы можете превысить максимальное значение семпла 32 767 (иначе INT16_MAX
).Это может привести к обтеканию (то есть запись 32 768 в int16_t
приведет к сохранению значения -32 768) и, следовательно, к слышимым искажениям / потрескиванию.
Имея это в виду, вы можете написать очень простой (жесткий) ограничитель - выполнить масштабирование объема с помощью int32_t
и записать его в массив int16_t
, только если значение не превышает максимальное значение,в противном случае просто напишите максимум.
Это не очень хороший подход, потому что вы не должны выходить за пределы 16-битных значений.Лучше было бы сначала уменьшить значения входных сэмплов, а затем добавить ступень усиления после микшера (или на отдельных дорожках внутри микшера), чтобы довести общую амплитуду до приемлемого уровня.