Наконец-то все заработало, спасибо Hollance на форумах RW за то, что объяснили мне все это.
[http://www.raywenderlich.com/forums/viewtopic.php?f=2&t=2864]
У меня все еще много проблем сбоев, скорее всего, из-за утечек памяти. Но логика работает.
Инициализировал временный буфер с 22050 нулевыми выборками:
(SInt16 *)tempBuffer = (SInt16*)calloc(22050, sizeof(SInt16));
Инициализировал длинный счетчик с нуля:
long d=0;
Затем в цикле for подается временный буфер, смешанный с текущей выборкой:
for(s=0; s<inNumberFrames; s++) {
ioBuffer[s] = tempBuffer[d] + audioBuffer[audioBufferReadPos];
Добавлен текущий сэмпл в tempBuffer:
tempBuffer[d] = audioBuffer[audioBufferReadPos];
d++;
Сброс счетчика до нуля, если достигнут предел tempBuffer:
if(d >= 22050)
d=0;
}
Если предположить, что частота дискретизации составляет 44100 Гц, это создаст задержку в 0,5 секунды.
ОБНОВЛЕНИЕ:
Изменено
ioBuffer[s] = tempBuffer[d] + audioBuffer[audioBufferReadPos];
К
ioBuffer[s] = 0.6*tempBuffer[d] + 0.4*audioBuffer[audioBufferReadPos];
И это исправило падение.