Надеюсь, название не слишком вводит в заблуждение ...:)
Я играю системный звук и добавляю к нему SoundCompletion-Callback примерно так:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
Принимая во внимание «self»- это простой NSObject
. В обратном вызове завершения я пытаюсь снова вызвать процедуру воспроизведения:
Мне пришлось добавить __bridge_transfer и __bridge_retained к приведениям, в противном случае я получаю ошибки, сбои,или другое неожиданное поведение.
Но все это не работает, несмотря на все это.
Я сохраняю звуки для воспроизведения в 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
И это работает ...