Improve company productivity with a Business Account.Sign Up

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

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
Asked:
mortonsw
  • 3
  • 2
1 Solution
 
robpittCommented:
Decibels are logarithmic scale - see http://www.phys.unsw.edu.au/music/dB.html

Anyway try something like:-

    db = 10 * log10( percent/100 );
0
 
robpittCommented:
and inversely:
  percent = 100 * pow(10,db/10);
0
 
mortonswAuthor 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
 
robpittCommented:
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
 
mortonswAuthor 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.

Join & Write a Comment

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

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

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now