2013-10-05 18 views
5

MTAudioProcessingTap के लिए हेडर फाइल का कहना है कि इसके प्रारंभ और तैयार कॉलबैक unprepare और अंतिम रूप देने कॉलबैक से संतुलित हो जाएगा। हालांकि, Apple's example में, इन कॉलबैक को कभी भी कॉल नहीं किया जाता है (मैंने उनसे लॉगिंग जोड़ दी ताकि मैं जांच सकूं)। हेडर फ़ाइल कहती है कि जब वस्तु को हटा दिया जाता है तो उन्हें बुलाया जाएगा।आप MTAudioProcessingTap को कैसे रिलीज़ करते हैं?

एप्पल के उदाहरण में, टैप audioMixInputParameters में बनाए रखने के लिए पैरामीटर, जो ऑडियो मिश्रण, यह अब सार्वजनिक रूप से सुलभ है, जहां में पारित कर रहे हैं में पारित कर दिया गया है:

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

    CFRelease(audioProcessingTap); 

    audioMix.inputParameters = @[audioMixInputParameters]; 

    _audioMix = audioMix; 
} 

मैं AudioMix उम्मीद होती है इसलिए जिम्मेदार होने की इसे अपने स्वयं के डीलोक विधि में रिलीज़ करने के लिए, और संबंधित प्लेयरइटम जारी होने पर ऑडियोमिक्स को रिलीज़ करने के लिए।

एप्पल के उदाहरण के लिए, एक AVPlayer कि केवल कभी एक आइटम निभाता है का उपयोग करता है तो शायद यह सीधे कुछ भी पुनःआवंटन करने की कोई जरूरत नहीं है। लेकिन मेरे मामले में, मैं एक AVQueuePlayer का उपयोग कर रहा हूं, इसलिए मैं इसे नए AVPlayerItems पास कर रहा हूं। मुझे लगता है कि यह उन टैप को लीक कर रहा है जिन्हें मैं प्रत्येक प्लेयर आइटम (संबंधित ऑडियो इकाइयों के साथ) के लिए बना रहा हूं, भले ही खिलाड़ी आइटम डिलीओटेड हो जाएं।

MTAudioProcessingTap को रद्द करने का उचित तरीका क्या है और जब मैं अपने संबंधित प्लेयर आइटम के साथ काम करता हूं तो उसे अपरिपक्व और कॉलबैक को अंतिम रूप देने के लिए क्या होता है?

अद्यतन: मैंने पाया है कि यह वास्तव में अभी भी ऑडियो मिश्रण के माध्यम से पहुँचा जा सकता है, लेकिन यह इस तरह जारी unprepare को गति प्रदान और अंतिम रूप देने नहीं करता कॉलबैक:

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

न तो यह करता है:

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

उत्तर

7

मैं एक ही समस्या थी। यह काम करने के लिए, मैं खिलाड़ी आइटम की audioMix, नल प्रोसेसर (एप्पल के नमूना परियोजना में 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

संबंधित मुद्दे