Как мне сделать массив SystemSoundID?Использование инфраструктуры AudioToolbox - PullRequest
0 голосов
/ 29 августа 2010

Я привык создавать такие звуки:

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.

Если я поставлю символ & перед plasmalaunch1 в аргументе addObject, я получу

incompatible pointer type warning.

Я пытаюсь создать массив звуковых эффектов, которые позже можно будет воспроизвести, вызвав:

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

Советы о том, как заставить эту работу (или лучший способ решить эту проблему) приветствуются!

Ответы [ 2 ]

2 голосов
/ 29 августа 2010

SystemSoundID является целочисленным значением, а не объектом;и указатель на число не является указателем на объект.

Вы можете инкапсулировать числовое значение в объекте перед сохранением его в NSArray, а затем позже удалить идентификационный номер из объекта для воспроизведения звука.,Или вы можете сохранить целочисленное значение в массиве C вместо NSArray.

1 голос
/ 02 ноября 2014

Это старый, но все еще актуальный. Лучшее решение - создать класс с конструктором, который принимает аргумент 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, добавьте объект / экземпляр в массив, и тогда вы сможете легко извлекать значения и не беспокоиться о преобразованиях типов. Вы также можете добавить любые другие свойства, которые могут пригодиться, например, имя звукового файла.

...