▽Waveファイル入出力

入出力シリーズ第2弾(?)。Waveファイルの入出力です。

○Waveファイル入出力

サンプルプログラムはこちら。

gc06-25.lzh
gc06-25.lzh

GClass ver 1.0 [060]
gclass-060.lzh

プログラムはGClassを使用しています。ソースコードのコンパイルから試してみたい人は、あらかじめGClassの環境を整えておいてください。

Waveファイル入出力
Waveファイル入出力の実験

機能は・・・ だいたい、画面を見ての通りです。sndPlaySound()を使った簡単な再生からwaveOut系のAPIを利用した多重再生・ストリーム再生とwaveIn系のAPIを使った録音までやってます。

○ポイント解説

結局、再生と録音をあわせて4つのクラスにまとめています。というか、それぞれに共通する部分を無理矢理親クラスにまとめた感じ? あんまり美しくないけど実用的なやりかたかと。

基本的にwaveOut系もwaveIn系も枯れた技術なんでそんなに難しいことはないんですけど、コールバックに関数でもウィンドウでもなくスレッドを使ってるのが目新しいかな?

HWAVEOUT        GWaveBase::WaveOutOpen( void )
{
    //      再生用にデバイスをオープンする

    HWAVEOUT    out = NULL;
    MMRESULT    mr  = waveOutOpen( &out,WAVE_MAPPER,&m_format,
                        m_proc_id,0,CALLBACK_THREAD );
    if( mr != 0 )
        return  NULL;

    return  out;
}

m_proc_idはGWaveBaseがstaticに持っている変数でスレッドIDが入れてあります。スレッドの本体はこちら。

static
DWORD   WINAPI  WaveBaseProc( void* param )
{
    MSG     msg;

    while( ::GetMessage( &msg,NULL,0,0 ) ) {

        if( msg.message == MM_WOM_DONE || msg.message == MM_WIM_DATA ) {
            WAVEHDR*            wh  = (WAVEHDR*)msg.lParam;
            GWaveBaseHeader*    wb  = (GWaveBaseHeader*)wh->dwUser;

            wb->m_base->OnWaveDone( wh,wb );
        }
    }

    return  0;
}

単純にメッセージループを呼び出してるだけのスレッドです。当たり前ですが、メインのスレッドの他にスレッドを作ってるのですからマルチスレッド何ですけど、ライブラリはシングルスレッドのままで押し通しています。よい子はまねしてはいけません(笑)

あとは・・・ ストリーム再生/録音で後始末をワーカースレッド側に任せてるのに同期処理をやってないというとんでもない手抜きをしています。このあたり、使用に当たっては自己責任でどうぞ。・・・気が向いたら、まじめに同期処理入れるかな(´∀`;)

まぁ、ぶっちゃけストリーム再生/録音ならMCIを使えばもっともっと楽に出来るんで、そちらを使うのがベストかと。

○クラス&関数解説

今回追加になったクラス・関数のものすごく簡単な解説です。

GWaveBase / GWavePlay / GWaveRec / GWaveSE
Waveファイルの入出力に関するクラス。GWaveBaseが基底クラスで、ここからそれ以外のクラスが派生している。GWavePlayはストリーム再生クラス。GWaveRecはストリーム録音クラス。GWaveSEがメインであるメモリからの多重再生クラス。まぁ、単純に何度も再生してるだけなんだけどw
GButtonCtrl / GRadioButtonCtrl / GCheckBoxCtrl
ボタンコントロールいろいろ。
GEditCtrl
エディットコントロール。あれ? コントロールの使い方の話もするべきか?
GCalcFrameRate
フレームレート計算クラス。フレームレートを一定に保つための計算がメイン。

○ちょっと一言

今回は単純にWaveファイルから入出力してるだけですけど、mp3などの圧縮形式を使った入出力をするときにも今回のクラスが参考になるでしょう。たぶん。

ん〜・・・ 1回、こっちもサンプルを作るべきか?(´∀`;)

結局、サウンドの再生・録音ってのはサウンドデバイスとのあいだでメモリをやりとりしてるだけなんで、メモリを処理すればいろいろなエフェクトが可能です。

簡単なところだと音量の変更から自力で多重化など。フェードイン・フェードアウトもたいして難しい処理じゃないでしょう。

○今後の予定

グラフィック周りの処理が煮詰まってるけど、基本の部分だけでも一気に終わらせたい。応用に関してはネタがいろいろあるんで、その後はのんびりやるかな。

Wave関連であと一つネタが残ってるんで、こっちも早めに形にしないと。


[GClass] Presented by See.Ku [2005/3/18]