2013-10-05 3 views
5

MTAudioProcessingTapのヘッダーファイルでは、初期化と準備コールバックは、準備ができておらず、コールバックを終了することでバランスがとれていると言われています。しかし、Apple's exampleでは、これらのコールバックが呼び出されることはありません(私はそれらをチェックするためにログを追加しました)。ヘッダーファイルには、オブジェクトの割り当てが解除されたときに呼び出されることが記載されています。 Appleの例ではMTAudioProcessingTapをどのようにリリースしますか?

は、タップが、それはもはや公にアクセス可能で、オーディオミックス、に渡され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の割り当てを解除し、関連するプレイヤーアイテムの処理が完了したときに、準備ができていないコールバックをファイナライズする適切な方法は何ですか?

更新

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

どちらこれを行います:

を私はそれが実際にはまだオーディオミックスを介してアクセス可能ではありませんが、このようにそれを解放すると、コールバックを用意しないの引き金と確定しないことがわかりました
MTAudioProcessingTapRef audioProcessingTap = ((AVMutableAudioMixInputParameters *)audioMix.inputParameters[0]).audioTapProcessor; 
CFRelease(audioProcessingTap); 

答えて

7

私は同じ問題がありました。それを動作させるために、私はプレーヤーアイテムのaudioMix、タッププロセッサ(AppleのサンプルプロジェクトでMYAudioTapProcessor)をリセットし、手動MTAudioProcessingTapRefを解放しなければならなかった:

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

これはfinalizeコールバックが呼び出されます。

編集:CFReleaseはコメントを参照してください、必要ないであるように思えます。

+1

ありがとうございました!これにより、準備解除コールバックが呼び出されます(ファイナライズ前)。また、私のplayerItemは(コールバックの終了前に)早すぎて割り当てが解除されていたので、MYAudioTapProcessorのplayerItemへの強力な参照を追加し、その参照を代わりに使用しました。だから私は '_player.currentItem.audioMix = nil;'を '_audioTapProcessor.playerItem.audioMix = nil;'に置き換えました。 – Tenfour04

+0

また、AVPlayerの使用を続行する場合は、タップが過剰にリリースされたときに、タップでCFReleaseを呼び出さないでください。新しいタップでオーディオを再生し続けると、古いものを準備してファイナライズするコールバックが発生します。 – Tenfour04

+0

あなたは正しいです、私の答えを編集しました。 – chris

関連する問題