Надеюсь, название не слишком вводит в заблуждение ... :)
Я проигрываю системный звук и добавляю к нему SoundCompletion-Callback следующим образом:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
В то время как «self» - это простой NSObject
В обратном вызове завершения я пытаюсь снова вызвать процедуру воспроизведения:
Мне пришлось добавить __bridge_transfer и __bridge_reserved к приведениям, иначе я получаю ошибки, сбои или другое неожиданное поведение.
Но в целом вещь не работает, несмотря на все это.
Я сохраняю звуки для воспроизведения в NSMutableArray, беру первую запись массива и проигрываю ее, добавляю завершение звука и надеюсь, что все произойдет. Но - со всем этим материалом с сохраненной передачей NSMutableArray пуст при втором вызове ...
Вот код:
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);
}
}
[РЕДАКТИРОВАТЬ] - ОТВЕТЫ НА МОЙ СОБСТВЕННЫЙ ВОПРОС:
Всегда приятно узнать это самому :)
Оказывается, я был почти у цели.
Вызов для установки обратного вызова выглядит следующим образом:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
Затем в функции обратного вызова я делаю следующее:
myClass *theClass = (__bridge myClass *)myself;
CFRelease(myself);
[theClass playNextSound]; // The routine that plays the sounds
И это работает ...