AudioServicesを使って効果音を鳴らす便利クラス

皆さん効果音鳴らしてますかー?
私はアプリの効果音はぜんぶ消して使っちゃう派なんですけど、
世の中には効果音が無いと操作したか分かんないよ派もいるんですよね。

さて、そんな他派の為に効果音を鳴らすんですけど、iOSには色々サウンドのAPIがあってどれを使えば良いのか。。
5秒以下のサウンドに限定されますが、とりあえず簡単に使えそうなAudioServicesを使ってみます。

基本的には
1.SystemSoundID を取得

SystemSoundID soundIdRing;
NSURL* url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"ring" ofType:@"wav"]];
AudioServicesCreateSystemSoundID((CFURLRef)url, &soundIdRing);

2.AudioServicesPlaySystemSound を呼ぶ事によりサウンドを再生

AudioServicesPlaySystemSound(soundIdRing); 

3.使い終わったら AudioServicesDisposeSystemSoundID でメモリの解放

AudioServicesDisposeSystemSoundID(soundIdRing); 

でOK
こんなお手軽APIなのですが、効果音ってのは数種類あるものなので管理が面倒です。
なので、私は下記のようなクラスで使ってます。

ヘッダー部


#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioServices.h>

@interface SoundManager : NSObject

-(void)addSoundEffect:(int)sound_no url:(NSURL*)url;
-(void)playSoundEffect:(int)sound_no;

@end

実装部


#import "SoundManager.h"

@interfaceSoundManager ()

//登録されたサウンドのSystemSoundIDを保存する
@property (nonatomic,retain) NSMutableDictionary* sound_dir;

@end

@implementation SoundManager

-(id)init
{
    self = [super init];
    if (self)
    {
        self.sound_dir = [[[NSMutableDictionary alloc]init]autorelease];    
    }
    return self;
}

-(void)dealloc
{
    if (_sound_dir)
    {
        for(NSNumber* box in _sound_dir)
        {
            SystemSoundID soundid = box.unsignedLongValue;
            AudioServicesDisposeSystemSoundID (soundid);
        }
        
        [_sound_dir removeAllObjects];
    }
        
    [_sound_dir release];

    [super dealloc];
}


-(void)addSoundEffect:(int)sound_no url:(NSURL*)url
{
    SystemSoundID soundid;
    
    AudioServicesCreateSystemSoundID ((CFURLRef)url, &soundid);
    
    NSNumber *box = [NSNumber numberWithUnsignedLong:soundid];
    
    [self.sound_dir setObject:box forKey:[NSString stringWithFormat:@"%d",sound_no]];
    
}


-(void)playSoundEffect:(int)sound_no
{
    NSNumber* box = [self.sound_dir objectForKey:[NSString stringWithFormat:@"%d",sound_no]];
    if (box)
    {
        SystemSoundID soundid = box.unsignedLongValue;
        AudioServicesPlaySystemSound (soundid);
    }
}

使い方はこんな感じ


//インスタンスを準備して
self.soundManager = [[[SoundManager alloc]init]autorelease];


//効果音の登録
NSURL *url;
url = [[NSBundle mainBundle] URLForResource:@"ring" withExtension:@"wav"];
[soundManager addSoundEffect:1 url:url];

 url = [[NSBundle mainBundle] URLForResource:@"bang" withExtension:@"wav"];
[soundManager addSoundEffect:2 url:url];


//再生
[self.soundManager playSoundEffect:1];

1とか2とか指定している部分はenumにするといいですよ。

以上

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です