Mam nadzieję, że tytuł nie jest zbyt mylące ... :)AudioServicesAddSystemSoundCompletion pod ARC użyciu __bridge
Gram dźwięk systemu i dodać SoundCompletion-oddzwanianie do niego tak:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
Zważywszy « własny »jest prosty NSObject
W zwrotnego zakończenia próby wywołania rutynowe gra znowu:
musiałem dodać __bridge_transfer i tym _ _bridge_retained do rzutów, w przeciwnym razie dostanę błędy, awarie lub inne nieoczekiwane zachowanie.
Ale cała rzecz nie działa mimo wszystko.
przechowywać dźwięki grać w NSMutableArray, chwyć pierwszy wpis tablicy i odtworzyć go, dodać na zakończenie dźwięku i nadzieję rzeczy się dzieje. Ale - ze wszystkim, co dotyczy zachowanie przeniesienie rzeczy, NSMutableArray jest pusta na drugie wezwanie ...
Oto kod:
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] - odpowiedzi na moje własne pytanie:
zawsze miło się tego dowiedzieć się :)
Okazuje się, byłem prawie na miejscu.
Wezwanie do konfigurowania zwrotnego jest następujący:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
Następnie w Callback-funkcji, to zrobić:
myClass *theClass = (__bridge myClass *)myself;
CFRelease(myself);
[theClass playNextSound]; // The routine that plays the sounds
I to działa ...
Dzięki za odpowiedź naprawdę mi pomogłem! Prawie jednak przeoczyłem, ponieważ pytanie wydaje się bez odpowiedzi - czy możesz dodać odpowiedź na własne pytanie? Czy mogę dodać to wskazując na twoje komentarze? Pozdrawiam V wiele razy;] – davidfrancis