Я воспроизводю аудиофайлы в программе, а в обратных вызовах рендеринга аудио я применяю множитель усиления к входному сигналу и добавляю его в выходной буфер. Вот какой-то псевдокод для иллюстрации моих действий:
void audioCallback(AudioOutputBuffer* ao, AudioInput* ai, int startSample, int numSamples){
for (int i=startSample; i<numSamples+startSample; i++){
ao[i] = ai[i]*gain;
}
}
В основном я просто умножаю данные на некоторый множитель. В этом случае gain
- это элемент с плавающей запятой, который корректируется с помощью обратного вызова графического интерфейса. Если я регулирую это значение во время воспроизведения звука, я слышу, что звук становится тише или громче при перемещении ползунка, но я слышу много мелких хлопков и щелчков.
Не совсем уверен, в чем дело. Я знаю об интерполяции, и я делаю это, если звук смещен, но я не уверен, нужно ли мне делать дополнительную интерполяцию или что-то еще, если усиление регулируется в реальном времени до того, как аудиофайл закончил воспроизведение.
Если я отрегулирую ползунок до начала воспроизведения звука, усиление будет установлено правильно, и я не получу щелчков.
Я что-то упустил? Как еще реализовано усиление, кроме как множителя входного сигнала?