2010年4月12日月曜日

iPhoneアプリで簡単に効果音などを再生するには?(AudioToolbox編)

先日iPhoneで音を簡単に鳴らす方法を書いた。
琴線探査: iPhoneアプリで簡単に効果音などを再生するには?

これはAVAudioPlayerを使う方法だったのだが、その後一つ問題があることがわかった。

iPodをバックグラウンドで再生している状態でAVAudioPlayerを使って音を再生すると、iPodの音が自動的にフェードアウトして停止してしまうのだ。

これが都合がよい場合もあるが、そうでない場合もある。今回は都合が悪かった。そこで、AVAudioPlayerと同様に簡単なAudioToolboxを使う方法に変更した。

例えばこのようにする。

/**
 *
 * システムサウンド再生完了時のコールバック用関数(Cスタイル)
 * (このコールバックを使うメソッドの前に定義を書く必要がある。
 *  ヘッダーに関数の登録をする必要は無いようだ)
 *
 */
static void onSoundFinished(SystemSoundID sndId, void *info) {
 
 //サウンドIDの割り当てを解除
 NSLog(@"システムサウンド割り当て解除");
 AudioServicesDisposeSystemSoundID(sndId);
 
}


/**
 *
 * サウンド再生ボタンタッチアップ時
 *
 */
- (IBAction)onTouchUpInsideBtnPlaySound {

  //サウンドのURLを構築
  NSBundle *bundle = [NSBundle mainBundle];
  NSString *path = [bundle pathForResource:@"sound" ofType:@"wav"];
  NSURL *url = [NSURL fileURLWithPath:path];

  //システムサウンドIDの割り当て
  SystemSoundID sndId;
  OSStatus err = AudioServicesCreateSystemSoundID((CFURLRef)url, &sndId);
  if (err) {
    NSLog(@"システムサウンド割り当て失敗:%@\n", err);
  } else {

    //サウンド再生完了時のコールバックを追加
    AudioServicesAddSystemSoundCompletion(sndId, NULL, NULL, onSoundFinished, NULL);
 
    //サウンド再生
    AudioServicesPlaySystemSound(sndId);

  }
  
}

このコードをコンパイルするには、AudioToolbox.frameworkをリンクして、ヘッダーに「AudioToolbox/AudioToolbox.h」をimportしておく必要がある。

iPodの音をフェードアウトさせずに音を鳴らすことができた。