Отримання kAUGraphErr_CannotDoInCurrentContext при виклику AUGraphStart для відтворення


113

Я працюю з AUGraphAPI Audio Units для відтворення та запису аудіо в моєму додатку 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;
}

Ось що ми отримуємо з документації:

Щоб уникнути обертання або очікування в потоці візуалізації (погана ідея!), Багато з викликів до AUGraph можуть повернутися: kAUGraphErr_CannotDoInCurrentContext. Цей результат генерується лише при виклику API AUGraph з його зворотного виклику візуалізації. Це означає, що замок, який він вимагав, утримувався в той час іншою ниткою . Якщо ви побачите цей результат результату, то, як правило, можна спробувати дію ще раз - як правило, це наступний цикл відтворення NEXT (тому тим часом замок може бути очищений), або ви можете делегувати цей виклик іншому потоку у вашій програмі. Ви не повинні обертати або спати нитку відтворення.

Цей код результату є лише тимчасовим станом, який перейде, як тільки виклик вашого іншого потоку до AUGraph (який має блокування) завершиться.

У моєму випадку я тільки починаю AUGraph, це нове і тільки що створене. Як я можу налагодити цю справу і що може бути потенційним питанням тут?


Що робить setupAudioForGraph? Ви спочатку AUGraphІніціалізували графік?
cvu

6
Так, setupAudioForGraph створює та ініціалізує графік. Більшу частину часу це працює добре. Питання тут у паралельному доступі чи щось подібне. Якщо просто запустити його один раз і зупинити його один раз - все працює чудово.
Олексій Страх

1
Я б шукав спосіб переконатися, чи існує замок мютексу, і якщо він є, продовжуйте працювати у своєму циклі, якщо не породив AUGraph.
Тейлор Белланд

Відповіді:


1

Ви можете зробити щось із CSS або SQLite. Ось чому

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

return playing;

}

Спробуйте просто маніпулювати цим кодом, є проблема із булевими кодами у вашому коді ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.