如何使用AudioUnit播放信号(iOS)



我需要生成一个信号并使用iPhone的扬声器或耳机播放它。

为此,我生成了一个交错信号。然后我需要实例化一个AudioUnit继承类对象与下一个信息:2通道,44100 kHz采样率,一些缓冲大小来存储一些帧。

然后我需要写一个回调方法,它将采取我的信号的缝隙,并将其放入iPhone的输出缓冲区。

问题是,我不知道如何编写AudioUnit继承类。我不能理解苹果关于它的文档,我能找到的所有例子要么从文件中读取并播放它,要么使用贬低的结构。

我开始觉得我很笨之类的。请帮助……

要用AudioUnit播放音频到iPhone的硬件,您不需要从AudioUnit派生,因为CoreAudio是一个c框架-相反,您给它一个渲染回调,其中您为单元提供音频样本。下面的代码示例向您展示了如何操作。您需要用真正的错误处理替换assert s,并且您可能希望使用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;
}

最新更新