Tôi hy vọng danh hiệu không phải là quá sai lầm ... :)AudioServicesAddSystemSoundCompletion dưới ARC sử dụng __bridge
tôi chơi một hệ thống âm thanh và thêm SoundCompletion-Callback để nó như vậy:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
Trong khi « tự »là một NSObject đơn giản
Trong callback hoàn thành tôi cố gắng gọi cho thói quen chơi một lần nữa:
tôi phải thêm __bridge_transfer và _ _bridge_retained cho các phôi, nếu không tôi nhận được lỗi, sự cố hoặc hành vi không mong muốn khác.
Nhưng toàn bộ mọi thứ không hoạt động mặc dù vậy.
Tôi lưu trữ âm thanh để phát trong NSMutableArray, lấy mục nhập đầu tiên của mảng và phát, thêm âm thanh hoàn thành và hy vọng mọi thứ xảy ra. Nhưng - với tất cả những gì giữ lại chuyển công cụ, các NSMutableArray là trống trên cuộc gọi thứ hai ...
Dưới đây là các mã:
static void completionCallback (SystemSoundID mySSID, void *myself) {
NSLog(@"Audio callback");
AudioServicesRemoveSystemSoundCompletion (mySSID);
AudioServicesDisposeSystemSoundID(mySSID);
[(__bridge_transfer Speaker *)myself speakCharacter];
CFRelease(myself); // I heard I need this?
}
-(void)speakCharacter{
if([sounds count] > 0){
NSString *soundToPlay = [sounds objectAtIndex:0];
[sounds removeObjectAtIndex:0];
NSLog(@"TxtToSpeak %@", soundToPlay);
CFURLRef soundFileURLRef;
NSURL *path = [[NSBundle mainBundle] URLForResource:[soundToPlay uppercaseString] withExtension:@"aif"];
soundFileURLRef = (__bridge CFURLRef)path;
SystemSoundID soundID;
AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
AudioServicesPlaySystemSound (soundID);
}
}
[EDIT] - Trả lời câu hỏi của riêng tôi:
Luôn luôn tốt đẹp để tìm thấy nó ra bản thân mình :)
Hóa ra, tôi đã gần như ở đó.
Cuộc gọi thành lập gọi lại như sau:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
Sau đó, trong khi gọi lại chức năng, tôi làm điều này:
myClass *theClass = (__bridge myClass *)myself;
CFRelease(myself);
[theClass playNextSound]; // The routine that plays the sounds
Và nó hoạt động ...
Cảm ơn câu trả lời đã thực sự giúp tôi! Gần như đã bỏ lỡ nó, vì câu hỏi xuất hiện chưa được trả lời - bạn có được phép thêm câu trả lời cho câu hỏi của riêng bạn không? Hoặc tôi có thể thêm nó chỉ vào ý kiến của bạn? Chúc mừng v nhiều anyways;] – davidfrancis