aushというオーディオプレイヤーを作った。
なんか今時プレイヤーソフトなんて作りたくなかったんだけど(しかもDirectSound)、それによく探せば他にも見つかりそうではあるんだけど、手頃なのがすぐには見当たらなかったので作った。
何がしたかったかというと、Emacs(Meadow)上から音を鳴らしたり、鳴るのが終わるのを検出したりしたかった。
最初はMeadowのMCI機能(mw32-mci-*)を使ってみたのだけど、色々と問題があってやめた。鳴り終わりだけでなく明示的に停止したときにも停止イベント通知が発生してしまった。それも再生→停止→オープン→再生というのを間を置かず実行すると、最初の明示的に止めたときの停止イベントだけ来て、次の再生の鳴り終わりイベントが発生しない。必ず前の停止イベントを待ってから次の再生を行うようにすれば回避できたのかもしれないけれど、怪しいのでMCI機能を使うのは諦めた。
NTEmacsでplay-sound-fileを試してみたのだけど、鳴っている間全く操作ができなくなってしまうのでこれは使えないと思った。
MPlayerも試してみたけれどうまくいかなかった。MPlayerというのはCUI(コマンドライン)のプレイヤーソフトで、Emacsからの制御ではEMMS(Emacs Multimedia System)という前例があるのでいけるかなと思った。しかし、MPlayerのWindowsビルドをダウンロードして適当なoggファイルをならしてみたら、音の最後の部分が途切れてしまった。原因はよく分からなかったが、そのようなバグがあるという記述をどこかのサイトの何年か前の記事で見かけた。面倒なのでそれ以上追求しなかった。
というわけで、plainなwavとoggが再生できればよいのなら、自前のDirectSoundライブラリもあることだし、ちゃちゃっと作れるだろうと言うことで作ったわけだ。