AudioServicesAddSystemSoundCompletion под ARC с использованием __bridge

Надеюсь, название не слишком вводит в заблуждение ... :)

Я проигрываю системный звук и добавляю к нему 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

И это работает ...

5
задан Brad Larson 1 February 2012 в 00:16
поделиться