Message ID | 1462733322-17470-1-git-send-email-joerg.krause@embedded.rocks (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sun, 08 May 2016 20:48:42 +0200, Jörg Krause wrote: > > Both, min_dB and max_dB, are floating type whereas the TLV is (always) > unsigned. > > The problem with the conversion of a negative floating-point number into an > unsigned integer is, that the behavior is undefined. This may, depending on > the platform, result in a wrong TLV, i.e. for the default values of min_dB > (-51dB) and max_dB (0dB), alsactl generates the following state on an ARM > cpu build with GCC: > > control.1 { > iface MIXER > name Master > value.0 255 > value.1 255 > comment { > access 'read write user' > type INTEGER > count 2 > range '0 - 255' > tlv '00000001000000080000000000000014' > dbmin 0 > dbmax 5100 > dbvalue.0 5100 > dbvalue.1 5100 > } > } > > With the fix applied, alsactl stores the correct TLV: > > control.1 { > iface MIXER > name Master > value.0 255 > value.1 255 > comment { > access 'read write user' > type INTEGER > count 2 > range '0 - 255' > tlv '0000000100000008ffffec1400000014' > dbmin -5100 > dbmax 0 > dbvalue.0 0 > dbvalue.1 0 > } > } > > Also tested for different combinations of min_dB and max_dB other than the > default values. > > Replaces: > http://mailman.alsa-project.org/pipermail/alsa-devel/2016-May/107733.html > > Fixes: > http://mailman.alsa-project.org/pipermail/alsa-devel/2016-May/107628.html > > Cc: Clemens Ladisch <clemens@ladisch.de> > Signed-off-by: Jörg Krause <joerg.krause@embedded.rocks> Applied, thanks. Takashi > --- > src/pcm/pcm_softvol.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/src/pcm/pcm_softvol.c b/src/pcm/pcm_softvol.c > index 802aa4b..061080d 100644 > --- a/src/pcm/pcm_softvol.c > +++ b/src/pcm/pcm_softvol.c > @@ -658,8 +658,8 @@ static int add_tlv_info(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo) > unsigned int tlv[4]; > tlv[0] = SND_CTL_TLVT_DB_SCALE; > tlv[1] = 2 * sizeof(int); > - tlv[2] = svol->min_dB * 100; > - tlv[3] = (svol->max_dB - svol->min_dB) * 100 / svol->max_val; > + tlv[2] = (int)(svol->min_dB * 100); > + tlv[3] = (int)((svol->max_dB - svol->min_dB) * 100 / svol->max_val); > return snd_ctl_elem_tlv_write(svol->ctl, &cinfo->id, tlv); > } > > -- > 2.8.2 > > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@alsa-project.org > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
diff --git a/src/pcm/pcm_softvol.c b/src/pcm/pcm_softvol.c index 802aa4b..061080d 100644 --- a/src/pcm/pcm_softvol.c +++ b/src/pcm/pcm_softvol.c @@ -658,8 +658,8 @@ static int add_tlv_info(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo) unsigned int tlv[4]; tlv[0] = SND_CTL_TLVT_DB_SCALE; tlv[1] = 2 * sizeof(int); - tlv[2] = svol->min_dB * 100; - tlv[3] = (svol->max_dB - svol->min_dB) * 100 / svol->max_val; + tlv[2] = (int)(svol->min_dB * 100); + tlv[3] = (int)((svol->max_dB - svol->min_dB) * 100 / svol->max_val); return snd_ctl_elem_tlv_write(svol->ctl, &cinfo->id, tlv); }
Both, min_dB and max_dB, are floating type whereas the TLV is (always) unsigned. The problem with the conversion of a negative floating-point number into an unsigned integer is, that the behavior is undefined. This may, depending on the platform, result in a wrong TLV, i.e. for the default values of min_dB (-51dB) and max_dB (0dB), alsactl generates the following state on an ARM cpu build with GCC: control.1 { iface MIXER name Master value.0 255 value.1 255 comment { access 'read write user' type INTEGER count 2 range '0 - 255' tlv '00000001000000080000000000000014' dbmin 0 dbmax 5100 dbvalue.0 5100 dbvalue.1 5100 } } With the fix applied, alsactl stores the correct TLV: control.1 { iface MIXER name Master value.0 255 value.1 255 comment { access 'read write user' type INTEGER count 2 range '0 - 255' tlv '0000000100000008ffffec1400000014' dbmin -5100 dbmax 0 dbvalue.0 0 dbvalue.1 0 } } Also tested for different combinations of min_dB and max_dB other than the default values. Replaces: http://mailman.alsa-project.org/pipermail/alsa-devel/2016-May/107733.html Fixes: http://mailman.alsa-project.org/pipermail/alsa-devel/2016-May/107628.html Cc: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Jörg Krause <joerg.krause@embedded.rocks> --- src/pcm/pcm_softvol.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)