我需要产生一个信号并用iPhone的扬声器或头戴式耳机播放。
为此,我生成了一个交错信号。然后,我需要使用下一个信息实例化AudioUnit继承的类对象:2个通道,44100 kHz采样率,一些缓冲区大小以存储一些帧。
然后,我需要编写一个回调方法,该方法将接收信号的信号并将其插入iPhone的输出缓冲区。
问题是我不知道如何编写AudioUnit继承的类。我无法理解Apple的文档,而且我能找到的所有示例都可以从文件中读取并严重滞后或使用专用结构。
我开始认为我很蠢。请帮忙...
最佳答案
要使用AudioUnit
将音频播放到iPhone的硬件,您不必从AudioUnit
派生音频,因为CoreAudio是c框架-而是给它提供一个渲染回调,您可以在其中提供音频样本。下面的代码示例向您展示如何。您需要用真正的错误处理替换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;
}