如何制作 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 是 inttypedef,但它名义上不是整数,它是对数据。不过这都是学术性的,任何一门课都可以。 其实这里是一个无符号长.. 另一个使用 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”类型的参数

SystemSoundID 有时会随设备音量而变化

如何使用其他数组的内容制作新数组或数组?

如何使用 PHP 制作大数组(26000 x 26000)?

如何在 QT 中制作二维数组?

如何通过使用 ByteBuffer 查看标头偏移量来制作字节数组?