我编写了一个命令行c工具,用于生成正弦波并使用默认音频输出上的CoreAudio播放它。我正在初始化一个
AURenderCallbackStruct
并使用AudioUnitInitialize
初始化AudioUnit(已在此论坛中讨论过)。所有这一切都按预期工作,但在关闭程序时,我无法关闭AudioUnit,既不使用AudioOutputUnitStop(player.outputUnit);
也不使用AudioOutputUnitStop(player.outputUnit);
也不能
AudioComponentInstanceDispose(player.outputUnit);
代码中这些调用的出现顺序不会改变行为。 程序编译时没有错误消息,但只要程序的其余部分正在运行,正弦仍然可以听到。
以下是我用于初始化AudioUnit的代码:
void CreateAndConnectOutputUnit (ToneGenerator *player) {
AudioComponentDescription outputcd = {0};
outputcd.componentType = kAudioUnitType_Output;
outputcd.componentSubType = kAudioUnitSubType_DefaultOutput;
outputcd.componentManufacturer = kAudioUnitManufacturer_Apple;
AudioComponent comp = AudioComponentFindNext (NULL, &outputcd);
if (comp == NULL) {
printf ("can't get output unit");
exit (-1);
}
AudioComponentInstanceNew(comp, &player->outputUnit);
// register render callback
AURenderCallbackStruct input;
input.inputProc = SineWaveRenderCallback;
input.inputProcRefCon = player;
AudioUnitSetProperty(player->outputUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Output,
0,
&input,
sizeof(input);
// initialize unit
AudioUnitInitialize(player->outputUnit);
}
在我的主程序中,我正在启动AudioUnit和正弦波。
void main {
// code for doing various things
ToneGenerator player = {0}; // create a sound object
CreateAndConnectOutputUnit (&player);
AudioOutputUnitStart(player.outputUnit);
// waiting to listen to the sine wave
sleep(3);
// attempt to stop the sound output
AudioComponentInstanceDispose(player.outputUnit);
AudioUnitUninitialize(player.outputUnit);
AudioOutputUnitStop(player.outputUnit);
//additional code that should be executed without sine wave being audible
}
由于我对这两个人都很陌生,这个论坛以及Xcode中的编程我希望我能以一种你可以帮助我的方式解释这个问题,我希望我不会错过在搜索解决方案时在论坛中的某个地方回答。
提前感谢您的时间和意见,
的Stefan
答案 0 :(得分:1)
您应该按逻辑顺序管理和取消管理音频设备。在已经未初始化的音频单元上停止播放是没有意义的,该音频单元实际上先前已经在播放的中间处理了。而不是那样,尝试以下顺序:
AudioOutputUnitStop(player.outputUnit); //first stops playback
AudioUnitUninitialize(player.outputUnit); //then deallocates unit's resources
AudioComponentInstanceDispose(player.outputUnit); //finally disposes of the AU itself
您正在使用的正弦波命令行应用程序是this textbook中精心设计的课程。请逐步阅读。
最后,但并非最不重要的是,你的问题与C ++无关,CoreAudio是一个普通的C API,所以你的标题和标签中的C ++都是错误的和误导性的。
答案 1 :(得分:0)
音频单元在异步线程中运行,当您调用AudioOutputUnitStop时,该异步线程可能不会立即停止。因此,在可能仍在运行的音频单元上调用AudioUnitUninitialize和AudioComponentInstanceDispose之前,等待几分之一秒(至少几个音频回调缓冲区持续时间)可能会更好。
另外,请检查以确保您的player.outputUnit值在您停止设备时是一个有效单位(而不是未初始化或已删除的变量)。