Настроить список буферов для хранения не чередующихся аудиоданных?

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

Вот фрагмент кода для контекста:

//audiounit render function inside of a callback    
OSStatus status;
        status = AudioUnitRender(THIS.ioUnit,    
                                 ioActionFlags,
                                 inTimeStamp,
                                 0,
                                 inNumberFrames,
                                 &bufferList);

//want to initialize and configure bufferList to store non-interleaved data from both channels
...

//write audio data to disk 
    OSStatus result;
        if (*ioActionFlags == kAudioUnitRenderAction_PostRender) {
            result =  ExtAudioFileWriteAsync(THIS.extAudioFileRef, inNumberFrames, &bufferList);
            if(result) printf("ExtAudioFileWriteAsync  %ld \n", result);}
        return noErr; 

Кто-нибудь знает как это сделать?

Благодарю.

2 ответа

Решение

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

К сожалению, это обязательно будет глобальной переменной, но из-за ограничений AudioUnits в iOS вам, вероятно, придется с этим смириться.

Ваш список буферов должен быть инициализирован с

myBufferList.mNumberBuffers = 2;

Для рабочего примера, проверьте пример MixerHost от Apple.

Другие вопросы по тегам