前回サウンドの最低限の処理として音を鳴らせるようにしましたが、今回はサウンドの音量を変更できるようにしてみます。
主な追加・変更点です。
Sound.cpp
result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_VOLUME, &bqPlayerVolume);
assert(SL_RESULT_SUCCESS == result); // 音量インタフェース
set_volume(_vol); // 音量設定
サウンド再生準備関数 prepare内の処理です。prepareの引数に音量 _volが追加されています。
OpenSLで音量を設定するためのインタフェース bqPlayerVolumeを取得しています。
/*****************************************************
音量設定
引数 _vol = 音量(0.0:最小 〜 1.0:最大)
*****************************************************/
void SoundPlayer::set_volume(float _vol)
{
volume = _vol;
set_volume();
}
void SoundPlayer::set_volume(void)
{
if ( bqPlayerObject ) {
float _vol = volume*master_volume;
SLresult result;
result = (*bqPlayerVolume)->SetVolumeLevel(bqPlayerVolume, (_vol >= 1.0f) ? 0 : ((_vol < 0.01f) ? -16000
: (SLmillibel)(8000.0f*log10f(_vol))));
assert(SL_RESULT_SUCCESS == result);
}
}
音量設定関数です。
音量は 0.0(最小)〜1.0(最大)で設定するようにしていますが、SetVolumeLevelはミリベルで指定するようになっていますので常用対数で変換しています。
全体の音量を変更できるように、マスター音量 master_volumeを静的メンバとして持っています。引数の無い方の set_volumeは、マスター音量を変更したときに既に鳴っているサウンドの音量を再設定するために呼び出します。
/*************************************************************
マスター音量設定
引数 _vol = マスター音量(0.0:最小 〜 1.0:最大)
戻り値 マスター音量が変更されたか
*************************************************************/
Bool SoundPlayer::set_master_volume(float _vol)
{
if ( master_volume != _vol ) {
master_volume = _vol;
return TRUE;
}
return FALSE;
}
マスター音量変更のための静的メンバ関数 set_master_volumeです。
変更がなければ個々のサウンドの再設定は要らないので、変更の有無を戻り値として返すようにしています。
サンプルの変更部分です。
AppMain.cpp
if ( sys::TouchPanel[0].flag & sys::TouchManager::TRIGGER ) {
sound_player[se_track].play(sound_data[SOUND_SE], sound_size[SOUND_SE]); // SE再生
se_track = ++se_track % 4;
sound_player[4].set_volume((se_track % 2) ? 0.5f : 1.0f); // BGM音量変更
}
画面をタッチする度に、BGMの音量を上げたり下げたりしています。
プロジェクト一式は、
こちらから。
セコメントをする