[alsa-devel] Mixer volume/decibel mapping

Sebastian H. vand2 at gmx.de
Wed Jun 9 09:34:48 CEST 2010

Am 09.06.2010 07:39, schrieb Raymond Yau:
> 2010/6/8 Sebastian H. <vand2 at gmx.de>
>>>>>>> I thinks Sebastian's question is whether he can use
>>>>>>> snd_mixer_selem_set_playback_
>>>>>>> dB() set any values in between the volume steps
>>>>>>> e.g. Master volume control of ac97 is 1.5 dB per step,
>>>>>>> when using snd_mixer_selem_set_playback_dB() to set -0.9dB , how can
>>>> the
>>>>>>> mixer application know what dB value has been set since the value is
>> in
>>>>>>> between -1.5dB and 0dB without snd_mixer_selem_get_playbackdB()
>>>>>> Indeed I quite happy with what ALSA already provides (I'm just an
>>>>>> interested
>>>>>> amateur). My main problem is that there is no documentation for the
>>>> Mixer
>>>>>> API
>>>>>> and how things are related to each other. Like CTL, HCTL, Mixer and
>>>>>> SimpleMixer and of course volume and dB in the snd_mixer_selem_
>>>> functions.
>>>>>> The root issue is that I wondered if the mixer application should
>> offer
>>>> a
>>>>>> separate text input for decibel values besides the text input for
>> volume
>>>>>> values. As pointed out this would not allow for finer grained volume
>>>>>> control
>>>>>> therefore for the moment I'll probably stick with a mere text label
>> for
>>>> dB.
>>>>> The main difference between those volume controls using TLV_DB_SCALE
>> and
>>>>> TLV_DB_LINEAR is -6dB is at the middle of TLV_DB_LINEAR and
>>>> has
>>>>> fixed dB value between any two steps.
>>>> What's TLV_DB_SCALE and TLV_DB_LINEAR for?
>>>> A grep in the alsa-lib sources did not return anything.
>>>>> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/332631
>>>>> if the user has both hda onboard sound and emu10k1, he may notice that
>>>> there
>>>>> is big difference if he set volume at percentage instead of dB
>>>> Interesting, that's my setup. I have an onboard HDA Intel and a
>>>> pci SBLive! Card and some el cheapo USB sound cards to experiment
>>>> with. Thanks I'll give the volume listening test a try at some point.
>>> https://bugtrack.alsa-project.org/alsa-bug/view.php?id=4883
>>> Pekka Lampila reported that when he set -40dB and only get back -9999999
>> by
>>> his program alsa_mixer_test.c
>>> I don't have emu10k1 so don't know whether this is a bug of alsa-lib or
>> not
>> I also get a big jump from -39.60dB to -99999.99 dB for some emu10k1
>> sliders when I move them to the minimum although their advertised
>> minimum is -40dB. This looks like a way to express log ( 0 ).
> Do you ream snd_mixer_selem_get_Playback_dB_range() return 40dB but max_dB -
> min_dB = 99999.99 dB ?

e.g. snd_mixer_selem_get_playback_dB_range() for
"Wave Surround" returns -40.00 to 0.00 dB and the dB values returned by

snd_mixer_selem_get_playback_dB (
	elem, SND_MIXER_SCHN_MONO, &_db_value );

are all in this range except for when the volume ist set to 0.
At this and only this volume the returned dB value is out of range with
-99999.99 dB. For vol=1 the dB value is -39.60.

More information about the Alsa-devel mailing list