AudioService - 短いファイルを再生する

数秒の短いファイルを再生したいという場合、AudioToolboxフレームワークのAudioServiceという仕組みを使うと簡単にできます。

使い方は簡単。

1. 最初に再生したいファイルを登録する

AudioServicesCreateSystemSoundID( CFURLRef URL, SystemSoundID* outSystemSoundID);

ファイルパスをCFURLRefのかたちでわたす。SystemSoundIDがかえってくる。

2. 再生する

1で得られたSystemSoundIDを使って再生。

AudioServicesPlaySystemSound(サウンドID);

同じように、
AudioServicesPlayAlertSound(サウンドID);
だと、アラート音と同時に再生されます。


3. 再生が終わったら、ファイルの登録を解除する

AudioServicesDisposeSystemSoundID(サウンドID);


これだけ!

なお、AudioServiceはシステムの「設定」-> 「一般」 -> 「サウンド効果」が、ヘッドフォン、もしくは両方になっていないと、音が一切出ません!! 注意してください!

ちなみに、より長いファイルを再生する場合には、AudioQueueの仕組みを使う必要があります! またAudioServiceではボリュームのコントロールができません。基本的にはビープ的な警告音やクリック音などの操作音をならしたいときに使う仕組みだと考えるのがよいでしょう。




さらに....

iTunesライブラリにアクセスできないという話のアップデート
http://d.hatena.ne.jp/iphone_dev/20080619/1213907561

iPhone OSのファイルシステムを眺めていて見つけました! PrivateFrameworkの中に、MusicLibrary.frameworkというフレームワークがあります。どうやらこれが、iPhone内の音楽ライブラリの管理を司るフレームワークのようです。

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk/System/Library/PrivateFrameworks

Private Frameworkなのでヘッダが提供されていません。そこで、class-dump(http://www.codethecode.com/projects/class-dump/)を使ってヘッダを生成してみました。その結果、MusicLibraryというクラスのほかに, MLQuery, MLTrackといったクラスがあることが判明しました。名前からしてそれぞれ、曲の検索と曲のメタデータを扱うクラスのようです。

Cocoa Devに、MLQueryをつかった曲のリストの取得の方法がかかれています。
http://www.cocoadev.com/index.pl?MLQuery


MusicLibrary *library = [MusicLibrary sharedMusicLibrary]; // MLQueryを使う前に必ず呼ぶ必要あり

MLQuery* query = [[MLQuery alloc] init];
int numberOfTracks = [query countOfEntities];
int i;

for ( i = 0; i < numberOfTracks; ++i )
{
MLTrack* track = [query entityAtIndex:i];
NSLog(@"Artist: %@, Title: %@, file path: %@", [track artist], [track title], [track path]);
}

実際にこの方法を試してみたのですが、いまのところまだうまくいっていません。まだなにか隠されたポイントがあるのでしょうか。
もう少し調べてみるつもりです。