Mac,CoreAudio:AUGraphInitialize()崩溃

时间:2013-02-13 20:15:08

标签: macos audio core-audio

我们的Mac应用程序在AUGraphInitialize()中崩溃,带有来自gdb的回溯

(gdb) bt
#0  0x7004dc2f in PowerMeter::PowerMeter ()
#1  0x70073583 in MatrixMixerCore::MatrixMixerCore ()
#2  0x700461ac in AUMatrixMixer::Initialize ()
#3  0x7000541b in AUBase::DoInitialize ()
#4  0x700a333d in AUMethodInitialize ()
#5  0x91e6056c in _AT_AudioUnitInitialize ()
#6  0x91e75072 in AudioUnitNodeInfo::Initialize ()
#7  0x91e76a62 in AudioUnitGraph::Initialize ()
#8  0x91e77ded in AUGraphInitialize ()
#9  0x008908b6 in CMyCoreAudioWrapper::Init (this=0xc800c80) at MyCoreAudioWrapper:829
...
#18 0x0000c9b7 in main (argc=4, argv=0xbffff8c4) at main.h:7

这种崩溃只发生在某些机器上,例如,2008年初Mac Pro,Lion, 而不是其他人,例如2012年底的Mac Mini,Mountain Lion。但我们没有 测试所有可能的操作环境的资源。

我已经把这个问题缩小了一点:

图中只有两个节点,一个MatrixMixer节点和一个Output节点。 如果我向MatrixMixer节点注册回调,则会发生崩溃, 但如果回调被注册到Output节点,则不会崩溃。

回调注册如下所示

AURenderCallbackStruct callback = {0};
callback.inputProc          = MixerInputProc;
callback.inputProcRefCon    = this;

result = AUGraphSetNodeInputCallback(m_Graph, m_matrixMixerNode, 0, &callback );

我还注意到,即使回调MixerInputProc()什么都不做,崩溃仍然会发生。

我尝试过的其他事情,但也没有奏效:

  1. 在AUGraphAdctNode()之前或之后移动AUGraphSetNodeInputCallback(),在AUGraphConnectNodeInput()之前或之后,在AUGraphAddNode()调用之前或之后。
  2. 将调用顺序切换为AUGraphOpen(),AUGraphAddNode(),AUGraphNodeInfo()和各种SetProperty调用。
  3. 使用AudioUnitSetProperty()来设置音频单元的输入回调,而不是使用类别kAudioOutputUnitProperty_SetInputCallback而不仅仅是AUGraphSetNodeInputCallback()来设置节点的顶部。
  4. 将matrixMixer节点注册到渲染回调而不是输入回调。即使它没有崩溃,这根本没有声音。
  5. 有没有人知道有关设置节点回调的怪癖,比如线程或内存要求?我想到的事情:

    1. 订单敏感度:我看过很多代码示例 初始化序列调用按顺序放入 粗略看起来像这样:NewAUGraph()=> AUGraphAddNode() AUGraphAddNode(),...,=> GraphConnectNodeInput()=> AUGraphOpen() => AUGraphNodeInfo(),AUGraphNodeInfo(),...,节点等上的各种设置属性,...... AUGraphInitialize()。现在我的问题是:这个命令必须绝对受到尊重吗?
    2. 回拨注册位置:在上面的序列中,何时应插入回调注册码?例如,在AUGraphOpen之前或之后。
    3. “输入回调”和“渲染回调”之间的区别是什么?将输入回调注册到矩阵混合器的效果是什么?渲染回调又是什么?
    4. API AUGraphAddRenderNotify()和AUGraphSetNodeInputCallback()之间的区别是什么,它们分别注册输入/渲染回调,例如线程安全,init序列中的顺序等等?
    5. CoreAudioAPI邮件列表人员似乎完全忽略了我的问题所以我必须在这里使用我的最后一根稻草。

      任何提示都将不胜感激!

0 个答案:

没有答案