如何在Core Audio中设置Splitter Unit

问题描述 投票:0回答:1

从《学习核心音频》一书中,我学会了如何混合流1(来自麦克风的声音)和流2(语音合成器)然后连接其输出 到输出单元(扬声器)。 现在我尝试记录它的输出,同时监视扬声器的输出。 所以我设置了一个分离器单元,将mixerUnit的输出连接到其输入, 将其outputScope 0连接到outputUnit,将renderCallback(用于录制)设置到其outputScope 1。(我以为Splitter Unit会将输入流拆分到总线0和总线1) 结果是我可以从扬声器中听到它,但由于其“拉模型”, renderCallback 永远不会被调用,因为它没有连接到任何输出单元。 但是,如果我设置另一个通用输出单元然后连接到它,AUGraph 会向我显示一条错误消息。(不允许使用 2 个输出单元) 有人可以帮我吗?

CheckError(AUGraphNodeInfo(player->graph,
                           outputNode,
                           NULL,
                           &player->outputUnit),
           "AUGraphNodeInfo failed");

CheckError(AUGraphNodeInfo(player->graph,
                           speechNode,
                           NULL,
                           &player->speechUnit),
           "AUGraphInfo failed");

AudioUnit mixerUnit;
CheckError(AUGraphNodeInfo(player->graph,
                           mixerNode,
                           NULL,
                           &mixerUnit),
           "AUGraphNOdeInfo failed");

AudioUnit splitterUnit;
CheckError(AUGraphNodeInfo(player->graph,
                           splitterNode,
                           NULL,
                           &splitterUnit),
           "AUGraphInfo failed");

CheckError(AudioUnitSetProperty(mixerUnit,
                                kAudioUnitProperty_StreamFormat,
                                kAudioUnitScope_Input,
                                0,
                                &player->streamFormat,
                                propertySize),
           "Couldn't set stream format on mixer unit bus 0");

CheckError(AudioUnitSetProperty(mixerUnit,
                                kAudioUnitProperty_StreamFormat,
                                kAudioUnitScope_Input,
                                1,
                                &player->streamFormat,
                                propertySize),
           "Couldn't set stream format on mixer unit bus");

CheckError(AudioUnitSetProperty(splitterUnit,
                                kAudioUnitProperty_StreamFormat,
                                kAudioUnitScope_Input,
                                0,
                                &player->streamFormat,
                                propertySize),
           "Couldn't set stream format on Splitter unit");

CheckError(AUGraphConnectNodeInput(player->graph,
                                   splitterNode,
                                   0,
                                   outputNode,
                                   0),
           "Couldn't connect splitter 0 to outputNode");

CheckError(AUGraphConnectNodeInput(player->graph,
                                   speechNode,
                                   0,
                                   mixerNode,
                                   1),
           "Couldn't connect speech speechNode to mixer input(1)");

AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = GraphRenderProc;
callbackStruct.inputProcRefCon = player;
CheckError(AudioUnitSetProperty(mixerUnit,//was outputUnit
                                kAudioUnitProperty_SetRenderCallback,
                                kAudioUnitScope_Input,
                                0,
                                &callbackStruct,
                                sizeof(callbackStruct)),
           "Couldn't set render callback on mixer unit");

AURenderCallbackStruct recorderCallback;
recorderCallback.inputProc = recordRenderProc;
recorderCallback.inputProcRefCon = player;

CheckError(AudioUnitSetProperty(splitterUnit,
                                kAudioUnitProperty_SetRenderCallback,
                                kAudioUnitScope_Output,
                                0,
                                &recorderCallback,
                                sizeof(recorderCallback)),
           "Couldn't set render callback on splitter output");
core-audio
1个回答
0
投票

您只是想将最终的混合输出记录到文件中吗?

如果是这样,您可以在渲染回调中写入该文件。但是,您不能阻塞很长时间。你必须在下次回调之前完全完成你的写作。最简单的写入方法可能是使用中央调度来异步写入文件。

© www.soinside.com 2019 - 2024. All rights reserved.