SoundManager 1.4.2

SoundManager 1.4.2

测试已测试
Lang语言 Obj-CObjective C
许可 zlib
发布上次发布2014年12月

Nick Lockwood 维护。



  • 作者:
  • Nick Lockwood

目的

SoundManager 是一个用于在 iOS 或 Mac 应用中播放声音和音乐的简单类。

支持的操作系统和 SDK 版本

  • 支持的构建目标 - iOS 8.0 / Mac OS 10.8 (Xcode 6.0, Apple LLVM 编译器 6.0)
  • 最早支持的部署目标 - iOS 6.0 / Mac OS 10.7
  • 最早兼容的部署目标 - iOS 4.3 / Mac OS 10.6 (64 位)

注意:'支持' 意味着库已与该版本进行了测试。'兼容' 意味着库应在本 iOS 版本上运行(即它不依赖于任何不可用的 SDK 功能),但不再进行兼容性测试,可能需要调整或错误修复才能正确运行。

ARC 兼容性

从版本 1.4 开始,SoundManager 需要 ARC。如果您想在非 ARC 项中使用 SoundManager,只需将 -fobjc-arc 编译器标志添加到 SoundManager.m 类中即可。为此,请转到目标设置中的构建阶段选项卡,打开编译源代码组,双击列表中的 iRate.m,在弹出窗口中键入 -fobjc-arc。

如果您想将整个项目转换为 ARC,请注释掉 SoundManager.m 中的 #error 行,然后运行 Xcode 中的编辑 > 重构 > 转换到 Objective-C ARC... 工具,并确保要使用 ARC 的所有文件都已勾选(包括 SoundManager.m)。

安装

要在应用中使用 SoundManager 类,只需将类文件拖到项目中。对于 iOS 应用,或部署目标为 10.7(狮子)或更高的 Mac OS 应用,您还需要添加 AVFoundation 框架。

SoundManager 包定义了两个类,下面的 SoundManager 类本身,以及用于围绕正在播放的每个声音文件包装的 Sound 类。Sound 类可以使用 SoundManager 类直接或间接使用。

声音属性

@property (nonatomic, readonly, copy) NSString *name;

声音的名称。这既可以是传递给 soundNamed: 构造方法的名字,也可以是声音文件的最后一个路径组件。

@property (nonatomic, readonly, strong) NSURL *URL;

声音文件的绝对 URL。

@property (nonatomic, readonly) NSTimeInterval duration;

声音文件的持续时间(以秒为单位)。

@property (nonatomic, assign) NSTimeInterval currentTime;

当前音频文件的时间偏移量(以秒为单位)。此值可读写,因此您可以将它设置为零以倒回音频。

@property (nonatomic, readonly, getter = isPlaying) BOOL playing;

如果音频正在播放返回YES,如果没有播放返回NO(只读)。

@property (nonatomic, assign, getter = isLooping) BOOL looping;

如果音频设置为循环返回YES,如果没有设置为循环返回NO。

@property (nonatomic, copy) SoundCompletionHandler completionHandler;

一个回调块,当音频播放完成或停止时将被调用。在任何给定的Sound实例上,只能设置一个completionHandler块,但如果需要多个对象跟踪音频的状态,则可以通过添加对SoundDidFinishPlayingNotification通知的观察者来实现。

@property (nonatomic, assign) float baseVolume;

音频的最大音量。有些声音比其他声音响亮,尝试在代码中逐个管理应用中不同声音的音量可能会很烦人。baseVolume 属性允许您在创建时均衡不同声音的音量,然后您可以从那个点开始一致地调整它们的音量。

@property (nonatomic, assign) float volume;

音频的音量。这是通过baseVolume属性乘以以获得实际音量。默认值为1.0(最大)。

@property (nonatomic, assign) float pan;

文件左右立体声平衡。值范围从-1.0到1.0,可用于在空间中改变声音的位置。在Mac OS 10.6上没有效果。

音频方法

+ (Sound *)soundNamed:(NSString *)name;

这是一个方便的简写构造器方法,它基于应用包中文件的名字来返回一个音频对象。如果省略文件扩展名,则假定是.caf文件。如果您为此方法传递一个完全合格的路径,则它 behaves 与 soundWithContentsOfFile: 相同。

+ (Sound *)soundWithContentsOfFile:(NSString *)path;
- (Sound *)initWithContentsOfFile:(NSString *)path;
+ (Sound *)soundWithContentsOfURL:(NSURL *)URL;
- (Sound *)initWithContentsOfURL:(NSURL *)URL;

这些方法从文件路径或URL创建一个新的Sound实例。

- (void)fadeTo:(float)volume duration:(NSTimeInterval)duration;

此方法从当前音量淡入到指定音量,持续指定的时间。请注意,此方法不会播放声音,因此您需要在调用此方法之前调用play,除非声音正在播放。

- (void)fadeIn:(NSTimeInterval)duration;

在指定的持续时间将音量从0.0淡出到1.0。如果音量已经为零,则音量将设置为零。有关未播放的声音的注意事项,请参阅上面的免责声明。

- (void)fadeOut:(NSTimeInterval)duration;

从当前音量淡出到0.0,持续指定的时间。当音量达到零时,将自动调用声音的停止方法。

- (void)play;

播放声音。如果声音已经在播放,则没有效果。

- (void)stop;

停止声音。如果没有播放,则没有效果。停止声音不会重置currentTime,因此播放已停止的声音将从中断点继续播放。

SoundManager 属性

@property (nonatomic, readonly, getter = isPlayingMusic) BOOL playingMusic;

这是一个只读属性,报告SoundManager当前是否正在播放音乐。

@property (nonatomic, assign) BOOL allowsBackgroundMusic;

此属性用于控制iPhone上的音频会话,以允许在后台播放iPod音乐。它默认为NO,因此在进行任何声音或音乐播放之前,如果不想中断iPod音乐,则应将其设置为YES。目前在Mac OS上没有效果。

@property (nonatomic, assign) float soundVolume;

设置音量。影响所有当前播放的声音以及随后播放的声音。应在此范围内0 - 1。

@property (nonatomic, assign) float musicVolume;

设置音乐音量。影响当前播放的音乐曲目以及随后播放的音乐曲目。应在此范围内0 - 1。

@property (nonatomic, assign) NSTimeInterval musicFadeDuration;

音乐曲目淡入/淡出和交叉淡入淡出的持续时间(默认为1秒)。

@property (nonatomic, assign) NSTimeInterval soundFadeDuration;

调用stopSound时声音的淡出时间(默认为1秒)。

SoundManager 方法

+ (SoundManager *)sharedManager;

这个类方法返回SoundManager共享单例实例。

- (void)prepareToPlay;

prepareToPlay 方法预加载您应用程序包中的一个随机声音,这初始化了音频播放。它应该在您尝试播放任何音频之前调用,理想情况下在启动过程中,以消除首次播放声音或音乐曲目时的延迟。注意: 这只会在您的应用程序包根目录中至少包含一个声音文件时生效。如果所有声音文件都包含在文件夹中,请考虑添加一个额外的短而无声的声音文件以便初始化,或者使用 prepareToPlayWithSound: 方法。

- (void)prepareToPlayWithSound:(id)soundOrName;

如果声音不在应用程序包的根目录中(甚至在包中),则标准 prepareToPlay 方法将不起作用。在这种情况下,您可以使用 prepareToPlayWithSound: 方法并指定用于初始化的特定声音。参数可以是文件名、路径(相对于或绝对)或 Sound 类的实例。

- (void)playSound:(id)soundOrName looping:(BOOL)looping fadeIn:(BOOL)fadeIn;
- (void)playSound:(id)soundOrName looping:(BOOL)looping;
- (void)playSound:(id)soundOrName;

播放方法将播放一个声音。参数可以是一个之前创建的 Sound 实例,或者一个要加载的声音文件的名称或路径。您可以在名称中包含文件扩展名,或者省略它,在这种情况下,SoundManager 将查找具有 .caf 文件扩展名的匹配文件。如果循环参数为 YES,则声音将继续播放,直到调用 stopSound: 为止。如果 fadeIn 参数为 YES,则声音将以 SoundManager 类的 soundFadeDuration 属性指定的时间从 0 到全音量渐入。如果省略,则循环和渐入都默认为 NO。

- (void)stopSound:(id)soundOrName fadeOut:(BOOL)fadeOut;
- (void)stopSound:(id)soundOrName;

此方法将立即停止声音,或根据 fadeOut 参数(默认为 YES)以 soundFadeDuration 指定的时间内渐出。声音或名称参数可以是一个之前创建的 Sound 实例,或一个名称或路径。如果有多个声音实例正在播放,则它们都将被停止。

- (void)stopAllSounds:(BOOL)fadeOut;
- (void)stopAllSounds;

此方法将停止和/或淡出所有正在播放的声音,但不会停止音乐。这相当于为正在播放的每个声音调用 stopSound

- (void)playMusic:(id)soundOrName looping:(BOOL)looping fadeIn:(BOOL)fadeIn;
- (void)playMusic:(id)soundOrName looping:(BOOL)looping;
- (void)playMusic:(id)soundOrName;

此方法播放音乐曲目。如果 fadeIn 参数为 YES,音乐将以 musicVolume 属性指定的音量从静音渐入,渐入时间为 musicFadeDuration 指定的时间(如果省略,则默认为 YES)。声音管理器一次只允许播放一个音乐曲目,因此如果正在播放一个现有曲目,它将被渐出。如果循环参数为 YES,音乐将继续播放,直到调用 stopMusic(如果省略,则默认为 YES)。

- (void)stopMusic:(BOOL)fadeOut;
- (void)stopMusic;

这将停止和/或以 musicFadeDuration 指定的时间内淡出现有播放的音乐曲目。

通知

SoundDidFinishPlayingNotification

每当声音播放结束(由于自然结束或调用停止方法)时,都会触发此通知(通过 NSNotificationCenter)。通知对象是 Sound 类的一个实例,SoundManager 使用它来内部播放声音和音乐文件。您可以通过访问 Sound 类的 name 属性来找出哪个声音已结束。

支持的格式

iPhone 对播放哪些声音非常挑剔。为了获得最佳效果,请使用 .caf 文件,您可以使用 afconvert 命令行工具生成 。以下是一些常见的配置

用于背景音乐(单声道)

/usr/bin/afconvert -f caff -d aac -c 1 {input_file_name} {output_file_name}.caf

用于背景音乐(立体声)

/usr/bin/afconvert -f caff -d aac {input_file_name} {output_file_name}.caf

用于声音效果(单声道)

/usr/bin/afconvert -f caff -d ima4 -c 1 {input_file_name} {output_file_name}.caf

用于声音效果(立体声)

/usr/bin/afconvert -f caff -d ima4 {input_file_name} {output_file_name}.caf

发布说明

版本 1.4.2

  • 修复了 Xcode 6 中的导入错误

版本 1.4.1

  • SoundCompletionHandler 块不再在声音正确播放完成时返回 NO
  • 现在符合 -Weverything 警告级别

版本 1.4

  • 添加了 duration 和 currentTime 属性
  • 添加了 pan 属性
  • 修复了在枚举过程中修改数组的崩溃
  • stopMusic 方法现在尊重 fadeOut 属性
  • 现在需要 ARC
  • 现在需要在 Mac OS 上使用 64 位处理器
  • 现在符合 -Wall 和 -Wextra 警告级别
  • 添加了 podspec

版本 1.3.1

  • 对于目标部署为 Mac OS 10.7(狮子)或更高版本的 Mac OS 项目,SoundManager 现在使用 AVAudioPlayer 而不是 NSSound

版本 1.3

  • 为 Sound 类添加了基于 block 的完成处理回调
  • Sound 管理器现在可以通过名称或对象引用播放声音
  • 扩展了 SoundManager 类,增加了更多的渐隐选项
  • 现在可以预加载不在根应用程序包中的声音

版本 1.2.1

  • 如果项目中不包含声音文件,prepareToPlay 方法不再崩溃

版本 1.2

  • 添加了对 ARC 编译目标的自动支持
  • 现在需要 Apple LLVM 3.0 编译器目标
  • playing、looping 和 playingMusic 属性现在使用更标准的获取名称
  • Sound 类初始化器重构以匹配 iOS 习惯
  • Sound 名称方法现在返回包含文件扩展名的名称

版本 1.1.3

  • 修复了只与 .caf 文件一起工作时预加载才有效的问题
  • FILE_EXTENSION 重命名为 DEFAULT_FILE_EXTENSION 以避免混淆。

版本 1.1.2

  • 修复了由于在释放后访问声音而偶尔崩溃的问题
  • 当传递一个不存在的声音文件而不是崩溃时,声音管理器现在将在控制台日志中记录一个警告
  • 声音名称现在可以包括目录分隔符。这意味着可以使用标准播放函数播放资源文件夹子文件夹中的声音。

版本 1.1.1

  • 修复了音乐渐隐的虫虫问题
  • 将默认音乐渐隐/交叉渐隐持续时间更改为 1 秒
  • 在 Sound 类上公开了 looping 属性
  • 更改了文档和许可协议为 markdown 格式

版本 1.1

  • 向播放方法添加了 looping 参数
  • 添加了 stopSound 和 stopAllSounds 方法
  • 实现 Mac OS 的预加载

版本 1.0

  • 初始版本