Menerima kAUGraphErr_CannotDoInCurrentContext saat memanggil AUGraphStart untuk pemutaran

113

Saya bekerja dengan AUGraphdan Audio Units API untuk memutar dan merekam audio di aplikasi iOS saya. Sekarang saya memiliki masalah yang jarang terjadi ketika AUGraphtidak dapat memulai dengan kesalahan berikut:

hasil = kAUGraphErr_CannotDoInCurrentContext (-10863)

Kesalahan terjadi tak terduga saat kami mencoba memanggil AUGraphStartyang disiapkan untuk pemutaran audio:

(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;
}

Berikut yang kami dapatkan dari dokumentasi:

Untuk menghindari berputar atau menunggu di thread render (ide yang buruk!), Banyak panggilan ke AUGraph dapat mengembalikan: kAUGraphErr_CannotDoInCurrentContext. Hasil ini hanya dihasilkan saat Anda memanggil AUGraph API dari render callback-nya. Ini berarti bahwa kunci yang diperlukan dipegang pada saat itu, oleh utas lain . Jika Anda melihat kode hasil ini, Anda biasanya dapat mencoba tindakan itu lagi - biasanya siklus render NEXT (sehingga sementara itu kunci dapat dihapus), atau Anda dapat mendelegasikan panggilan tersebut ke thread lain di aplikasi Anda. Anda tidak boleh memutar atau menonaktifkan thread render.

Kode hasil ini hanya status sementara, yang akan diteruskan segera setelah panggilan utas Anda yang lain ke AUGraph (yang memiliki kunci) selesai.

Dalam kasus saya, saya baru memulai AUGraph, ini baru dan baru saja dibuat. Bagaimana cara men-debug kasus dan apa yang mungkin menjadi masalah potensial di sini?

Alexey Strakh
sumber
Apa yang setupAudioForGraphdilakukannya? Apakah Anda AUGraphInitialize grafik terlebih dahulu?
cvu
6
Ya, setupAudioForGraph membuat dan menginisialisasi grafik. Sebagian besar waktu berfungsi dengan baik. Masalahnya di sini di akses paralel atau sesuatu seperti itu. Jika hanya memulainya sekali dan menghentikannya sekali - semuanya bekerja dengan sempurna.
Alexey Strakh
1
Saya akan mencari cara untuk melihat apakah kunci mutex ada, dan jika ada, lanjutkan di loop Anda, jika tidak menelurkan AUGraph.
Taylor Belland

Jawaban:

1

Anda dapat membuat sesuatu dari CSS atau SQLite. Ini sebabnya

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

return playing;

}

Cobalah untuk memanipulasi kode ini, ada masalah dengan Boolean di kode Anda ...

Jaymin
sumber