SLmillibel CalculateVolumeLevel(float sourceGain, float localizationGain, float masterVolumeGain) { auto gain = sourceGain * localizationGain * masterVolumeGain; float dbVolume = 20 * log10(gain) * 100; return dbVolume > SL_MILLIBEL_MIN ? SLmillibel(dbVolume) : SL_MILLIBEL_MIN; }
void xnAudioSourceSetGain(xnAudioSource* source, float gain) { source->gain = gain; gain *= source->localizationGain * source->listener->audioDevice->masterVolume; auto dbVolume = SLmillibel(20 * log10(gain) * 100); if (dbVolume < SL_MILLIBEL_MIN) dbVolume = SL_MILLIBEL_MIN; (*source->volume)->SetVolumeLevel(source->volume, dbVolume); }
void xnAudioSetMasterVolume(xnAudioDevice* device, float volume) { device->masterVolume = volume; device->deviceLock.Lock(); for (xnAudioSource* source : device->sources) { auto dbVolume = SLmillibel(20 * log10(volume * source->gain * source->localizationGain) * 100); if (dbVolume < SL_MILLIBEL_MIN) dbVolume = SL_MILLIBEL_MIN; (*source->volume)->SetVolumeLevel(source->volume, dbVolume); } device->deviceLock.Unlock(); }