Commit 369693dc authored by Paul Vojta's avatar Paul Vojta Committed by Takashi Iwai

ALSA: hda - fix beep tone calculation for IDT/STAC codecs

In the beep tone calculation for IDT/STAC codecs, lower numbers correspond
to higher frequencies and vice versa.  The current code has this backwards,
resulting in beep frequencies which are way too high (and sound bad on
tinny laptop speakers, resulting in complaints).

[Also added hz <= 0 check by tiwai]
Signed-off-by: default avatarPaul Vojta <vojta@math.berkeley.edu>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 508f7110
...@@ -50,19 +50,22 @@ static void snd_hda_generate_beep(struct work_struct *work) ...@@ -50,19 +50,22 @@ static void snd_hda_generate_beep(struct work_struct *work)
* The tone frequency of beep generator on IDT/STAC codecs is * The tone frequency of beep generator on IDT/STAC codecs is
* defined from the 8bit tone parameter, in Hz, * defined from the 8bit tone parameter, in Hz,
* freq = 48000 * (257 - tone) / 1024 * freq = 48000 * (257 - tone) / 1024
* that is from 12kHz to 93.75kHz in step of 46.875 hz * that is from 12kHz to 93.75Hz in steps of 46.875 Hz
*/ */
static int beep_linear_tone(struct hda_beep *beep, int hz) static int beep_linear_tone(struct hda_beep *beep, int hz)
{ {
if (hz <= 0)
return 0;
hz *= 1000; /* fixed point */ hz *= 1000; /* fixed point */
hz = hz - DIGBEEP_HZ_MIN; hz = hz - DIGBEEP_HZ_MIN
+ DIGBEEP_HZ_STEP / 2; /* round to nearest step */
if (hz < 0) if (hz < 0)
hz = 0; /* turn off PC beep*/ hz = 0; /* turn off PC beep*/
else if (hz >= (DIGBEEP_HZ_MAX - DIGBEEP_HZ_MIN)) else if (hz >= (DIGBEEP_HZ_MAX - DIGBEEP_HZ_MIN))
hz = 0xff; hz = 1; /* max frequency */
else { else {
hz /= DIGBEEP_HZ_STEP; hz /= DIGBEEP_HZ_STEP;
hz++; hz = 255 - hz;
} }
return hz; return hz;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment