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)。 |
GetVolume()からの戻り値がDS_OKであれば、ボリューム設定値の取得は完了です。
IDirectSoundBuffer8のメソッドSetPan()を呼び出して、音量バランスの設定を変更します。
HRESULT IDirectSoundBuffer8::SetPan( LONG lPan )
引数 | 説明 |
---|---|
lPan | 左右のチャンネルのボリュームバランス。 |
SetPan()からの戻り値がDS_OKであれば、音量バランスの設定は完了です。
ちなみに現在のバランス設定値を取得するには、GetPan()を使用します。
HRESULT IDirectSoundBuffer8::GetPan( LPLONG plPan )
引数 | 説明 |
---|---|
plVolume |
ボリュームバランスを受け取る変数のポインタ |
GetVolume()からの戻り値がDS_OKであれば、ボリューム設定値の取得は完了です。
サンプルプログラムのソースコードを以下からダウンロードできます。
開発環境 | Visual Studio 2005 |
---|---|
開発言語 | C言語 |
ファイル名 | sample_0002.zip |