如何创建SystemSoundIDs数组?使用AudioToolbox框架

时间:2010-08-29 00:01:59

标签: iphone objective-c xcode audio audiotoolbox

我习惯于创造这样的声音:

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参数中,plasmalaunch1之前的符号我得到了一个

incompatible pointer type warning.

我正在尝试创建一个声音效果数组,我稍后可以通过调用它来播放:

SystemSoundID sound = [self.plasmasounds objectAtIndex:i];
AudioServicesPlaySystemSound(sound);

关于如何使这项工作(或更好的方法来解决这个问题)的建议表示赞赏!

2 个答案:

答案 0 :(得分:2)

SystemSoundID是一个整数值,而不是一个对象;并且指向数字的指针不是指向对象的指针。

您可以先将数值封装在对象中,然后再将其存储在NSArray中,然后再从对象中删除ID号以播放声音。或者您可以将整数值存储在C数组中而不是NSArray中。

答案 1 :(得分:1)

这是旧的,但仍然相关。最好的解决方案是使用带有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,将对象/实例添加到数组中,然后您可以轻松地提取值,而不必担心类型转换。您还可以添加可能派上用场的任何其他属性,例如声音文件的名称。