2011-01-28 4 views
5

для приложения для изменения голоса в 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; 
} 

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

так идентификатор очень благодарен за любые советы, заранее спасибо Лукаш

ответ

4

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

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

Добавлено:

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

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

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

+0

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

+0

Убедитесь, что типы данных PCM, которые вы указываете, получаете и используете, являются согласованными. Вы просили 16 или 32-битные образцы? Целое или плавающее? Большой или малодушный? и т. д. – hotpaw2

+0

ОК, спасибо. Я проверю это немедленно. Но в принципе, функция, заявленная выше, правильная ?! Если это так, как я могу записать значения (тип которых когда-либо) обратно в звуковой буфер. Я не смог найти какой-либо образец кода в любом месте ...? – Lukas