espero que el título no es demasiado engañosa ... :)AudioServicesAddSystemSoundCompletion bajo el arco utilizando __bridge
que reproduzca un sonido sistema y añadir la SoundCompletion-Devolución de llamada a ella de este modo:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
Mientras que « uno mismo »es una sencilla NSObject
En la devolución de llamada finalización trato de llamar a la rutina de juego nuevo:
he tenido que añadir la __bridge_transfer y el _ _bridge_retenido a los lanzamientos; de lo contrario, recibo errores, bloqueos u otro comportamiento inesperado.
Pero todo esto no funciona a pesar de todo eso.
Guardo los sonidos para tocar en un NSMutableArray, agarro la primera entrada de la matriz y la reproduzco, agrego la terminación del sonido y espero que suceda algo. Pero - con todo lo que retiene de transferencia de materia, el NSMutableArray está vacío en la segunda llamada ...
Aquí está el código:
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] - responder a mi propia pregunta:
Siempre es bueno descubrirlo por mi cuenta :)
Resulta que ya casi estaba allí.
La llamada para establecer la devolución de llamada es el siguiente:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
Luego, en la devolución de llamada de funciones, hago esto:
myClass *theClass = (__bridge myClass *)myself;
CFRelease(myself);
[theClass playNextSound]; // The routine that plays the sounds
y funciona ...
Gracias por la respuesta, realmente me ayudó! Sin embargo, casi lo perdí, ya que la pregunta parece no contestada: ¿puedes agregar una respuesta a tu pregunta? ¿O puedo agregarlo apuntando a tus comentarios? Saludos v de todos modos;] – davidfrancis