CoreAudio:AudioUnit既不能停止也不能初始化

时间:2016-06-03 14:00:08

标签: core-audio audiounit

我编写了一个命令行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

2 个答案:

答案 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值在您停止设备时是一个有效单位(而不是未初始化或已删除的变量)。