Эхо-эффект: записывать аудио буферы со смещением? - PullRequest
3 голосов
/ 15 марта 2012

Можно ли записать звуковые буферы со смещением (задержкой) для создания эффекта плоского эха?

Следующий фрагмент кода выводит мои аудио буферы:

for(s=0; s<inNumberFrames; s++) {
    ioBuffer[s] = audioBuffer[audioBufferReadPos];
}

Могу ли я сделать что-то подобное в цикле for :

tempBuffer[s] = audioBuffer[audioBufferReadPos];
--- Then somehow offset tempBuffer[] as bufferWithOffset[] --- 
ioBuffer[s] = audioBuffer[audioBufferReadPos] + bufferWithOffset[];

Любые указания в этом отношении будут высоко оценены.

Спасибо.

1 Ответ

3 голосов
/ 18 марта 2012

Наконец-то все заработало, спасибо 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];

И это исправило падение.

...