タイトルが誤解を招きすぎないことを願っています... :)
システム サウンドを再生し、SoundCompletion-Callback を次のように追加します。
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)self);
«self» は単純な NSObject ですが、
完了コールバックで、再生ルーチンを再度呼び出そうとします。
__bridge_transfer と __bridge_retained をキャストに追加する必要がありました。そうしないと、エラー、クラッシュ、またはその他の予期しない動作が発生します。
しかし、それにもかかわらず、すべてが機能しません。
再生するサウンドを NSMutableArray に保存し、配列の最初のエントリを取得して再生し、サウンドの補完を追加して、何かが起こることを願っています。しかし、保持されたすべての転送を使用すると、NSMutableArray は 2 回目の呼び出しで空になります...
コードは次のとおりです。
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
そして、それは動作します...