iPhone/iPadアプリで効果音を鳴らす方法をまとめました。1つのAVAudioPlayerで音声を鳴らそうとすると、前の音が鳴り終わる前に次の音を鳴らせません。これは効果音を鳴らす上で致命的な問題です。そこで、音声を鳴らすたびに新しいAVAudioPlayerを生成し、鳴り終わったタイミングでプレイヤーを削除するようにしました。
1. プロジェクトにAVFoundation.frameworkを追加する。
Linked frameworks and Librariesの左下の+から、AVFoundation.frameworkを追加します。
2. ヘッダを修正
効果音を鳴らすクラスのヘッダにライブラリをインポートします。複数の音声が同時に鳴ることを考慮して、プレイヤー保持用の、NSMutableArrayを作成します。音声再生終了時の処理用にAVAudioPlayerDelegateプロトコルを実装します。
//ライブラリをインポートします。
#import <AVFoundation/AVFoundation.h>
@interface ****ViewController : UIViewController
<AVAudioPlayerDelegate> //音声再生終了時の処理
{
//再生中のプレイヤーを保持
NSMutableArray *playerArray;
}
#import <AVFoundation/AVFoundation.h>
@interface ****ViewController : UIViewController
<AVAudioPlayerDelegate> //音声再生終了時の処理
{
//再生中のプレイヤーを保持
NSMutableArray *playerArray;
}
3. ソースコードを記述
ちゃちゃっと書きます。
-(id)init{
self = [super init];
if(self){
playerArray = [[NSMutableArray alloc] init];
}
return self;
}
//再生終了時の処理
-(void)audioPlayerDidFinishPlaying: (AVAudioPlayer *)player successfully:(BOOL)flag{
[playerArray removeObject:player];
}
//音声を鳴らす
-(void)playSound:(NSString *)file{
AVAudioPlayer * newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:file ofType:@""]] error:nil];
[newPlayer play];
//playerArrayに登録しておかないと参照カウンタが0になった時点でオブジェクトが破棄されます。
[playerArray addObject:newPlayer];
//再生終了時にaudioPlayerDidFinishPlaying:successfully:を実行
newPlayer.delegate = self;
}
-(void)someFunction{
//音を再生する
[self playSound:@"sound.caf"];
}
self = [super init];
if(self){
playerArray = [[NSMutableArray alloc] init];
}
return self;
}
//再生終了時の処理
-(void)audioPlayerDidFinishPlaying: (AVAudioPlayer *)player successfully:(BOOL)flag{
[playerArray removeObject:player];
}
//音声を鳴らす
-(void)playSound:(NSString *)file{
AVAudioPlayer * newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:file ofType:@""]] error:nil];
[newPlayer play];
//playerArrayに登録しておかないと参照カウンタが0になった時点でオブジェクトが破棄されます。
[playerArray addObject:newPlayer];
//再生終了時にaudioPlayerDidFinishPlaying:successfully:を実行
newPlayer.delegate = self;
}
-(void)someFunction{
//音を再生する
[self playSound:@"sound.caf"];
}