Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
Solved

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

Posted on 2001-09-11
Medium Priority
333 Views
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
Question by:mortonsw
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 3
• 2

LVL 5

Expert Comment

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

Anyway try something like:-

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

LVL 5

Expert Comment

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

LVL 1

Author Comment

ID: 6476800
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

LVL 5

Accepted Solution

robpitt earned 400 total points
ID: 6477934
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

LVL 1

Author Comment

ID: 6478022
20.0 * log10(... worked perfectly. Thanks!!
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

With most software applications trying to cater to multiple user needs nowadays, the focus is to make them as configurable as possible. For e.g., when creating Silverlight applications which will connect to WCF services, the service end point usuall…
For most people, the WrapPanel seems like a magic when they switch from WinForms to WPF. Most of us will think that the code that is used to write a control like that would be difficult. However, most of the work is done by the WPF engine, and the W…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can re…
###### Suggested Courses
Course of the Month10 days, 9 hours left to enroll