山場

多分山だと思われるBGMPlayer。色々考えた結果、スミスくんのDirectSoundを使ったコードを(マルチスレッディングを外しながら)移植するのが一番近いということにしました。
とりあえずサウンド関係の.hと.cppを1ファイルずつにまとめて#includeなどを整列。そしてビルドボタンをぶっぱ。最初は100あまりのエラーがでたものの、boostのthreadやmutexを見つけては消していき、スレッドの無限ループ関数を1Fごとに呼び出す形式に変更しました(ついでにアクセス制御をpublicに移動)。本当にだるいので明らかにヤリタカッタダケーなbindもスルーで。


ここで立ちふさがる実行時エラーの壁。ログに1,2,3だの出力して場所を特定する残念な作業に。コンストラクタチェーンで引っかかっているようなので嫌になってきて、どうもエラーの出方からC++例外が飛んでいるように見えたので該当箇所をtry-catchでくくる。エラーするとしっかりstd::runtime_errorを投げていたのでね。

try{
	m_sound.reset(new SoundDevice(hwnd));
	m_player.reset(new StreamingPlayer(*m_sound));
} catch(std::exception &e) {
	logout << e.what() << std::endl;
}

ファイルのマッピングに失敗しました
ファイル名:hokuto\hokuto.wav

一瞬でCreateFileMapping関数で死んでいることがわかりました。直前でCreateFileが成功しているのでファイルが見つからないわけではないようです。ここはCreateFileMappingのリファレンス一択。
答え:最後の引数のマッピングオブジェクトの名前には「\」が使えない。"hokuto.wav"を渡していたものを、今回"hokuto\hokuto.wav"に変更して使ったのでバグが露呈してしまった。この名前はなし(NULL)でもよく、ファイルにメモリアクセスしたいだけの用途なら(そうでないのはプロセス間通信など)、名前はいりません(このクラス、プロセス間通信にも使ってたけど)。

CreateFileMapping(File.get(), NULL, protect, 0, 0, file.c_str())
CreateFileMapping(File.get(), NULL, protect, 0, 0, NULL)

結論:例外を投げてもcatchしなければ何の意味もない。関数フックしている中でやっているから結構処理に困るんだけどね…。
正解:BGMが鳴るようになって沸きたつ感情。北斗のキャラセレは神。