প্লেব্যাকের জন্য AUGraphStart কল করার সময় kAUGraphErr_CannotDoInCurrentContext প্রাপ্ত করা হচ্ছে


113

আমি AUGraphআমার আইওএস অ্যাপে প্লেব্যাক এবং অডিও রেকর্ড করতে অডিও ইউনিটস এপিআই এর সাথে কাজ করছি । এখন আমার একটি বিরল সমস্যা আছে যখন একটি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 কল করেন। এর অর্থ হ'ল যে লকটি প্রয়োজনীয় ছিল সে সময় অন্য থ্রেড দ্বারা ধরে ছিল । আপনি যদি এই ফলাফলের কোডটি দেখতে পান তবে আপনি সাধারণত ক্রিয়াটি আবার চেষ্টা করতে পারেন - সাধারণত নেক্সট রেন্ডার চক্র (যাতে এর মধ্যে লকটি সাফ হয়ে যায়), অথবা আপনি সেই অ্যাপ্লিকেশানের অন্য থ্রেডে ডেলিগেট করতে পারেন। রেন্ডার থ্রেডটি আপনার স্পিন করা উচিত নয় sleep

এই ফলাফলের কোডটি কেবলমাত্র একটি ট্রানজিটরি অবস্থা, যা আপনার অন্যান্য থ্রেডের অউগ্রাফের কল (যেটিতে লক রয়েছে) সম্পূর্ণ হওয়ার সাথে সাথেই তা চলে যাবে।

আমার ক্ষেত্রে, আমি কেবল এটি শুরু করি AUGraph, এটি নতুন এবং সবেমাত্র তৈরি। আমি কীভাবে মামলাটি ডিবাগ করতে পারি এবং এখানে সম্ভাব্য সমস্যাটি কী হতে পারে?


কি করে setupAudioForGraph? আপনি কি প্রথমে গ্রাফআইনিটায়াল করেছেন?
cvu

6
হ্যাঁ, সেটআপ অডিও ফোরগ্রাফ গ্রাফ তৈরি করে এবং আরম্ভ করে। বেশিরভাগ সময় এটি সূক্ষ্মভাবে কাজ করে। সমান্তরাল অ্যাক্সেস বা এ জাতীয় কিছুতে এখানে সমস্যা। যদি এটি একবার শুরু করে এবং একবার বন্ধ করে দেয় - সবকিছু পুরোপুরি কার্যকর হয়।
আলেক্সি স্ট্র্যাখ

1
আমি মুগেক্স লকটি বিদ্যমান কিনা তা দেখার একটি উপায় অনুসন্ধান করব এবং এটি যদি হয় তবে আপনার লুপটিতে চালিয়ে যান, যদি না এটিউগ্রাফটিকে উত্সাহিত করে।
টেলর বেল্যান্ড

উত্তর:


1

আপনি সিএসএস বা এসকিউএলাইটের বাইরে কিছু তৈরি করতে পারেন। এই জন্যই

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

return playing;

}

এই কোডটি ব্যবহার করার চেষ্টা করুন, আপনার কোডে বুলিয়ানদের সাথে একটি সমস্যা আছে ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.