MP3をストリーミング再生

BGMがないと、なんというか作業的ゲームでの興醒めが早く生じがちなのじゃないかという感覚があったので急遽BGMをならせるような機構実装に取り組む。耳コピくらいやったことがあるので自分で曲をつくろうかと思ったものの、どうも無理。しょうがないので各自好きな曲を特定の名前をつけてbgmフォルダに置いてもらうことにしてしまうことにする。実装の作業のほうだけどもこんなもの一日程度の作業だろうと高をくくっていたが実際はかなりめんどうくさかった。
デコードまでつくるのは面倒なのでdllを使ったのだけども、
・mp3はなんかへんなタグがデータの前後についていたりして、mp3そのもののデータフォーマットの理解以前にそのクソID3タグのサイズを特定してスキップする機能を実装しなくてはならなかった。
・mp3ってデータの先頭に無意味な00がいくつか付いていることがあるのかよ…
mmioを使っているこれまでのwaveファイルのスキャン機構にplug-inするためにmmioについているファイルの開閉や読み書きのための独自関数を後付けする機能を使うことにしたのだが、そのための微妙な仕様を理解しなくてはならなかった。
・圧縮されてるファイルを読みながらmmioのシステムの方にはあたかも展開済みのwaveファイルを読んでいるかのように振舞う後付け用関数を実装しなくてはならなかった。
・DirectXSDKに付いてたストリーミング再生のサンプルはバッファそのものに設定して、ある位置まできたらイベントを立てる機能を使っているが、これは全体的に負荷がかかってくると全然期待どおり機能しないことが判明。具体的には1区画書き込みしている最中に再生が次の次まで進んでしまってイベントを取り逃し適切にバッファを書き換えられないことがある。どうもこんなの使っていても無駄っぽいので、バッファを書き換えていくスレッドはそんなイベントを待つのは止めて一定時間で再生位置をチェックして追いつけるまで書き込みまくるようにした。