2012-07-28 76 views
5

我试图让要播放的声音,但是当我代码:CFURLRef需要一个桥接铸错误

AudioServicesCreateSystemSoundID ((CFURLRef) alertSound, &soundFileObject); 

它引发以下错误:Objective-C的指针类型的

演员“ NSURL *”到C指针类型‘CFURLRef’(又名‘常量结构__CFURL *’)需要一个桥接铸错误

我曾经尝试都两个以下建议的解决方案:

AudioServicesCreateSystemSoundID ((__bridge CFURLRef) alertSound, &soundFileObject); 

AudioServicesCreateSystemSoundID ((CFURLRef) CFBridgingRetain(alertSound), &soundFileObject); 

但我仍然不能得到声音播放。

我想问题是:桥接错误是声音没有播放的原因,还是我应该看看其他地方?

我可以使用SysSound示例代码播放声音,我使用的是iOS 6和Xcode 4.5。

感谢您的指点:)

回答

9

演员可能不是声音是不打的理由:

AudioServicesCreateSystemSoundID ((__bridge CFURLRef) alertSound, &soundFileObject); 

是罚款。

您的错误很可能出现在您未向我们显示的代码中。一个常见的问题是URL创建错误或无效的文件格式。

修改代码如下:

OSStatus status = AudioServicesCreateSystemSoundID((__bridge CFURLRef)alertSound, &soundFileObject); 
NSLog(@"AudioServicesCreateSystemSoundID status = %ld", status); 

,并检查你所得到的状态代码; parmErr(-50)比较常见,通常表示您的URL为零。

哦,还有一个想法,你不显示你在哪里播放声音。您确实知道AudioServicesCreateSystemSoundID实际上并未播放声音。你需要调用:

AudioServicesPlaySystemSound(soundFileObject); 

道歉,如果你已经知道了!

+0

是的,-50。 我的NSURL如下所示: NSURL * alertSound = [[NSBundle mainBundle] URLForResource:@“tap”withExtension:@“aif”]; 而文件“tap.aif”位于我创建的名为Sounds的组中。 是否有某处需要放置? 非常感谢您的帮助! – robspencer77 2012-07-28 20:06:44

+0

只是为了确保在调试器或者使用NSLog检查URL是否为零。这意味着(正如我认为你开始怀疑)Xcode不会将你的声音复制到你的应用程序的包中。您可以尝试从您的项目中删除它(仅参考!!!!),然后重新添加它,并再次检查文件名的拼写是否正确(可能是.aiff?)。我不认为你需要把它放在任何特别的地方。我通常会将这些东西放在Xcode创建的“支持文件”组中,但我不认为这是必需的。 – idz 2012-07-28 20:21:16

+0

啊,明白了!谢谢! :) 不知道为什么没有正确添加在首位。 干杯,idz! – robspencer77 2012-07-28 20:27:37