DirectSoundを利用してWAVファイルを再生する
(その5)

音量ボリュームと左右バランスの設定

ダイアログにあるボリュームのトラックバーを上下したときに音量ボリュームが変化するようにします。

トラックバーを縦方向に配置した場合、上側が0%、下側が100%となるので、上側が100%、下側が0%になるように ((100 - トラックバーの値) / 100) をボリュームの値とします。
さらにSetVolume()ではボリュームの設定値がdb(デシベル)となるので、0%~100%を-100db~0dbとなるように 10 x log10( ((100 - トラックバーの値) / 100) ) の式で設定値を変換します。

ダイアログにある音量バランスのトラックバーを左右に動かしたときに音量バランスが変化するようにします。

音量バランスは、中央値を0として負数を設定すると左側が強くなり、正数を設定すると右側が強くなります。
サンプルコードでは、トラックバーの範囲0%~100%を-50%~+50%に変換して音量バランスを設定しています。

サンプルコードを以下に示します。


/****************************************************************************/
/*!
 *  @brief  音量ボリューム設定を変更する.
 *
 *  @param  [in]    hVolume ボリュームコントロールバーのハンドル.
 *
 *  @retval 新しいボリューム設定値.
 */
static long     VolumeControl( HWND hVolume )
{
    //! デバイスをオープンしていない場合、ボリューム設定を行わない.
    if( !OutBuf ){
        return 0;
    }
    //! ダイアログからボリュームコンロトールの位置を取得する.
    long range  = SendMessage( hVolume, TBM_GETPOS, 0, 0 );
    long volume = DSBVOLUME_MIN;
    if( range < 100 ){
        volume = (long)(1000.0 * log10( (100.0 - range) / 100.0 ));
    }
    if( volume < DSBVOLUME_MIN ){
        volume = DSBVOLUME_MIN;
    }else
    if( volume > DSBVOLUME_MAX ){
        volume = DSBVOLUME_MAX;
    }
    //! ボリューム設定を変更する.
    OutBuf->SetVolume( volume );

    return volume;
}
	


/****************************************************************************/
/*!
 *  @brief  音量バランス設定を変更する.
 *
 *  @param  [in]    hVolume バランスコントロールバーのハンドル.
 *
 *  @retval 新しいバランス設定値.
 */
static long     BalanceControl( HWND hVolume )
{
    //! デバイスをオープンしていない場合、バランス設定を行わない.
    if( !OutBuf ){
        return 0;
    }
    //! ダイアログからバランスコンロトールの位置を取得する.
    long range   = SendMessage( hVolume, TBM_GETPOS, 0, 0 );
    long balance = ((50 - range) * ((DSBPAN_RIGHT - DSBPAN_LEFT) / 2)) / 100;

    //! バランス設定を変更する.
    OutBuf->SetPan( balance );

    return balance;
}
	

音量ボリュームの設定を変更する

IDirectSoundBuffer8のメソッドSetVolume()を呼び出して、音量ボリュームの設定を変更します。


    HRESULT IDirectSoundBuffer8::SetVolume( LONG lVolume )
	

引数説明
lVolume

ボリュームレベル (単位は 1/100dB)

SetVolume()からの戻り値がDS_OKであれば、音量ボリュームの設定は完了です。


ちなみに現在のボリューム設定値を取得するには、GetVolume()を使用します。


    HRESULT IDirectSoundBuffer8::GetVolume( LPLONG plVolume )
	

引数説明
plVolume

ボリュームレベルを受け取る変数のポインタ (単位は 1/100dB)。
範囲は、0dB(DSBVOLUME_MAX) から -100dB(DSBVOLUME_MIN)まで。

GetVolume()からの戻り値がDS_OKであれば、ボリューム設定値の取得は完了です。

音量バランスの設定を変更する

IDirectSoundBuffer8のメソッドSetPan()を呼び出して、音量バランスの設定を変更します。


    HRESULT IDirectSoundBuffer8::SetPan( LONG lPan )
	

引数説明
lPan

左右のチャンネルのボリュームバランス。

SetPan()からの戻り値がDS_OKであれば、音量バランスの設定は完了です。


ちなみに現在のバランス設定値を取得するには、GetPan()を使用します。


    HRESULT IDirectSoundBuffer8::GetPan( LPLONG plPan )
	

引数説明
plVolume

ボリュームバランスを受け取る変数のポインタ
-10,000(DSBPAN_LEFT) から 10,000(DSBPAN_RIGHT) の範囲で、0(DSBPAN_CENTER)が中央値。

GetVolume()からの戻り値がDS_OKであれば、ボリューム設定値の取得は完了です。

サンプルプログラムのダウンロード

サンプルプログラムのソースコードを以下からダウンロードできます。

開発環境 開発言語 ファイル名
Visual Studio 2005
+ DirectX SDK
C++ sample_0002.zip



Windowsは米国Microsoft Corporationの登録商標です。
DirectXは米国Microsoft Corporationの登録商標です。
DirectSoundは米国Microsoft Corporationの登録商標です。