2010年4月21日水曜日

iPhoneの標準カメラアプリのシャッター音の鳴り方と同様にアプリで効果音を鳴らすには?

さっき書いた記事で、iPhoneの標準カメラアプリのシャッター音の扱いは盗撮対策としては不十分であることがわかったが、せめて標準カメラアプリのシャッター音と同様に効果音を鳴らすようにすることは抑止につながる。
琴線探査: iPhoneの標準カメラアプリのシャッター音の鳴り方を調べる

では、どのように鳴らせばよいのか?

//AudioSession初期化
AudioSessionInitialize(NULL, NULL, NULL, NULL);
 
//AudioSessionカテゴリーをMediaPlaybackにセット(サイレントモードに従わない、iPodと共存不可)
UInt32 ssnCate = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(ssnCate), &ssnCate);

//MediaPlaybackカテゴリーを上書きしてiPodとの再生を共存させる
UInt32 mixWithOthers = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(mixWithOthers), &mixWithOthers);

//AudioSession有効化
AudioSessionSetActive(YES);

//AVAudioPlayerの初期化と音再生  
NSError *errPlayer;  
NSBundle *bundle = [NSBundle mainBundle];  
NSString *path = [bundle pathForResource:@"shutter" ofType:@"wav"];  
NSURL *url = [NSURL fileURLWithPath:path];  
AVAudioPlayer player = [AVAudioPlayer alloc];  
[player initWithContentsOfURL:url error:&errPlayer];  
if (errPlayer) {  
 NSLog(@"AVAudioPlayer初期化失敗:%@\n", errPlayer);  
} else {
 [player prepareToPlay];
 [player play];
}

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

ポイントは
・AudioSessionを使うこと
・AudioSessionのカテゴリーとしてMediaPlaybackを使うこと
・MediaPlaybackのカテゴリーを上書きしてiPodとの共存を可能にすること

同様な動作が可能なカテゴリーとしてPlayAndRecordがあるが、このカテゴリーを設定した場合はiPodの音が極端に小さくなることがわかった。

また、AudioToolboxのAudioServicesPlaySystemSound()で同様にできればよいのだが、これはAudioSessionの設定が反映されないため、簡単に音を再生するにはAVFoundationを使うのが良いとわかった。

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