我被指控将 VOIP 添加到游戏中(跨平台,所以不能使用 Apple gamekit 来做)。
现在有 3 或 4 天,我正试图让我的头围绕音频单元和 remoteIO ......我忽略了几十个例子等等,但每次它只是对输入 PCM 应用一个简单的算法并播放它回到扬声器上。根据 Apple 的文档,为了进行 VOIP,我们应该使用 kAudioSessionCategory_PlayAndRecord。
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;
status = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
sizeof(audioCategory),
&audioCategory);
XThrowIfError(status, "couldn't set audio category");
1)但是(在我看来) playAndRecord 似乎总是会播放来自麦克风的内容(或者更确切地说是 PerformThru 回调 // aurioTouch),我错了吗?
我有最简单的回调,除了 AURender 什么都不做
static OSStatus PerformThru(
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
OSStatus err = AudioUnitRender(THIS->rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
if (err)
printf("PerformThru: error %d\n", (int)err);
return err
}
从那个回调中,我打算向对等方发送数据(当然不是直接发送,但数据会来自它)......
我看不出如何播放与输入不同的输出,除了可能使用 2 个单元、一个录音、一个播放,但这似乎不是 Apple 的意图(仍然根据文档)。
当然,我找不到任何关于它的文档,音频单元仍然几乎没有文档......
任何人都会知道最好的方法是什么?