内容というのは実際にはとても簡単なものなのだが、ミキサーの設定に依存せず他のプログラムが鳴らす音を取り込む、というもの。
ただし不特定多数のプログラムに対してこれを実現しようと思うとかなり骨の折れる作業になるので、取り合えずターゲットにしたいプログラムを決めてそのソフトからの取り込みが正しく行えるかどうかというのを基準に作業した。
結論から言うとかなり現実的なレベルでそれが可能だという事がわかった。
記事タイトルにもあるように dsound.dll の呼び出しを乗っ取り、DirectSound を使用してストリーミング再生、あるいは録音しているバッファの内容を盗み読みし、それをプロセス間通信で他のプロセスへ横流しする事で録音できる仕組みを作った。
仕組み上どうしてもリサンプラーやミキサーが必要になるため状況次第でパフォーマンス問題は否めないものの、少なくともこの仕組みを利用する事でかなり多くの状況で役に立つプログラムが出来上がりそうだ。
このプログラムが生きるのは主に様々な事情により録音デバイス自体が使えない場合である。もちろん IDirectSoundBuffer に書き込まれた内容自体を盗み読みするので劣化ゼロでデータを抽出出来るなど一応他のメリットもあるが、今回はそういう目的ではないのでその辺はあまり注目していない。
例えば録音ミキサーの使い方がわからなかったり、マイク入力に設定しており何らかの理由によりWaveMixが使えない、あるいは使いたくない場合にも録音できるわけなので、これはかなり需要があるプログラムだと思う。
更に IDirectSoundCaptureBuffer をフックすれば、実際には録音していないはずの音をデータに混ぜ込む事も出来る。この機能もちゃんと扱おうと思えば相当なポテンシャルを持っていると思う。
アプローチ自体は単純だが、かなり大きな一歩を踏み出せたように思える。