如何制作 SystemSoundID 数组?使用 AudioToolbox 框架
Posted
技术标签:
【中文标题】如何制作 SystemSoundID 数组?使用 AudioToolbox 框架【英文标题】:How do I make an array of SystemSoundIDs? Using AudioToolbox framework 【发布时间】:2010-08-29 00:01:58 【问题描述】:我习惯于创造这样的声音:
NSString *explosionsoundpath = [[NSBundle mainBundle] pathForResource:@"explosion" ofType:@"caf"];
CFURLRef explosionurl = (CFURLRef ) [NSURL fileURLWithPath:explosionsoundpath];
AudioservicesCreateSystemSoundID (explosionurl, &explosion1a);
AudioServicesCreateSystemSoundID (explosionurl, &explosion1b);
其中explosion1a 和explosion1b 是在.h 文件中声明的实例变量:
SystemSoundID explosion1a;
每当我尝试在这样的数组中进行此过程时
NSString *plasmasoundpath = [[NSBundle mainBundle] pathForResource:@"plasmasound" ofType:@"caf"];
CFURLRef plasmaurl = (CFURLRef ) [NSURL fileURLWithPath:plasmasoundpath];
SystemSoundID plasmalaunch1;
AudioServicesCreateSystemSoundID (plasmaurl, &plasmalaunch1);
[self.plasmasounds addObject:plasmalaunch1];
我收到警告:
"Passing argument 1 of addObject makes pointer from integer without a cast.
如果我在 addObject 参数中的 Plaslaunch1 之前放置 & 符号,我会得到一个
incompatible pointer type warning.
我正在尝试创建一组音效,以后可以通过调用来播放:
SystemSoundID sound = [self.plasmasounds objectAtIndex:i];
AudioServicesPlaySystemSound(sound);
感谢有关如何使这项工作(或解决此问题的更好方法)的建议!
【问题讨论】:
为什么这是一个社区维基? 【参考方案1】:SystemSoundID 是一个整数值,而不是一个对象;指向数字的指针不是指向对象的指针。
您可以先将数值封装在对象中,然后再将其存储在 NSArray 中,然后再从对象中移除 ID 号以播放声音。或者您可以将整数值存储在 C 数组而不是 NSArray 中。
【讨论】:
感谢您的回复。你能举一个例子来说明如何做这些吗?对于后者,我猜我会采用 intValue?我不知道第一个怎么做。 首先,您可以使用 NSNumber numberWithInt: 方法将 int 值转换为对象,并使用 NSNumber intValue 方法从对象中获取数字 ID。对于后者(C 数组),你不需要做任何事情,因为你已经有了一个 int 值。 出于语义原因,我会使用NSValue
而不是 NSNumber
- 是的,SystemSoundID 是 int
的 typedef
,但它名义上不是整数,它是对数据。不过这都是学术性的,任何一门课都可以。
其实这里是一个无符号长.. 另一个使用 NSValue 的理由【参考方案2】:
这是旧的,但仍然相关。最好的解决方案是使用带有 SystemSoundID 参数的构造函数创建一个类。这允许最大的灵活性。现在您有了一个可以轻松添加到 NSArray 或任何其他集合类的对象。
#import <Foundation/Foundation.h>
@import AudioToolbox;
@interface SATSound : NSObject
@property (nonatomic)SystemSoundID id;
- (id)initWithSoundID:(SystemSoundID)id;
@end
/////
#import "SATSound.h"
@implementation SATSound
- (id)initWithSoundID:(SystemSoundID)id
if (self = [super init])
_id = id;
return self;
只需实例化这个类,将您的 SystemSoundID 传递给它,将对象/实例添加到数组中,然后您就可以轻松提取值,而不必担心类型转换。您还可以添加任何其他可能派上用场的属性,例如声音文件的名称。
【讨论】:
以上是关于如何制作 SystemSoundID 数组?使用 AudioToolbox 框架的主要内容,如果未能解决你的问题,请参考以下文章
指向整数转换的不兼容指针将“SystemSoundID”传递给“SystemSoundID”类型的参数