6

मैट गैलाघर के classic example पर आधारित ऑडियोयूनीट का उपयोग करके आईफोन पर टोन उत्पन्न कर रहा हूं। शुरुआत/अंत में चिप्स और क्लिक से बचने के लिए, मैं fading the amplitude in/outRenderTone कॉलबैक में हूं। मैं फीका आउट के अंत में टोनयूनीट को नष्ट करना चाहता हूं, यानी, आयाम शून्य तक पहुंचने के बाद। एक ही तरीका है मैं यह करने के बारे में सोच सकते कॉलबैक के भीतर से एक उदाहरण विधि कॉल करने के लिए है:स्वर फेड आउट के बाद टोनयूनीट को सही तरीके से कैसे नष्ट करें?

if (PlayerState == FADING_OUT) { 
     amplitude -= stepsize; 
     if (amplitude <= 0) { 
      amplitude = 0; 
      PlayerState = OFF; 
      [viewController destroyToneUnit]; 
     } 
    } 

दुर्भाग्य से यह अधिक चुनौतीपूर्ण है कि मैंने सोचा था कि था। एक बात के लिए, मुझे अभी भी अंत में क्लिक मिल गया है कि फीडआउट को खत्म करना था। दूसरे के लिए, मुझे यह लॉग नोटिस मिलता है:

<AURemoteIO::IOThread> Someone is deleting an AudioConverter while it is in use. 

इस संदेश का क्या अर्थ है और मुझे यह क्यों मिल रहा है?

कैसे मुझे टोनयूनीट को मारना चाहिए? मुझे संदेह है कि क्लिक होता है क्योंकि RenderTone और destroyToneUnit विभिन्न धागे पर चलते हैं। मैं इन सिंक्रनाइज़ कैसे प्राप्त कर सकता हूं?


मामले में यह उपयोगी है, यहाँ मेरी destroyToneUnit उदाहरण विधि है:

- (void) destroyToneUnit { 
    AudioOutputUnitStop(toneUnit); 
    AudioUnitUninitialize(toneUnit); 
    AudioComponentInstanceDispose(toneUnit); 
    toneUnit = nil; 
} 

मैं NSLog संदेशों ठीक पहले और सही AudioUnitUninitialize(toneUnit); के बाद, नोटिस उन दोनों के बीच प्रकट होता है।

उत्तर

6

मैं भी एक ही मुद्दे में भाग गया। जब मैंने मुख्य धागे से नष्ट टोनयूनीट को बुलाया, तो चेतावनी चली गयी।

[viewController performSelectorOnMainThread:@selector(destroyToneUnit) withObject:nil waitUntilDone:NO]; 
+0

आपके कोड के लिए धन्यवाद। मेरे साथ भी ठीक यही समस्या आई. आपने कोड मेरी समस्या हल की है। –

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