Oynatma için AUGraphStart çağrılırken kAUGraphErr_CannotDoInCurrentContext alınıyor


113

AUGraphİOS uygulamamda ses çalmak ve kaydetmek için Audio Units API ile çalışıyorum . Şimdi AUGraph, aşağıdaki hatayla başlayamadığında nadir bir sorun yaşıyorum :

sonuç = kAUGraphErr_CannotDoInCurrentContext (-10863)

AUGraphStartSes çalma için ayarlanmış olanı aramaya çalıştığımızda hata tahmin edilemez bir şekilde oluştu :

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

İşte belgelerden elde ettiğimiz şey:

Oluşturma iş parçacığında dönmekten veya beklemekten kaçınmak için (kötü bir fikir!), AUGraph'a yapılan çağrıların çoğu şunu döndürebilir: kAUGraphErr_CannotDoInCurrentContext. Bu sonuç yalnızca bir AUGraph API'sini kendi oluşturma geri aramasından çağırdığınızda oluşturulur. Bu, ihtiyaç duyduğu kilidin o sırada başka bir iplik tarafından tutulduğu anlamına gelir . Bu sonuç kodunu görürseniz, genellikle işlemi tekrar deneyebilirsiniz - tipik olarak NEXT oluşturma döngüsü (bu arada bu arada kilit kaldırılabilir) veya bu çağrıyı uygulamanızdaki başka bir iş parçacığına devredebilirsiniz. Oluşturma iş parçacığını döndürmemeli veya uyku moduna geçirmemelisiniz.

Bu sonuç kodu yalnızca, diğer iş parçacığınızın (kilidi olan) AUGraph'a çağrısı tamamlanır tamamlanmaz geçecek bir geçici durumdur.

Benim durumumda, yeni başlıyorum, AUGraphyeni ve yeni yaratılmış. Vakada nasıl hata ayıklayabilirim ve buradaki olası sorun ne olabilir?


Ne anlama geliyor setupAudioForGraph? Önce grafiği AUGraphInitialize mi yaptınız?
cvu

6
Evet, setupAudioForGraph grafiği oluşturur ve başlatır. Çoğu zaman iyi çalışıyor. Buradaki sorun paralel erişim veya bunun gibi bir şey. Sadece bir kez başlatıp bir kez durdurursanız, her şey mükemmel şekilde çalışır.
Alexey Strakh 01

1
Muteks kilidinin var olup olmadığını görmenin bir yolunu arardım ve eğer varsa, AUGraph'ı üretmezse döngünüzde devam edin.
Taylor Belland

Yanıtlar:


1

CSS veya SQLite'dan bir şeyler yapabilirsiniz. Bu nedenle

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

return playing;

}

Sadece bu kodu değiştirmeye çalışın, kodunuzda Booleanlarla ilgili bir sorun var ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.