Как извлечь целочисленные сэмплы из буфера аудио-очереди и записать измененные сэмплы обратно? - PullRequest
5 голосов
/ 28 января 2011

для приложения изменения голоса iphone (цель c), я пытаюсь взять сэмплированные целые значения из буфера аудио-очереди записи, обработать их в функции и записать измененные значения обратно в буфер воспроизведения. На данный момент я использую что-то вроде этого

AudioBuffer audioBuffer = bufferList->mBuffers[0];
int bufferSize = audioBuffer.mDataByteSize / sizeof(SInt32);
SInt32 *frame = audioBuffer.mData;
SInt32  signalInput[22050];
for( int i=0; i<bufferSize; i++ ) {
    SInt32 currentSample = frame[i];
    *(signalInput +i) = currentSample;
}

для извлечения значений выборки и, кажется, работает довольно хорошо (сигнал ввода должен быть целевым вектором для записи целочисленных выборок). но записать их обратно в буфер все еще проблема ... Я искал документацию и множество форумов, чтобы найти решение, но пока не удалось.

так что буду очень благодарен за любой совет, заранее спасибо, lukas

1 Ответ

4 голосов
/ 28 января 2011

Если вы хотите изменить звук в режиме реального времени, вы можете попробовать использовать вместо этого AudioIO Audio Unit.

При использовании аудио-очередей необходимо сохранить данные из обратного вызова очереди записи, а затем передать обработанные данные в обратный вызов очереди воспроизведения в другой обратный вызов в другое время. Для этого вам, вероятно, придется использовать промежуточную очередь или буфер данных. Чтобы это работало, может помочь попытаться запустить приложение для записи звука, а затем запустить приложение для воспроизведения сэмплов, а затем объединить их.

Добавлено:

Вот несколько примеров исходного кода записи значений примера в очередь вывода звука:

http://lists.apple.com/archives/coreaudio-api/2008/Dec/msg00173.html https://bitbucket.org/ddribin/a440/wiki/Home

Просто используйте ваши собственные предварительно обработанные образцы вместо синусоиды.

...