0

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

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);

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

4

2 回答 2

2

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

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

于 2010-08-29T01:24:05.197 回答
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 传递给它,将对象/实例添加到数组中,然后您就可以轻松提取值,而不必担心类型转换。您还可以添加任何其他可能派上用场的属性,例如声音文件的名称。

于 2014-11-02T16:01:50.130 回答