schwarzの雑記 このページをアンテナに追加 RSSフィード

07/04/22 (Sun)4月22日の雑記

[] 4月22日の雑記 - schwarzの雑記 を含むブックマーク

当面ここはC#の備忘録ばかりになりそうです。

(すっかりここが"RGSS"グループだということを忘れてしまってますが・・・)


今日はmciSendStringについて。これを使うと簡単にmp3とかmidiとか再生できます。

[DllImport("winmm.dll")]
extern static int mciSendString(
    string pszCommand, 
    StringBuilder pszReturnString, 
    int cchReturn, 
    IntPtr hwndCallback
);

最初の引数がコマンド文字列です。その後ろ3つは軽くスルー。うまくいくと0が返ってきます。

再生はこんな感じで、大して難しくありません。

mciSendString("open \"HOGE.mp3\" alias SOUND", null, 0, IntPtr.Zero);
mciSendString("play SOUND from 0", null, 0, IntPrt.Zero);

さて今日の本題はループ再生はどうやるのか、についてです。方法としては、再生が終わったときにWindowsメッセージを出してあげて、それが来たのを感知したらもう一度始めから再生、ということをするようです。

メッセージを投げるには、playするときにコマンドに"notify"を付けて、そして第4引数に投げる先のフォームのハンドルを渡します。

mciSendString("play SOUND from 0 notify", null, 0, form.Handle);

最後に投げる先のフォームのWndProcを再定義します。

protected override void WndProc(ref Message m) {
    switch (m.Msg) {
     case MM_MCINOTIFY:
        if (m.WParam.ToInt32() == MCI_NOTIFY_SUCCESSFUL) {
            mciSendString("play SOUND from 0 notify", null, 0, this.Handle);
        }
        break;
    }
    base.WndProc(ref m);
}

ちなみにMM_MCINOTIFY = 0x3B9、MCI_NOTIFY_SUCCESSFUL = 1 のようです。

こういう定数は自分でヘッダファイルから漁って来なければならないのですが、結構面倒というか、そもそもCのヘッダとか見てると吐き気を催してくるし、同じ名前で微妙に中身が違うヘッダが3つも4つも有ったりしてどれを信じていいのか悩ましいです。なんか楽な方法はないものか。