我希望标题不要太误导...... :)
我播放系统声音并将 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
它有效...