DirectMusicメモ
DirectMusicで楽々プログラミング
.wavファイルをDirectSoundで再生する仕組みを作っていたのですが、再生時の頭に「ブツッ」とノイズが入る。サウンドデータの頭にはちょっと無音部分を入れているし、他のアプリで再生してもノイズは出ない。どうやら再生の仕方に何か問題(もしくはTips)があるのでは?というところまでは考えられたのだが、それをじっくり追いかけたり勉強する時間がない。どうしようかと一瞬悩んで出した結論が、「もしかしたらDirectMusic経由なら、多分そのあたりの処理をやさしい天才プログラマさんが処理なさっているのでは?」と思い、試してみた。
結果は成功!
軽く再生するだけだし、録音部分はDirectSoundで実装済みだし、とりあえずというかほぼ問題なしでしょ、となった。
DirectMusicが開いたファイルを手放さない
しかし、別の問題が発生。
DirectMusicで再生用に開いたファイルをUnloadしてから、DirectSound側で開こうとするとすでに開かれているというエラーが出てしまう。どうやらDirectMusicが手放してくれていない様子。
LoadObjectFromFile で開いたファイルをどうすればいいのか?そこから IDirectMusicSegment8 に読み込んだあと、それを Unload するだけじゃダメなのか?
でも CloseFile みたいなメソッドも見つからないし、、とあれこれ悩んだ結果、内部でデータをキャッシュしてるっぽいことに気づいた。
DirectMusicのファイルキャッシュ対策
つまり、IDirectMusicLoader8のファイルキャッシュ対策を行えば、データを使ったあとにファイルを解放することが可能になります。
方法としては2つ。キャッシュ機能そのものを無効にしておく方法と、キャッシュを消すメソッドを呼ぶ方法。具体的には以下のようなメソッドを呼び出せばOK。
// キャッシュ機能を無効にする方法 1. HRESULT hr = mpLoader->EnableCache( CLSID_DirectMusicSegment, FALSE ); // キャッシュ機能を無効にする方法 2. HRESULT hr = mpLoader->EnableCache( GUID_DirectMusicAllTypes, FALSE ); // キャッシュをクリアする方法 1. HRESULT hr = mpLoader->ClearCache( CLSID_DirectMusicSegment ); // キャッシュをクリアする方法 2. HRESULT hr = mpLoader->ClearCache( GUID_DirectMusicAllTypes );
あー、こんなことで1,2時間も無駄にしてしまう。
なぜ俺のPCに入ってるMSDNにはDirectMusic関連のドキュメントがないのだ??そっちのほうがナゾ。