NSURL 转成CFURLRef 需要桥接
音效工具类,提供快速播放和清除销毁音效功能
// // AudioEffectTool.h // 33_音效 // // Created by beyond on 14-9-10. // Copyright (c) 2014年 com.beyond. All rights reserved. // 音效工具类,提供快速播放和清除销毁音效功能 #import <Foundation/Foundation.h> @interface AudioEffectTool : NSObject // 播放音效,参数:音效文件名 如:@"go.wav" + (void)playSound:(NSString *)filename; // 清除销毁音效,参数:音效文件名 如:@"go.wav" + (void)disposeSound:(NSString *)filename; // 清除销毁所有音效 + (void)disposeAllSound; @end
//
// AudioEffectTool.m
// 33_音效
//
// Created by beyond on 14-9-10.
// Copyright (c) 2014年 com.beyond. All rights reserved.
// 音效工具类,提供快速播放和清除音效功能
#import "AudioEffectTool.h"
// 音效播放,必须导入
#import <AVFoundation/AVFoundation.h>
@implementation AudioEffectTool
// 字典: filename作为key, soundID作为value
// 存放所有的生成的 音效ID
static NSMutableDictionary *_soundIDDict;
#pragma mark - 生命周期
// 初始化
+ (void)initialize
{
// 初始化,可变字典,用于存放所有的 生成的 音频ID
_soundIDDict = [NSMutableDictionary dictionary];
}
#pragma mark - 公开方法
// 播放音效,参数:音效文件名 如:@"go.wav"
+ (void)playSound:(NSString *)filename
{
// 0.robust判断
if (!filename) return;
// 1.先从字典中取出soundID,将取出的对象转成unsigned_long
SystemSoundID soundID = [_soundIDDict[filename] unsignedLongValue];
// 2.如果是第一次播放,才创建
if (!soundID) {
// 2.1 得到文件的url
NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:nil];
// 2.2 如果音效文件并不存在,直接返回
if (!url) return;
// 2.3 加载音效文件,并且创建音效ID,存入传进来的地址中,
// NSURL 转成CFURLRef 需要桥接
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
// 2.4 最后将该文件名,对应的音效ID,包装成对象,放入字典
_soundIDDict[filename] = @(soundID);
}
// 3.最后,开始播放 音效ID
AudioServicesPlaySystemSound(soundID);
}
// 清除销毁音效,参数:音效文件名 如:@"go.wav"
+ (void)disposeSound:(NSString *)filename
{
// 0.robust判断
if (!filename) return;
// 1.先从字典中取出soundID,将取出的对象转成unsigned_long
SystemSoundID soundID = [_soundIDDict[filename] unsignedLongValue];
// 2.如果soundID存在,才清除销毁掉,释放出内存,并记得从字典中移除
if (soundID) {
// 销毁音效ID
AudioServicesDisposeSystemSoundID(soundID);
// 从字典中移除
[_soundIDDict removeObjectForKey:filename];
}
}
// 清除销毁所有音效
+ (void)disposeAllSound
{
// 遍历,并执行清除
for (id obj in [_soundIDDict allValues]) {
SystemSoundID soundID = [obj unsignedLongValue];
// 2.如果soundID存在,才清除销毁掉,释放出内存,并记得从字典中移除
if (soundID) {
// 销毁音效ID
AudioServicesDisposeSystemSoundID(soundID);
}
}
// 最后清空字典
[_soundIDDict removeAllObjects];
}
@end
控制器
//
// BeyondViewController.m
// 33_音效
//
// Created by beyond on 14-9-10.
// Copyright (c) 2014年 com.beyond. All rights reserved.
// 音效播放demo,触摸随机播放音效
#import "BeyondViewController.h"
// 导入音效工具类,负责播放和清除音效
#import "AudioEffectTool.h"
@interface BeyondViewController ()
@end
@implementation BeyondViewController
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
[AudioEffectTool disposeAllSound];
}
#pragma mark - touch
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSString *filename = [NSString stringWithFormat:@"m_%02d.wav", arc4random_uniform(14) + 3];
[AudioEffectTool playSound:filename];
}
@end
原文地址:http://blog.csdn.net/pre_eminent/article/details/39181239