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);
धन्यवाद! मैं जोड़ूंगा कि इससे अपरिपक्व कॉलबैक को भी बुलाया जा सकता है (अंतिम रूप देने से पहले)। इसके अलावा, मेरी playerItem बहुत जल्दी कभी कभी (को अंतिम रूप देने से पहले कॉलबैक) पुनः आवंटित की जाती किया गया था हो रही है, तो मैं MYAudioTapProcessor में playerItem के लिए एक मजबूत संदर्भ जोड़ा, और बदले कि संदर्भ का उपयोग करें। इसलिए मैंने '_player.currentItem.audioMix = nil; '' _audioTapProcessor.playerItem.audioMix = nil;' के साथ बदल दिया। – Tenfour04
मैं यह भी जोड़ूंगा कि अगर आप AVPlayer का उपयोग जारी रखने जा रहे हैं, तो आपको टैप पर CFRelease को कॉल नहीं करना चाहिए, क्योंकि टैप को फिर से रिलीज़ किया जाता है। जब आप एक नए टैप के साथ ऑडियो खेलना जारी रखते हैं, तो पुराना व्यक्ति का अपरिपक्व और अंतिम कॉलबैक आग लग जाएगा। – Tenfour04
आप सही हैं, मेरा जवाब संपादित करें। – chris