2016-10-26 2 views
3

Мне нужно сгенерировать сигнал и воспроизвести его с помощью динамиков iPhone или гарнитуры.Как воспроизвести сигнал с помощью AudioUnit (iOS)?

Для этого я генерирую чередующийся сигнал. Затем мне нужно создать экземпляр объекта унаследованного класса AudioUnit со следующей информацией: 2 канала, частотой дискретизации 44100 кГц, некоторым размером буфера для хранения нескольких кадров.

Затем мне нужно написать метод обратного вызова, который займет щель моего сигнала и вытащит его в выходной буфер iPhone.

Проблема в том, что я понятия не имею, как написать унаследованный класс AudioUnit. Я не могу понять документацию Apple относительно этого, и все примеры, которые я мог найти, либо прочитали из файла, либо сыграли его с огромным запаздыванием или использовали лишенные конструкции.

Я начинаю думать, что я глуп или что-то в этом духе. Пожалуйста, помогите ...

+0

я преобразовал этот АУДИОБЛОКА v3 код с Objective C для Swift 3: https://gist.github.com/hotpaw2/630a466cc830e3d129b9. Вы должны иметь возможность преобразовать его обратно в Objective C. – hotpaw2

ответ

2

Чтобы воспроизвести звук на аппаратном обеспечении iPhone с помощью AudioUnit, вы не являетесь результатом AudioUnit, поскольку CoreAudio является каркасом ac - вместо этого вы предоставляете ему обратный вызов рендеринга, в котором вы передаете устройство своим аудио образцы. Следующий пример кода показывает вам, как это сделать. Вам необходимо заменить assert с реальной обработкой ошибок, и вы, вероятно, захотите изменить или хотя бы проверить формат выборки аудиоустройства с помощью селектора kAudioUnitProperty_StreamFormat. Мой формат - это 48kHz с чередованием с чередованием с плавающей запятой.

static OSStatus 
renderCallback(
       void* inRefCon, 
       AudioUnitRenderActionFlags* ioActionFlags, 
       const AudioTimeStamp* inTimeStamp, 
       UInt32 inBusNumber, 
       UInt32 inNumberFrames, 
       AudioBufferList* ioData) 
{ 
    // inRefCon contains your cookie 

    // write inNumberFrames to ioData->mBuffers[i].mData here 

    return noErr; 
} 

AudioUnit 
createAudioUnit() { 
    AudioUnit au; 
    OSStatus err; 

    AudioComponentDescription desc; 
    desc.componentType = kAudioUnitType_Output; 
    desc.componentSubType = kAudioUnitSubType_RemoteIO; 
    desc.componentManufacturer = kAudioUnitManufacturer_Apple; 
    desc.componentFlags = 0; 
    desc.componentFlagsMask = 0; 

    AudioComponent comp = AudioComponentFindNext(NULL, &desc); 
    assert(0 != comp); 

    err = AudioComponentInstanceNew(comp, &au); 
    assert(0 == err); 


    AURenderCallbackStruct input; 
    input.inputProc = renderCallback; 
    input.inputProcRefCon = 0; // put your cookie here 

    err = AudioUnitSetProperty(au, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &input, sizeof(input)); 
    assert(0 == err); 

    err = AudioUnitInitialize(au); 
    assert(0 == err); 

    err = AudioOutputUnitStart(au); 
    assert(0 == err); 

    return au; 
} 
+0

можете ли вы предоставить полную ссылку на образец проекта, где кто-то воспроизводит аудио с помощью AudioUnit? –

+0

Попробуйте ссылку @ hotpaw2 сверху: https://gist.github.com/hotpaw2/630a466cc830e3d129b9 –

Смежные вопросы