?
Solved

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

Posted on 2001-09-11
5
Medium Priority
?
340 Views
Last Modified: 2013-12-03
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
Comment
Question by:mortonsw
  • 3
  • 2
5 Comments
 
LVL 5

Expert Comment

by:robpitt
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

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

Author Comment

by:mortonsw
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

by:
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

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

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

This article shows how to make a Windows 7 gadget that accepts files dropped from the Windows Explorer.  It also illustrates how to give your gadget a non-rectangular shape and how to add some nifty visual effects to text displayed in a your gadget.…
For a while now I'v been searching for a circular progress control, much like the one you get when first starting your Silverlight application. I found a couple that were written in WPF and there were a few written in Silverlight, but all appeared o…
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…
The Relationships Diagram is a good way to get an overall view of what a database is keeping track of. It is also where relationships are defined. A relationship specifies how two tables connect to each other. As you build tables in Microsoft Ac…

600 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question