Wie veröffentlichen Sie ein MTAudioProcessingTap?

In der Header-Datei für MTAudioProcessingTap wird angegeben, dass die Initialisierungs- und Vorbereitungsrückrufe ausgeglichen werden, indem Rückrufe nicht vorbereitet und abgeschlossen werden. InApples BeispielDiese Rückrufe werden nie aufgerufen (ich habe ihnen die Protokollierung hinzugefügt, damit ich sie überprüfen kann). Die Header-Datei besagt, dass sie aufgerufen werden, wenn die Zuordnung des Objekts aufgehoben wird.

In Apples Beispiel wird das Tap an einen Aufbewahrungsparameter in audioMixInputParameters übergeben, der an den Audio-Mix übergeben wird und dort nicht mehr öffentlich zugänglich ist:

MTAudioProcessingTapRef audioProcessingTap;
if (noErr == MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks, kMTAudioProcessingTapCreationFlag_PreEffects, &audioProcessingTap))
{
    audioMixInputParameters.audioTapProcessor = audioProcessingTap;

    CFRelease(audioProcessingTap);

    audioMix.inputParameters = @[audioMixInputParameters];

    _audioMix = audioMix;
}

Ich würde erwarten, dass AudioMix dafür verantwortlich ist, es in seiner eigenen Dealloc-Methode freizugeben, und dass AudioMix freigegeben wird, wenn das zugehörige PlayerItem freigegeben wird.

In Apples Beispiel wird ein AVPlayer verwendet, der immer nur ein Element wiedergibt, sodass möglicherweise keine direkte Zuordnung erforderlich ist. In meinem Fall verwende ich jedoch einen AVQueuePlayer, sodass ich ihm immer wieder neue AVPlayerItems übergebe. Ich denke, es leckt die Taps, die ich für jeden Spielergegenstand (zusammen mit den dazugehörigen Audioeinheiten) erstelle, obwohl die Spielergegenstände freigegeben werden.

Wie kann ich die Zuordnung von MTAudioProcessingTap aufheben und die nicht vorbereiteten und endgültigen Rückrufe auslösen, wenn ich mit dem zugehörigen Player-Element fertig bin?

Aktualisieren: Ich habe festgestellt, dass der Zugriff über den Audio-Mix tatsächlich noch möglich ist. Wenn Sie ihn jedoch auf diese Weise freigeben, werden die Rückrufe nicht vorbereitet und abgeschlossen:

((AVMutableAudioMixInputParameters *)audioMix.inputParameters[0]).audioTapProcessor = nil;

Weder tut dies:

MTAudioProcessingTapRef audioProcessingTap = ((AVMutableAudioMixInputParameters *)audioMix.inputParameters[0]).audioTapProcessor;
CFRelease(audioProcessingTap);

Antworten auf die Frage(1)

Ihre Antwort auf die Frage