KAUGraphErr_CannotDoInCurrentContext प्राप्त करते समय AUGraphStart को प्लेबैक के लिए कॉल करना


113

मैं AUGraphअपने iOS ऐप में ऑडियो प्लेबैक और रिकॉर्ड करने के लिए ऑडियो यूनिट एपीआई के साथ काम कर रहा हूं । अब मेरे पास एक दुर्लभ समस्या है जब एक AUGraphनिम्नलिखित त्रुटि के साथ शुरू करने में असमर्थ है:

परिणाम = kAUGraphErr_CannotDoInCurrentContext (-10863)

त्रुटि अप्रत्याशित रूप से तब होती है जब हम कॉल करने का प्रयास करते हैं AUGraphStartजो ऑडियो प्लेबैक के लिए सेट किया गया है:

(BOOL)startRendering
{
    if (playing) {
        return YES;
    }

    playing = YES;

    if (NO == [self setupAudioForGraph:&au_play_graph playout:YES]) {
        print_error("Failed to create play AUGraph",0);
        playing = NO;
        return NO;
    }

    //result = kAUGraphErr_CannotDoInCurrentContext (-10863)
    OSStatus result = AUGraphStart(au_play_graph);
    if (noErr != result) {
        print_error("AUGraphStart", result);
        playing = NO;
    }

    return playing;
}

यहाँ हम प्रलेखन से क्या प्राप्त करते हैं:

रेंडरिंग थ्रेड (एक बुरे विचार!) में कताई या प्रतीक्षा से बचने के लिए, ऑग्राफ के लिए कई कॉल वापस आ सकते हैं: kAUGraphErr_CannotDoInCurrentContext। यह परिणाम केवल तब उत्पन्न होता है जब आप इसके रेंडर कॉलबैक से AUGraph API कॉल करते हैं। इसका मतलब यह है कि उस ताला की आवश्यकता थी जो उस समय आयोजित किया गया था, एक और धागा द्वारा । यदि आप इस परिणाम कोड को देखते हैं, तो आप आम तौर पर फिर से कार्रवाई का प्रयास कर सकते हैं - आम तौर पर अगला रेंडर चक्र (इस बीच लॉक को साफ किया जा सकता है), या आप उस कॉल को अपने ऐप में किसी अन्य थ्रेड को सौंप सकते हैं। आपको रेंडर थ्रेड को स्पिन या पुट-टू-स्लीप नहीं करना चाहिए।

यह परिणाम कोड केवल एक क्षणभंगुर अवस्था है, जो जैसे ही आपके अन्य थ्रेड के AUGraph पर कॉल करेगा (जिसमें लॉक पूरा हो गया है)।

मेरे मामले में, मैं अभी शुरू करता हूं AUGraph, यह नया है और अभी बनाया गया है। मैं मामले को कैसे डिबग कर सकता हूं और यहां संभावित मुद्दा क्या हो सकता है?


क्या करता setupAudioForGraphहै? क्या आपने पहले ग्राफ़ का AUGraphInitialize किया था?
cvu

6
हां, setupAudioForGraph ग्राफ़ बनाता है और आरंभ करता है। ज्यादातर समय यह ठीक काम करता है। समांतर पहुँच में मुद्दा या ऐसा कुछ। यदि बस इसे एक बार शुरू करें और इसे एक बार बंद कर दें - सब कुछ पूरी तरह से काम करता है।
एलेक्सी स्ट्रैच

1
मैं यह देखने के लिए एक रास्ता खोजूंगा कि क्या म्यूटेक्स लॉक मौजूद है, और यदि ऐसा होता है, तो अपने लूप में जारी रखें, अगर ऑग्राफ को स्पॉन न करें।
टेलर बेलैंड

जवाबों:


1

आप CSS या SQLite से कुछ बना सकते हैं। इसलिए

OSStatus result = AUGraphStart(au_play_graph);
if (noErr != result) {
    print_error("AUGraphStart", result);
    playing = NO;
}

return playing;

}

बस इस कोड में हेरफेर करने की कोशिश करें, आपके कोड में बुलियन के साथ एक समस्या है ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.