alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
* Question about snd_mixer_selem_get_playback_dB_range()
@ 2011-03-21 12:52 Tanu Kaskinen
  2011-03-21 13:43 ` Raymond Yau
  0 siblings, 1 reply; 8+ messages in thread
From: Tanu Kaskinen @ 2011-03-21 12:52 UTC (permalink / raw)
  To: alsa-devel

Hi,

I have added code to Pulseaudio that checks that the kernel driver
returns the same values if I call
snd_mixer_selem_get_playback_dB_range() or
snd_mixer_selem_ask_playback_vol_dB() with the lowest and highest volume
steps. The reason I do this is that I've seen a driver that didn't
return correct values from _dB_range() (it's fixed nowadays), so it's
possible that the same kind of bugs will be seen in the future too.
Doing this check at Pulseaudio startup helps to detect such bugs early.

My question is about the case where the lowest volume step is mute. Is
it a bug in the driver if _dB_range() returns something else than
SND_CTL_TLV_DB_GAIN_MUTE as the min gain in such case?

-- 
Tanu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Question about snd_mixer_selem_get_playback_dB_range()
  2011-03-21 12:52 Question about snd_mixer_selem_get_playback_dB_range() Tanu Kaskinen
@ 2011-03-21 13:43 ` Raymond Yau
  2011-03-21 13:55   ` Tanu Kaskinen
  0 siblings, 1 reply; 8+ messages in thread
From: Raymond Yau @ 2011-03-21 13:43 UTC (permalink / raw)
  To: ALSA Development Mailing List

2011/3/21 Tanu Kaskinen <tanu.kaskinen@digia.com>

> Hi,
>
> I have added code to Pulseaudio that checks that the kernel driver
> returns the same values if I call
> snd_mixer_selem_get_playback_dB_range() or
> snd_mixer_selem_ask_playback_vol_dB() with the lowest and highest volume
> steps. The reason I do this is that I've seen a driver that didn't
> return correct values from _dB_range() (it's fixed nowadays), so it's
> possible that the same kind of bugs will be seen in the future too.
> Doing this check at Pulseaudio startup helps to detect such bugs early.
>
> My question is about the case where the lowest volume step is mute. Is
> it a bug in the driver if _dB_range() returns something else than
> SND_CTL_TLV_DB_GAIN_MUTE as the min gain in such case?
>
>
AFAIK , only those STAC920x codec has SND_CTL_TLV_DB_GAIN_MUTE

most driver does not has min dB mute as the alsa driver just use the values
in the datasheet of most codec and DAC

So it is not any driver bug

I guess why the volume slider of gnome volume control is mute at mint is
just follow the behaviour of those OSS driver

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Question about snd_mixer_selem_get_playback_dB_range()
  2011-03-21 13:43 ` Raymond Yau
@ 2011-03-21 13:55   ` Tanu Kaskinen
  2011-03-21 14:38     ` Clemens Ladisch
  0 siblings, 1 reply; 8+ messages in thread
From: Tanu Kaskinen @ 2011-03-21 13:55 UTC (permalink / raw)
  To: alsa-devel

On Mon, 2011-03-21 at 15:43 +0200, Raymond Yau wrote:
> 2011/3/21 Tanu Kaskinen <tanu.kaskinen@digia.com>
> 
> > Hi,
> >
> > I have added code to Pulseaudio that checks that the kernel driver
> > returns the same values if I call
> > snd_mixer_selem_get_playback_dB_range() or
> > snd_mixer_selem_ask_playback_vol_dB() with the lowest and highest volume
> > steps. The reason I do this is that I've seen a driver that didn't
> > return correct values from _dB_range() (it's fixed nowadays), so it's
> > possible that the same kind of bugs will be seen in the future too.
> > Doing this check at Pulseaudio startup helps to detect such bugs early.
> >
> > My question is about the case where the lowest volume step is mute. Is
> > it a bug in the driver if _dB_range() returns something else than
> > SND_CTL_TLV_DB_GAIN_MUTE as the min gain in such case?
> >
> >
> AFAIK , only those STAC920x codec has SND_CTL_TLV_DB_GAIN_MUTE

Also some broken HDA cards, but I'm not referring to any particular
driver. I just want to get my code right.

> most driver does not has min dB mute as the alsa driver just use the values
> in the datasheet of most codec and DAC
> 
> So it is not any driver bug

What is not any driver bug?

> I guess why the volume slider of gnome volume control is mute at mint is
> just follow the behaviour of those OSS driver

Thank you for your reply. Unfortunately, I'm not much wiser after
reading it.

I'll repeat my question:

Is it a bug in alsa (the driver or alsa-lib or whatever) if
snd_mixer_selem_get_playback_dB_range() returns something else than
SND_CTL_TLV_DB_GAIN_MUTE as the min gain, if the lowest volume step for
the element is mute?

-- 
Tanu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Question about snd_mixer_selem_get_playback_dB_range()
  2011-03-21 13:55   ` Tanu Kaskinen
@ 2011-03-21 14:38     ` Clemens Ladisch
  2011-03-21 14:44       ` Tanu Kaskinen
  0 siblings, 1 reply; 8+ messages in thread
From: Clemens Ladisch @ 2011-03-21 14:38 UTC (permalink / raw)
  To: Tanu Kaskinen; +Cc: alsa-devel

Tanu Kaskinen wrote:
> On Mon, 2011-03-21 at 15:43 +0200, Raymond Yau wrote:
> > AFAIK , only those STAC920x codec has SND_CTL_TLV_DB_GAIN_MUTE
> 
> Also some broken HDA cards,

Where "some" = "those that use a STAC920x codec".

> What is not any driver bug?

That the hardware reported a wrong dB value for the lowest volume
setting.  The latest driver has a workaround.

> Is it a bug in alsa (the driver or alsa-lib or whatever) if
> snd_mixer_selem_get_playback_dB_range() returns something else than
> SND_CTL_TLV_DB_GAIN_MUTE as the min gain, if the lowest volume step for
> the element is mute?

Yes.


Regards,
Clemens

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Question about snd_mixer_selem_get_playback_dB_range()
  2011-03-21 14:38     ` Clemens Ladisch
@ 2011-03-21 14:44       ` Tanu Kaskinen
  2011-03-22  7:02         ` Peter Ujfalusi
  0 siblings, 1 reply; 8+ messages in thread
From: Tanu Kaskinen @ 2011-03-21 14:44 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: alsa-devel@alsa-project.org

On Mon, 2011-03-21 at 16:38 +0200, Clemens Ladisch wrote:
> Tanu Kaskinen wrote:
> > On Mon, 2011-03-21 at 15:43 +0200, Raymond Yau wrote:
> > > AFAIK , only those STAC920x codec has SND_CTL_TLV_DB_GAIN_MUTE
> > 
> > Also some broken HDA cards,
> 
> Where "some" = "those that use a STAC920x codec".

Ah, ok :D

> > What is not any driver bug?
> 
> That the hardware reported a wrong dB value for the lowest volume
> setting.  The latest driver has a workaround.
> 
> > Is it a bug in alsa (the driver or alsa-lib or whatever) if
> > snd_mixer_selem_get_playback_dB_range() returns something else than
> > SND_CTL_TLV_DB_GAIN_MUTE as the min gain, if the lowest volume step for
> > the element is mute?
> 
> Yes.

Thank you for the answer!

-- 
Tanu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Question about snd_mixer_selem_get_playback_dB_range()
  2011-03-21 14:44       ` Tanu Kaskinen
@ 2011-03-22  7:02         ` Peter Ujfalusi
  2011-03-22  7:11           ` Clemens Ladisch
  0 siblings, 1 reply; 8+ messages in thread
From: Peter Ujfalusi @ 2011-03-22  7:02 UTC (permalink / raw)
  To: ext Tanu Kaskinen; +Cc: alsa-devel@alsa-project.org, Clemens Ladisch

On 03/21/11 16:44, ext Tanu Kaskinen wrote:
>>> Is it a bug in alsa (the driver or alsa-lib or whatever) if
>>> snd_mixer_selem_get_playback_dB_range() returns something else than
>>> SND_CTL_TLV_DB_GAIN_MUTE as the min gain, if the lowest volume step for
>>> the element is mute?
>>
>> Yes.
> 
> Thank you for the answer!

AFAIK the SND_CTL_TLV_DB_GAIN_MUTE received a fix regarding to this:
2f6206da0c1ff88235e6eca0077343f22a4b43ee
tlv: fix returned dB information for min-is-mute controls

Looking at the patch itself, it does going to return
min=SND_CTL_TLV_DB_GAIN_MUTE from snd_tlv_get_dB_range function.

However I have my doubts, if this is the correct way...

Take these two gain controls for example:
RAW value   GAIN1  GAIN2
   0        mute   mute
   1        -2dB   0dB
   2         0dB   1dB
   3         2dB   2dB

If user space asks for the dB_range:
        min    max
GAIN1   mute   2dB
GAIN2   mute   2dB

They are going to return with the same range, however if you ask for
-2dB on both:
GAIN1 will be -2dB
GAIN2 will be muted

So we are kind of hiding the dB range for the control.
I don't know how to fix it (well, I have some ideas, but it would need
changes in the API IMHO).

-- 
Péter

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Question about snd_mixer_selem_get_playback_dB_range()
  2011-03-22  7:02         ` Peter Ujfalusi
@ 2011-03-22  7:11           ` Clemens Ladisch
  2011-04-11  2:19             ` Raymond Yau
  0 siblings, 1 reply; 8+ messages in thread
From: Clemens Ladisch @ 2011-03-22  7:11 UTC (permalink / raw)
  To: Peter Ujfalusi; +Cc: ext Tanu Kaskinen, alsa-devel@alsa-project.org

Peter Ujfalusi wrote:
> Looking at the patch itself, it does going to return
> min=SND_CTL_TLV_DB_GAIN_MUTE from snd_tlv_get_dB_range function.
> 
> However I have my doubts, if this is the correct way...
> 
> Take these two gain controls for example:
> RAW value   GAIN1  GAIN2
>    0        mute   mute
>    1        -2dB   0dB
>    2         0dB   1dB
>    3         2dB   2dB
> 
> If user space asks for the dB_range:
>         min    max
> GAIN1   mute   2dB
> GAIN2   mute   2dB
> 
> They are going to return with the same range, however if you ask for
> -2dB on both:
> GAIN1 will be -2dB
> GAIN2 will be muted

Or not, depending on which direction you instruct it to round.

> So we are kind of hiding the dB range for the control.

This is unavoidable if the only information returned is min/max.
To get the entire curve and resolution, you'd have to get the dB value
for each raw volume value.


Regards,
Clemens

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Question about snd_mixer_selem_get_playback_dB_range()
  2011-03-22  7:11           ` Clemens Ladisch
@ 2011-04-11  2:19             ` Raymond Yau
  0 siblings, 0 replies; 8+ messages in thread
From: Raymond Yau @ 2011-04-11  2:19 UTC (permalink / raw)
  To: ALSA Development Mailing List

2011/3/22 Clemens Ladisch <clemens@ladisch.de>

> Peter Ujfalusi wrote:
> > Looking at the patch itself, it does going to return
> > min=SND_CTL_TLV_DB_GAIN_MUTE from snd_tlv_get_dB_range function.
> >
> > However I have my doubts, if this is the correct way...
> >
> > Take these two gain controls for example:
> > RAW value   GAIN1  GAIN2
> >    0        mute   mute
> >    1        -2dB   0dB
> >    2         0dB   1dB
> >    3         2dB   2dB
> >
> > If user space asks for the dB_range:
> >         min    max
> > GAIN1   mute   2dB
> > GAIN2   mute   2dB
> >
> > They are going to return with the same range, however if you ask for
> > -2dB on both:
> > GAIN1 will be -2dB
> > GAIN2 will be muted
>
> Or not, depending on which direction you instruct it to round.
>
> > So we are kind of hiding the dB range for the control.
>
> This is unavoidable if the only information returned is min/max.
> To get the entire curve and resolution, you'd have to get the dB value
> for each raw volume value.
>
>
Should the application include the dB range of "Virtual Master" ?

e.g. pulseaudio calculate the dB range (-168dB to 0dB ) on my ad1988 HDA
codec
which "front", "surround", "center/lfe" and "side" have (-58.0 to 0dB)


D: alsa-mixer.c: Activating path analog-output
D: alsa-mixer.c: Path analog-output (Analog Output), direction=1,
priority=99, probed=yes, supported=yes, has_mute=yes, has_volume=yes,
has_dB=yes, min_volume=0, max_volume=39, min_dB=-168, max_dB=0
D: alsa-mixer.c: Element Master, direction=1, switch=1, volume=1,
volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0x7ffffffffffff, n_channels=1, override_map=yes
D: alsa-mixer.c: Element Headphone, direction=1, switch=1, volume=0,
volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0x0, n_channels=0, override_map=no
D: alsa-mixer.c: Element Front, direction=1, switch=1, volume=1,
volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0x6, n_channels=2, override_map=yes
D: alsa-mixer.c: Element Surround, direction=1, switch=1, volume=1,
volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0x60, n_channels=2, override_map=yes
D: alsa-mixer.c: Element Side, direction=1, switch=1, volume=1,
volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0xc00, n_channels=2, override_map=yes
D: alsa-mixer.c: Element Center, direction=1, switch=1, volume=1,
volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0x4900000000018, n_channels=1, override_map=yes
D: alsa-mixer.c: Element LFE, direction=1, switch=1, volume=1,
volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0x80, n_channels=1, override_map=yes
D: alsa-mixer.c: Element PCM, direction=1, switch=0, volume=1,
volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0x3600000000f66, n_channels=2, override_map=yes
I: alsa-sink.c: Hardware volume ranges from -168.00 dB to 0.00 dB.
I: alsa-sink.c: Fixing base volume to 0.00 dB
I: alsa-sink.c: Successfully enabled synchronous volume.
I: alsa-sink.c: Using hardware volume control. Hardware dB scale supported.
I: alsa-sink.c: Using hardware mute control.
D: alsa-util.c: snd_pcm_dump():
D: alsa-util.c: Soft volume PCM
D: alsa-util.c: Control: PCM Playback Volume
D: alsa-util.c: min_dB: -51
D: alsa-util.c: max_dB: 0
D: alsa-util.c: resolution: 256
D: alsa-util.c: Its setup is:
D: alsa-util.c:   stream       : PLAYBACK
D: alsa-util.c:   access       : MMAP_INTERLEAVED
D: alsa-util.c:   format       : S16_LE
D: alsa-util.c:   subformat    : STD
D: alsa-util.c:   channels     : 2
D: alsa-util.c:   rate         : 44100
D: alsa-util.c:   exact rate   : 44100 (44100/1)
D: alsa-util.c:   msbits       : 16
D: alsa-util.c:   buffer_size  : 16384
D: alsa-util.c:   period_size  : 8192
D: alsa-util.c:   period_time  : 185759
D: alsa-util.c:   tstamp_mode  : ENABLE
D: alsa-util.c:   period_step  : 1
D: alsa-util.c:   avail_min    : 15502
D: alsa-util.c:   period_event : 0
D: alsa-util.c:   start_threshold  : -1
D: alsa-util.c:   stop_threshold   : 1073741824
D: alsa-util.c:   silence_threshold: 0
D: alsa-util.c:   silence_size : 0
D: alsa-util.c:   boundary     : 1073741824
D: alsa-util.c: Slave: Hardware PCM card 1 'HDA Intel' device 0 subdevice 0
D: alsa-util.c: Its setup is:
D: alsa-util.c:   stream       : PLAYBACK
D: alsa-util.c:   access       : MMAP_INTERLEAVED
D: alsa-util.c:   format       : S16_LE
D: alsa-util.c:   subformat    : STD
D: alsa-util.c:   channels     : 2
D: alsa-util.c:   rate         : 44100
D: alsa-util.c:   exact rate   : 44100 (44100/1)
D: alsa-util.c:   msbits       : 16
D: alsa-util.c:   buffer_size  : 16384
D: alsa-util.c:   period_size  : 8192
D: alsa-util.c:   period_time  : 185759
D: alsa-util.c:   tstamp_mode  : ENABLE
D: alsa-util.c:   period_step  : 1
D: alsa-util.c:   avail_min    : 15502
D: alsa-util.c:   period_event : 0
D: alsa-util.c:   start_threshold  : -1
D: alsa-util.c:   stop_threshold   : 1073741824
D: alsa-util.c:   silence_threshold: 0
D: alsa-util.c:   silence_size : 0
D: alsa-util.c:   boundary     : 1073741824
D: alsa-util.c:   appl_ptr     : 0
D: alsa-util.c:   hw_ptr       : 0
D: alsa-sink.c: Thread starting up
D: alsa-sink.c: Read hardware volume: 0: 100% 1: 100%


SB Live! platinum (CT4760P) which has "Surround Playback Volume" with
SND_CTL_TLV_DB_GAIN_MUTE , "Master and PCM Playback Volume" of stac9721

and PA report (-100081dB to +12 dB)

D: alsa-mixer.c: Activating path analog-output
D: alsa-mixer.c: Path analog-output (Analog Output), direction=1,
priority=99, probed=yes, supported=yes, has_mute=yes, has_volume=yes,
has_dB=yes, min_volume=0, max_volume=31, min_dB=-100081, max_dB=12
D: alsa-mixer.c: Element Master, direction=1, switch=1, volume=1,
volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0x3600000000f66, n_channels=2, override_map=yes
D: alsa-mixer.c: Element Surround, direction=1, switch=0, volume=1,
volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0x60, n_channels=2, override_map=yes
D: alsa-mixer.c: Element PCM, direction=1, switch=1, volume=1,
volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0x3600000000f66, n_channels=2, override_map=yes
D: alsa-mixer.c: Element External Amplifier, direction=1, switch=4,
volume=0, volume_limit=-1, enumeration=0, required=0, required_any=0,
required_absent=0, mask=0x0, n_channels=0, override_map=no
D: alsa-mixer.c: Option on (output-amplifier-on/Amplifier) index=1,
priority=10
D: alsa-mixer.c: Option off (output-amplifier-off/No Amplifier) index=0,
priority=0
D: alsa-mixer.c: Setting output-amplifier-on (Amplifier) priority=10
D: alsa-mixer.c: Setting output-amplifier-off (No Amplifier) priority=0
I: alsa-sink.c: Hardware volume ranges from -100080.99 dB to 12.00 dB.
I: alsa-sink.c: Fixing base volume to -12.00 dB

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2011-04-11  2:19 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-21 12:52 Question about snd_mixer_selem_get_playback_dB_range() Tanu Kaskinen
2011-03-21 13:43 ` Raymond Yau
2011-03-21 13:55   ` Tanu Kaskinen
2011-03-21 14:38     ` Clemens Ladisch
2011-03-21 14:44       ` Tanu Kaskinen
2011-03-22  7:02         ` Peter Ujfalusi
2011-03-22  7:11           ` Clemens Ladisch
2011-04-11  2:19             ` Raymond Yau

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).