・・・に見えますがそこはそれ、MSさんの用意する関数なので当てになりません。実際に動くのはBMP、DIB、DDSだけです。PNGのセーブができるようになるのはいつの事でしょう。DIBの色順がBGRであるのをRGB順に直してからPNGに保存するように修正しました。UpDate:--/--/--プログラミングに必要なスキルの一つにデバッグに耐えうる精神力というのがあるのではないでしょうか。コーディングの時間よりもバグをつぶしている時間のほうが長い気がします。常にあらゆる可能性を頭に置きながら、精神をチリチリ痛める戦いに挑まなければなりません。そんなわけでデバッグ作業を円滑に進めるためなら、親友を売っても構わないと常日頃考えている極悪サンデープログラマーの野村XXであります。古来より究極のデバッグ手法は『printfデバッグ』であると伝えられています。DOSのプログラムはこれで構わないわけですが、Windowsプログラムを書くときにはprintfが使えないので通常OutputDebugStringを用います。OutputDebugStringは引数の文字列をデバッグ実行のときにアウトプットウインドウに表示する関数です。リリースビルドの時には関数がさっくり削除されるので気持ち良く使うことができます。引数が文字列だけなので使いづらいのが難点です。*);OutputDebugString(tmp);といった感じで一度文字列にするか、可変引数を使った関数をつくってやらなければなりません。*;ってなストリーム表記ができてprintfより便利です。%s"とか書式を気にしなくて良い分、楽チンですね。そこでcoutの使いやすさにOutputDebugStringを押し込んでWindowsでも使えるようにしている方がいます。*;とするだけでアウトプットウインドウに変数がずらずら表示されます。このソースにファイルへのログ吐き機能を追加してありがたく使わせていただいています。表示法が楽になったからといって、ひたすら数字を眺めているのは大変苦痛です。何が足らないかといえば、そう、萌え要素です。デバッグにも萌え要素を導入しなければなりません。必要な機能としてはcoutの様な表記ができて、さらにファイルにログが取れれば文句ありません。こんな要求を満たしながら、かつ萌えるものは何かないでしょうか。・・・あるじゃないですか。任意たんはSSTPプロトコルを使って文字列を表示することができます。ことはOutputDebugStringの代りにSSTPを使えば任意たんがデバッグ文字列をしゃべってくれることになります。ついでにログを取る機能は任意たんが持っているので一石二鳥です。これを萌えストリームと命名しましょう。*;という風に使うだけで任意たんがにこやかに変数を囁いてくれます。ちなみに実行するとこんな感じ。SSTPの使いかたはこちら。人のソースを二つ拾ってきてくっつけただけという無粋な突っ込みは無しです。SSTPは好きなIPアドレスにメッセージを送ることができるので、マシンが二台ある場合は片方のマシンのIPを指定してそこの任意たんにデバッグ文字列をしゃべらせることができます。いわゆるリモートデバッグですね、すげー。フルスクリーンプログラム開発のときに役に立つでしょう。今回のソースはこちら。任意たんを起動してから実行してください。UpDate:--/--/--というわけでDirectMusicでMP3を鳴らすのに手間取っていたのですが、ループ再生に失敗する理由はどうやらCodecが原因のようです。バージョンによって挙動が違うんですよ。WinXPやメディアプレーヤー7をインストールしてあるWindowsではver1.9辺りが入っているんですが、それより前の奴ではループでこけます。とほほ〜まぁソフトを配布するときに一緒にメディアプレーヤーも配ればいいのかもしれませんが...その点を除けば実に快調で、セカンダリバッファに複数のMP3を読み込むことで多重再生も問題なく可能です。私の師匠T氏曰く『とにかくMixerが必要なら、acmとDirectSoundのペアが良いとおもいますよ〜』とプロフェッショナルサイドから意見をもらったんで、まじめなプログラマさんはそっちをお勧めします。不真面目なプログラマさんは私と一緒にメディアプレーヤーを配布しましょう。ついでにDirectShowのループ再生についての説明で舌足らずだったので師匠のお言葉を『FilterGraphからIMediaEventとIMediaSeekingをQIして、イベント監視スレッドを1つまわします。ループが必要なときになったらEV_COMPLETEがきますので、シークしてやります。これだとちょっと音が切れますので1こレンダラ書くのが正しいでしょう。』ちなみに私が『ループ再生については3)と一緒でWindowsのメッセージループに送られるWM_DIRECTSHOWEVENTを見に行かなければなりません。>WM_DIRECTSHOWEVENT,(long)this);ってな感じでウインドウメッセージを飛ばしてループを監視するという事です。やってることは大差ないんですが。BGM用にMP3再生を入れることにしました。多重再生とループ再生とメモリからの読み込みが可能であることが今回の課題です。おちは非常にしょーもないんですが、そこんとこよろしくお願いしますということで・・・ちなみにサウンドドライバはDirectAudio(DirectMusic)を使って作ってます。事の起こりはDirectMusic単体でMP3の再生ができないと思い込んでしまったことです。判断しちゃったんですね。LAME系とまぁ大体こんなもんだったんで、それぞれMP3ファイルを単に鳴らすだけのサンプルを作ってみました。1)のwaveOut系ですが、楽勝です。ヘッダから周波数等のデータを取得して構造体にぶち込んでwaveOutOpenwaveOutPrepareHeaderwaveOutWritewaveOutResetwaveOutUnprepareHeaderwaveOutCloseこんな感じで命令を呼び出すだけです。面白いことにwaveOutWriteという命令はメモリから出力デバイスにデータを書き込む命令なんですが、再生途中で呼び出しても良いんですね。普通の感覚だとwaveOutWriteを呼んだ瞬間に再生しているデータが指定されたデータに切り替わりそうなもんですが、waveOut世界では再生途中でwaveOutWriteを呼び出すとバッファリングされて現在再生しているデータが終了した後に再生されるようになってます。ストリーミングを実現しようと思ったら確かに理にかなってますね。ループ再生にはコールバック関数で対応できます。ちなみにwaveOutOpen可能なデバイス数は1つの模様。普通の環境ではwaveOutGetNumDevsの返値が1になります。そんなわけでどうやら多重再生はできなさそうです。acm系命令は比較的使用例が多い手法ですが、acm単体ではデコードができるだけで再生はDirectSoundなんかの手を借りないとできないようです。いうか再生をサポートしたのがwaveOut系命令と言えるでしょう。1)と同じなんですがストリーム処理を自前でやらなければならないのがめんどくさいです。初期化時に一気にデコードすれば楽なんですが、いかんせん非圧縮状態だと1曲数十Mバイトになるのでメモリを食いまくってしまいます。それにそんなことすると再生する瞬間にCPUがデコード処理で手一杯になってしまって再生開始に手間取ってしまいます。mci系命令の命令は1)に輪をかけて簡単ですMCIWndCreateMCIWndOpenMCIWndPlayMCIWndStopMCIWndCloseの順で命令を呼ぶだけでOK。ヘッダを読み下す必要もありません。MCIWndOpenの引数にファイル名を指定するだけです。逆にいうとファイル名を指定するしか方法がないのでメモリから読み出すことはできなさそうです。再生開始にちょっと手間取るのが難点。あとループ再生するためにWindowsのメッセージループに送られるMCIWNDM_NOTIFYMODEメッセージを見に行かないといけないというのがライブラリの独立性を損ねそうで嫌な感じです。4)DirectShow系も簡単です。これまたファイル名指定だけで再生できてしまうお手軽さなんですが、メモリからの読み出し方が不明。DirectShowはストリーミングに主眼を置いて作られているのでできるんでしょうけど、なんだかよく分かりません。IMemAllocator辺りを使うんだと思うのですが...CMemAllocatorクラスをnewしようとするとAssertに引っかかってうまくいきません。資料も出回ってないのでお手上げ状態。どなたかアドバイスPlease〜ループ再生については3)と一緒でWindowsのメッセージループに送られるWM_DIRECTSHOWEVENTを見に行かなければなりません。5)はフリーのmp3デコードルーチン使おうという話ですが2)同様再生にDirectSound等が必要になります。第一、難しそうです(^^;そんなこんなで、どれもニーズに合わないんで困ってしまいました。Vorbisでも使おうかと血迷うありさま。ファイルをロードできる。書いてあるじゃないですか。ぐはぁ、なんだCodecさえあればDirectMusicでも再生できるっつーことか(DirectX7以前は知しらないが少なくともDirectX8では)。前に試したときはMP3ファイル再生できなかったんだけどな〜とうだうだ考えていて、ふと思い出したことにはMP3形式のWaveとかいうのがあったなぁという事。チャンク内にMP3を放り込んでやることでWAVEの格好をするという奴です。BlizTagEditorなるヘッダ書き換えツールを使って新しいMP3ファイルを作成してみたもののやはり再生できません。MSに騙されたか!、ACM越しの再生なんてできないじゃないですか〜と怒り心頭だったんですが、最後に念のためサウンドレコーダーでADPCMを作って試してみるとあら不思議ちゃんと再生できます。ついでにこれまたサウンドレコーダーでMP3形式のWaveを作ってみると・・・、再生できますねぇ。すまんMS、早とちりだったらしい。MP3ファイルとMP3形式のWaveファイルを混同していたのが駄目だったらしいです。後者にID3タグとかの付加情報を付けたのが前者という位置付けのようです。ヘッダ書き換えなんて姑息な手段を使わないでまじめにWAVE->WAVE形式MP3にエンコードしておけば問題なかったんですね〜。WAVEヘッダみたいにエンコードしてあげると問題なくDirectMusicでも再生できます。MP3ファイルが再生できない方が問題ありな気もするんですけどね。TAGデータとかは読み飛ばしてデータ部分を読むだけでいいんじゃないんだっけ?まぁその辺差し引いてもDirectMusicに再生を任せると自動的にストリーミングしてくれるんでありがたいこと限りなし。多重再生とループ再生とメモリからの読み込みもOK...じゃないですね〜なんかループ再生が挙動不審です。長めのMP3ファイルを再生するとループに失敗します。failed.とかおっしゃってます。ぁ、相変わらず一筋縄ではいかないです。waveOutOpen可能なデバイス数は1ですが、スレッドを分けると複数回Open可能で多重再生もいける模様、要検証。