2013-10-05 25 views
5

MTAudioProcessingTap için başlık dosyası, başlatılması ve geri çağırmaların hazırlandığını, hazır bulunarak dengeleneceğini ve geri çağrıları sonlandıracağını söylüyor. Ancak, Apple's example'da, bu geri çağrılar hiçbir zaman aranmaz (denetleyebilmem için bunlara giriş ekledim). Üstbilgi dosyası, nesne serbest bırakıldığında çağrılacaklarını söylüyor. Dolayısıyla sorumlu olmakMTAudioProcessingTap'ı nasıl serbest bırakırsınız?

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

    CFRelease(audioProcessingTap); 

    audioMix.inputParameters = @[audioMixInputParameters]; 

    _audioMix = audioMix; 
} 

Ben AUDIOMIX beklenebilir: Apple'ın örnekte

, dokunun artık herkesin erişebileceği ses mix, içine geçirilir audioMixInputParameters bir muhafaza parametresi, geçirilir kendi dealloc yöntemiyle serbest bırakmak ve ilgili PlayerItem serbest bırakıldığında AudioMix'in yayınlanması için.

Apple'ın örneği, yalnızca bir öğeyi herhangi bir şekilde oynatan bir AVPlayer kullanmaktadır; bu nedenle, doğrudan bir öğeyi dağıtmaya gerek yoktur. Ama benim durumumda, bir AVQueuePlayer kullanıyorum, bu yüzden yeni AVPlayerItems'i geçmeye devam ediyorum. Oyuncu öğeleri serbest bırakılsa bile, her bir oyuncu öğesi için (ilişkili ses birimleriyle birlikte) oluşturduğum Muslukları sızdırdığını düşünüyorum.

MTAudioProcessingTap öğesinin dağıtımını kaldırmanın ve ilişkili oyunculuk öğesiyle işim bittiğinde geri çağrılma çağrılarının yanıt vermemesi ve son haline getirilmesinin doğru yolu nedir?

Güncelleme:

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

Ne yapar:

Ben aslında hala ses karışımı ile erişilebilir, ancak bu gibi serbest geri aramalar unprepare tetikleyebilir ve sonuçlandırmak olmadığını tespit
MTAudioProcessingTapRef audioProcessingTap = ((AVMutableAudioMixInputParameters *)audioMix.inputParameters[0]).audioTapProcessor; 
CFRelease(audioProcessingTap); 

cevap

7

Aynı problem vardı. o iş yapmak için, ben oyuncu öğesinin audioMix dokunun işlemci (MYAudioTapProcessor Apple'ın örnek projesinde) ve elle MTAudioProcessingTapRef serbest sıfırlamak zorunda:

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

Bu finalize geri çağrılır neden olur.

Düzenleme:gerekli değildir edilir CFRelease gibi görünüyor, yorum alıyor.

+1

Teşekkür ederiz! Bunun da eklenmemesi için geri çağrılan çağrının (sonuçlandırılmadan önce) neden olduğunu da ekleyeceğim. Ayrıca, playerItem bazen çok erken ayrılmakta (geri arama sonlandırılmadan önce), bu yüzden MYAudioTapProcessor'daki playerItem'e güçlü bir referans ekledim ve bu referansı kullanıyorum. Bu yüzden _player.currentItem.audioMix = nil; '_audioTapProcessor.playerItem.audioMix = nil;' ile değiştirdim. – Tenfour04

+0

Ayrıca, musluk daha sonra serbest bırakıldığı için AVPlayer kullanmaya devam edecekseniz, muslukta CFRelease çağırmamanız gerektiğini de ekleyeceğim. Yeni bir dokunuşla ses çalmaya devam ettiğinizde, eskisinin ortaya çıkması ve sonlandırılması geri aramaların patlayacaktır. – Tenfour04

+0

Haklısınız, cevabımı düzenledim. – chris

İlgili konular