使用System Sound Services播放wav文件 & 解释何为__bridge CFURLRef

iOS开发 使用System Sound Services播放音频文件

http://www.pocketdigi.com/20121017/927.html


System Sound Services只能播放不越过30秒的声音,且支持格式只有wav,没有提供操纵声音和控制音量的功能,一般只用于播放通知。

1
2
3
4
5
6
7
8
    SystemSoundID soundId;
    //后面将使用soundId引用音频文件
    NSString *soundFile=[[NSBundle mainBundle] pathForResource:@"aaa" ofType:@"wav"];
    //通过NSBundle的 mainBundle方法返回一个NSBundle对象,该对象对应当前应用程序可执行二进制文件所属目录。pathForResource方法获取aaa.wav的真实路径。
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:soundFile], &soundId);
    //创建soundFile的SystemSoundID,(__bridge CFURLRef)是强制转换成CFURLRef对象,因为此处要将一个c语言的结构转换为Objective-c对象,所以必须加上__bridge
    AudioServicesPlaySystemSound(soundId);
    //播放音频 System Sound Services不能播放越过30秒的声音,且只支持wav


---------下面这段解释来自  http://blog.csdn.net/weiwangchao_/article/details/8108170


这里代码尝试把一个NSURL指针强制转换为一个CFURLRef指针。这里涉及到一些Core Services特别是Core Foundation(CF)的东西,AudioServicesCreateSystemSoundID()函数接受CFURLRef为参数,这是一个CF的概念,但是我们在较高的抽象层级上所建立的是NSURL对象。在Cocoa框架中,有很多顶层对象对底层的抽象,而在使用中我们往往可以不加区别地对这两种对象进行同样的对待,这类对象即为可以”自由桥接”的对象(toll-free bridged)。NSURL和CFURLRef就是一对好例子,在这里其实CFURLRef和NSURL是可以进行替换的。

通常来说为了代码在底层级上的正确,在iOS开发中对基于C的API的调用所传入的参数一般都是CF对象,而Objective-C的API调用都是传入NSObject对象。因此在采用自由桥接来调用C API的时候就需要进行转换。但是在使用ARC编译的时候,因为内存管理的原因,编译器需要知道对这些桥接对象要实行什么样的操作。如果一个NSURL对象替代了CFURLRef,那么在作用区域外,应该由谁来决定内存释放和对象销毁呢?为了解决这个问题,引入了 bridge,bridge_transfer和__bridge_retained三个关键字。关于选取哪个关键字做转换,需要由实际的代码行为来决定。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值