你如何发布MTAudioProcessingTap?

Ten*_*r04 6 macos objective-c avfoundation ios

MTAudioProcessingTap的头文件说它的初始化和准备回调将通过无准备和最终化回调来平衡.但是,在Apple的例子中,这些回调永远不会被调用(我添加了对它们的记录,所以我可以检查).头文件表示在取消分配对象时将调用它们.

在Apple的示例中,Tap被传递到audioMixInputParameters中的retain参数,该参数被传递到音频混合中,在那里它不再可公开访问:

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

    CFRelease(audioProcessingTap);

    audioMix.inputParameters = @[audioMixInputParameters];

    _audioMix = audioMix;
}
Run Code Online (Sandbox Code Playgroud)

我希望AudioMix负责在自己的dealloc方法中释放它,并在发布相关的PlayerItem时释放AudioMix.

Apple的例子使用的AVPlayer只播放一个项目,所以也许它不需要直接释放任何东西.但在我的情况下,我正在使用AVQueuePlayer,所以我不断传递新的AVPlayerItems.我认为它正在泄漏我为每个玩家项目创建的Taps(以及相关的音频单元),即使播放器项目被取消分配.

当我完成其关联的播放器项目时,解除MTAudioProcessingTap并获取其无准备和最终确定的回调的正确方法是什么?

更新:我发现它实际上仍然可以通过音频混合访问,但是像这样释放它不会触发无准备和最终的回调:

((AVMutableAudioMixInputParameters *)audioMix.inputParameters[0]).audioTapProcessor = nil;
Run Code Online (Sandbox Code Playgroud)

这也不是:

MTAudioProcessingTapRef audioProcessingTap = ((AVMutableAudioMixInputParameters *)audioMix.inputParameters[0]).audioTapProcessor;
CFRelease(audioProcessingTap);
Run Code Online (Sandbox Code Playgroud)

chr*_*ris 8

我有同样的问题.为了使它工作,我不得不重置播放器项目audioMix,点击处理器(MYAudioTapProcessor在Apple的示例项目中)并手动释放MTAudioProcessingTapRef:

MTAudioProcessingTapRef tap = ((AVMutableAudioMixInputParameters *)_audioTapProcessor.audioMix.inputParameters[0]).audioTapProcessor;
_player.currentItem.audioMix = nil;
_audioTapProcessor = nil;
CFRelease(tap);
Run Code Online (Sandbox Code Playgroud)

这会导致finalize调用回调.

编辑:好像CFRelease没有要求的,看评论.