2

メモリ リークなしで、サンプラーを使用してオーディオ グラフを初期化およびユニット化することができません。私の例ではコードの量を減らそうとしたので、次の例ではグラフの開始/停止さえしません。したがって、以下のコードは実際には何も役に立ちませんが、リークするべきではありません。

    AudioComponentDescription cd = {};
    cd.componentManufacturer     = kAudioUnitManufacturer_Apple;
    cd.componentFlags            = 0;
    cd.componentFlagsMask        = 0;

    AUGraph graph;
    AUNode sNode;
    AUNode IONode;
    // Instantiate an audio processing graph
    result = NewAUGraph (&graph); 

    //Specify the Sampler unit, to be used as the first node of the graph
    cd.componentType = kAudioUnitType_MusicDevice;
    cd.componentSubType = kAudioUnitSubType_Sampler;

    // THESE WOULDN'T CAUSE THE LEAK!!!
    // cd.componentType = kAudioUnitType_Effect;
    // cd.componentSubType = kAudioUnitSubType_HighPassFilter;

    // Add the Sampler unit node to the graph
    result = AUGraphAddNode (graph, &cd, &sNode);

    // Specify the Output unit, to be used as the second and final node of the graph
    cd.componentType = kAudioUnitType_Output;
    cd.componentSubType = kAudioUnitSubType_RemoteIO;

    // Add the Output unit node to the graph
    result = AUGraphAddNode (graph, &cd, &IONode);

    // Open the graph
    result = AUGraphOpen (graph);

    // Connect the Sampler unit to the output unit
    result = AUGraphConnectNodeInput (graph, sNode, 0, IONode, 0);

    // Initialize the audio processing graph.        
    result = AUGraphInitialize (graph);

    // Uninitialize
    result = AUGraphUninitialize(graph);

    CAShow(graph); // two nodes, 1 connection as expected


    AUGraphClearConnections(graph);
    AUGraphRemoveNode(graph, IONode);
    AUGraphRemoveNode(graph, sNode);

    CAShow(graph); // graph empty as expected

    result = DisposeAUGraph(graph);

    // -------> LEAK!

すべての戻り値は問題なく、グラフは期待どおりに機能しますが、メモリ リークの原因がわかりません。これは kAudioUnitSubType_Sampler でのみ発生し、オーディオ エフェクトなどでは発生しません。

リークは 48 バイトで、コール ツリーは次のようになります (Instruments の Leaks-tool から)。

0 libsystem_c.dylib calloc
1 libobjc.A.dylib class_createInstance
2 libdispatch.dylib _os_object_alloc
3 libdispatch.dylib dispatch_semaphore_create$VARIANT$up
4 AudioToolbox AudioStreamerImpl::Initialize()
5 AudioToolbox Sampler::Initialize()
6 AudioToolbox AUBase::DoInitialize()
7 AudioToolbox _ZL18AUMethodInitializePv
8 AudioToolbox AudioUnitNodeInfo::Initialize(AudioUnitGraph*)
9 AudioToolbox AudioUnitGraph::Initialize()
10 AudioToolbox AUGraphInitialize

漏洩したオブジェクトは「OS_dispatch_semaphore」と呼ばれます。私は iOS 6.1 を使用していますが、これはシミュレーターだけでなく、iPhone 4 および iPad 2 でも発生します。リークの原因は何ですか? 私は数日間原因を突き止めようとしてきましたが、それは本当に私を夢中にさせています:)

4

0 に答える 0