7

MTAudioProcessingTap のヘッダー ファイルには、その初期化コールバックと準備コールバックが unprepare コールバックと finalize コールバックによってバランスが取られることが示されています。ただし、Apple の例では、これらのコールバックは呼び出されません (確認できるようにログを追加しました)。ヘッダー ファイルには、オブジェクトの割り当てが解除されたときに呼び出されると書かれています。

Apple の例では、Tap は audioMixInputParameters の保持パラメーターに渡され、オーディオ ミックスに渡され、パブリックにアクセスできなくなります。

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

    CFRelease(audioProcessingTap);

    audioMix.inputParameters = @[audioMixInputParameters];

    _audioMix = audioMix;
}

したがって、AudioMix が独自の dealloc メソッドでそれを解放し、関連付けられた PlayerItem が解放されたときに AudioMix が解放されることを期待します。

Apple の例では、1 つのアイテムのみを再生する AVPlayer を使用しているため、何かを直接解放する必要はないかもしれません。しかし、私の場合、AVQueuePlayer を使用しているので、新しい AVPlayerItems を渡し続けます。プレーヤー アイテムの割り当てが解除されても、各プレーヤー アイテムに対して (関連するオーディオ ユニットと共に) 作成しているタップがリークしていると思います。

MTAudioProcessingTap の割り当てを解除し、関連付けられたプレーヤー アイテムの処理が完了したときに unprepare コールバックと finalize コールバックを起動する適切な方法は何ですか?

更新:実際にはオーディオ ミックスからアクセスできることがわかりましたが、このようにリリースしても unprepare および finalize コールバックはトリガーされません。

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

これもありません:

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

1 に答える 1