我希望標題是不是太誤導... :)AudioServicesAddSystemSoundCompletion使用__bridge
我玩了系統的聲音,並添加SoundCompletion回調到它像這樣:
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, completionCallback, (__bridge_retained void *)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
和它的作品...
感謝您的回答,真的幫了我大忙!雖然幾乎錯過了,因爲問題似乎沒有答案 - 你允許爲自己的問題添加一個答案嗎?或者我可以添加它指向您的意見?乾杯v反正;] – davidfrancis 2012-03-15 11:18:31