x
• Status: Solved
• Priority: Medium
• Security: Public
• Views: 341

# Need equation for converting decibels (dB) to standard scale 0 to 10000

I need to fade volume of a DirectSound buffer but IDirectSoundBuffer:SetVolume wants the volume level specified in in hundredths of decibels (dB). Allowable values are between DSBVOLUME_MAX (no attenuation) and DSBVOLUME_MIN (silence). These values are currently defined in Dsound.h as 0 and -10,000 respectively. The value DSBVOLUME_MAX represents the original, unadjusted volume of the stream. The value DSBVOLUME_MIN indicates an audio volume attenuated by 100 dB, which, for all practical purposes, is silence.

Ramping SetVolume between -10000 and 0 (to fade in) results in a audibility between about -4000 and 0 and gives me a quick fade at the end of my ramp. I need a steady fade throughough. How do I convert say 0 to 10000 to necessary SetVolume argument that gives me a steady ramp? Thanks!!

I found two leads that may help but unsure how to translate into c:

http://picard.coma.sbg.ac.at/coma/docu/AF/docs/man3/AFdBtoLin.html

http://picard.coma.sbg.ac.at/coma/docu/AF/docs/man3/AFLintodB.html
0
mortonsw
• 3
• 2
1 Solution

Commented:
Decibels are logarithmic scale - see http://www.phys.unsw.edu.au/music/dB.html

Anyway try something like:-

db = 10 * log10( percent/100 );
0

Commented:
and inversely:
percent = 100 * pow(10,db/10);
0

Author Commented:
I know very little C (I write in ASM and interface) but my func to call DirectX SetVolume is in C and accepts arg (0 to 10000) which it subtracts 10000 from in order to pass to SetVolume (since it wants -10000 to 0).

extern "C" BOOL FAR PASCAL DXSBSetVolume( LPDIRECTSOUNDBUFFER lpBuffObj , DWORD Volume)
{
dsrval = lpBuffObj->SetVolume( Volume-10000 );
if(dsrval == DS_OK) return TRUE;
return FALSE;
}

What's the necessary code to use to handle calling argument as 100ths of percent (ie, 10000 = 100.00%), convert to decibel scale and pass to SetVolume as -10000 to 0?
0

Commented:
Given an 'inputVolume' measured in hundredths of a percent,
i.e. from 0 (silence) to 10000 (max), try the following:

MySetVolume( DWORD inputVolume)
{
double decibels;
DWORD dsVol;

if (inputVolume==0)
dsVol = DSBVOLUME_MIN;
else if (inputVolume>10000)
dsVol = DSBVOLUME_MAX;
else
{
//convert linear inputVolume to decibels (logarithmic)
decibels = 10.0 * log10((double)inputVolume / 10000.0);
dsVol = (DWORD)(decibels * 100.0);
}

pDSBuffer->SetVolume( dsVol );
}

...think thats right.
0

Author Commented:
20.0 * log10(... worked perfectly. Thanks!!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.