Spero che il titolo non sia troppo fuorviante ... :)AudioServicesAddSystemSoundCompletion sotto ARC usando __bridge
ho riprodurre un suono di sistema e aggiungere il SoundCompletion-richiamata ad esso in questo modo:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
Mentre « sé »è un semplice NSObject
Nel callback di completamento provo a chiamare la riproduzione di routine di nuovo:
ho dovuto aggiungere il __bridge_transfer e la _ _bridge_retained ai cast, altrimenti ricevo errori, arresti anomali o altri comportamenti imprevisti.
Ma il tutto non funziona nonostante tutto ciò.
Memorizzo i suoni per riprodurli in un NSMutableArray, acquisisco la prima voce dell'array e lo suono, aggiungo il completamento del suono e mi auguro che succeda qualcosa. Ma - con tutto ciò che ha mantenuto trasferimento roba, il NSMutableArray è vuota, in seconda convocazione ...
Ecco il codice:
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] - rispondere alla mia domanda OWN:
Sempre bello trovarlo da solo :)
Alla fine, ero quasi arrivato.
La chiamata per impostare la richiamata è la seguente:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
Poi, nella funzione di callback, faccio questo:
myClass *theClass = (__bridge myClass *)myself;
CFRelease(myself);
[theClass playNextSound]; // The routine that plays the sounds
e funziona ...
Grazie per la risposta, mi ha davvero aiutato! È quasi mancato però, dato che la domanda non ha risposta - ti è permesso aggiungere una risposta alla tua stessa domanda? O posso aggiungerlo indicando i tuoi commenti? Saluti v molto comunque] – davidfrancis