Nhận kAUGraphErr_CannotDoInCurrentContext khi gọi AUGraphStart để phát lại


113

Tôi đang làm việc với AUGraphvà API đơn vị âm thanh để phát lại và ghi âm thanh trong ứng dụng iOS của mình. Bây giờ tôi gặp sự cố hiếm gặp khi AUGraphkhông thể bắt đầu với lỗi sau:

result = kAUGraphErr_CannotDoInCurrentContext (-10863)

Lỗi xảy ra không lường trước được khi chúng tôi cố gắng gọi AUGraphStartđược thiết lập để phát lại âm thanh:

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

Đây là những gì chúng tôi nhận được từ tài liệu:

Để tránh quay hoặc chờ trong chuỗi kết xuất (một ý tưởng tồi!), Nhiều lệnh gọi tới AUGraph có thể trả về: kAUGraphErr_CannotDoInCurrentContext. Kết quả này chỉ được tạo khi bạn gọi một API AUGraph từ lệnh gọi lại kết xuất của nó. Nó có nghĩa là khóa mà nó yêu cầu đã được giữ tại thời điểm đó, bằng một sợi khác . Nếu bạn thấy mã kết quả này, bạn thường có thể thử lại hành động - thường là chu kỳ hiển thị NEXT (vì vậy trong thời gian chờ đợi, khóa có thể được xóa) hoặc bạn có thể ủy quyền cuộc gọi đó cho một chuỗi khác trong ứng dụng của mình. Bạn không nên quay hoặc tạm dừng chuỗi kết xuất.

Mã kết quả này chỉ là trạng thái tạm thời, sẽ chuyển ngay sau khi cuộc gọi của luồng khác của bạn tới AUGraph (có khóa) hoàn tất.

Trong trường hợp của tôi, tôi chỉ bắt đầu AUGraph, nó mới và vừa được tạo. Làm cách nào để gỡ lỗi trường hợp và vấn đề có thể xảy ra ở đây là gì?


Làm gì setupAudioForGraph? Bạn có AUGraph Khởi tạo biểu đồ trước không?
cvu

6
Có, setupAudioForGraph tạo và khởi tạo biểu đồ. Hầu hết thời gian nó hoạt động tốt. Vấn đề ở đây là truy cập song song hoặc một cái gì đó tương tự. Nếu chỉ bắt đầu một lần và dừng nó một lần - mọi thứ hoạt động hoàn hảo.
Alexey Strakh

1
Tôi sẽ tìm cách để xem liệu khóa mutex có tồn tại hay không và nếu có, hãy tiếp tục trong vòng lặp của bạn, nếu không sinh ra AUGraph.
Taylor Belland

Câu trả lời:


1

Bạn có thể tạo ra thứ gì đó từ CSS hoặc SQLite. Đây là lý do tại sao

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

return playing;

}

Hãy thử chỉ thao tác mã này, có vấn đề với Booleans trong mã của bạn ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.