Войти
ПрограммированиеФорумЗвук

DirectSound, управление громкостью

#0
20:53, 28 окт. 2013

Привет.

Из документации по DirectSound мы узнаём, что громкость задаётся ф-иейц DirectSoundBuffer::SetVolume(long); Где параметр принимает значение от - 10 000 (тишина), до 0 (полная громкость).

В своей программе я решил задавать уровень громкости переменной float, которая принимает значение от 0 до 1.

Делаю так:

void SetVolume(float v) { volume = v; buffer->SetVolume((long)(10000.f * volume) - 10000l); }

Но тут такая беда. При значении volume = 0.8f звук уже почти полностью не слышен.

А нужно добиться плавного затухания от 1 до 0.

Что я делаю не так?


#1
20:57, 28 окт. 2013

Riddik
> решил задавать уровень громкости переменной float, которая принимает значение
> от 0 до 1
переводи коэффициент из линейной шкалы в логарифмическую (каковой является шкала контроля pan, volume, etc.)

#2
20:59, 28 окт. 2013

А кто тебе сказал что громкость регулируется линейно? Поэксперементируй со значениями, но то что там не линейное изменение громкости это точно.

http://www.gamedev.ru/code/forum/?id=17934
http://books.google.se/books?id=HWYKAAAAQBAJ&pg=PA422&lpg… e&f=false

#3
21:38, 28 окт. 2013

alex-r
Стас
Скопипастил с книжки из гугла, никаких изменений, едва звук понижается до -1400 уже ничего не слышно:

void SoundStream::SetVolume(float v)
{  
  float logarithmicProportion = v > 0.1f ? 1.f + log10(v) : 0.f;  
  v = (DSBVOLUME_MAX - DSBVOLUME_MIN) * logarithmicProportion + DSBVOLUME_MIN; 
  buffer->SetVolume((long)v);  
}

v строго между 0 и 1.

Смотрю в логе на logarithmicProportion, что-то меняется он так же линейно, толку от log10 нет, странно...

#4
22:12, 28 окт. 2013

Riddik
я когда-то спер этот код из книжки Game Audio Programming

    // Linearize: from the book - Game Audio Programming
    if (fLevel <= 0.0f)
        return dbMin;
    else if (fLevel >= 1.0f)
        return dbMax;

    float t = 1.0f - min( 1.0f, -0.25f * log10f(fLevel) );
    return (int32)(dbMin + (dbMax - dbMin) * t);

коэффициент 0.25 от балды, чтобы на слух все было ок

#5
22:38, 28 окт. 2013

alex-r
Спасибо - сработало и на слух всё как надо :)

ПрограммированиеФорумЗвук

Тема в архиве.