kern/84728: [sound] [patch] ac97 broken mixing capabilities
checking
Michael Seyfert
michaels at sdf.lonestar.org
Wed Aug 10 23:30:21 GMT 2005
The following reply was made to PR kern/84728; it has been noted by GNATS.
From: Michael Seyfert <michaels at sdf.lonestar.org>
To: bug-followup at FreeBSD.org
Cc: skywizard at MyBSD.org.my
Subject: Re: kern/84728: [sound] [patch] ac97 broken mixing capabilities checking
Date: Wed, 10 Aug 2005 23:24:13 +0000
> Please try this patch:
>
> --- sys/dev/sound/pcm/ac97.c.orig Thu Aug 11 01:50:30 2005
> +++ sys/dev/sound/pcm/ac97.c Thu Aug 11 01:52:35 2005
> @@ -608,33 +608,40 @@
> if (codec_patch)
> codec_patch(codec);
>
> + /*
> + * YES. Do ac97_rdcd() T W I C E.
> + */
> for (i = 0; i < 32; i++) {
> k = codec->noext? codec->mix[i].enable : 1;
> if (k && (codec->mix[i].reg > 0)) {
> + (void)ac97_rdcd(codec, codec->mix[i].reg);
> j = old = ac97_rdcd(codec, codec->mix[i].reg);
> if (!(j & 0x8000)) {
> ac97_wrcd(codec, codec->mix[i].reg, j | 0x8000);
> + (void)ac97_rdcd(codec, codec->mix[i].reg);
> j = ac97_rdcd(codec, codec->mix[i].reg);
> }
> if ((j & 0x8000)) {
> - j = ((1 << 6) - 1) << codec->mix[i].ofs;
> + j = ((1 << codec->mix[i].bits) - 1) << codec->mix[i].ofs;
> if (codec->mix[i].mute)
> j |= 0x8000;
> ac97_wrcd(codec, codec->mix[i].reg, j);
> - j = ac97_rdcd(codec, codec->mix[i].reg) & j;
> - j >>= codec->mix[i].ofs;
> + (void)ac97_rdcd(codec, codec->mix[i].reg);
> + k = ac97_rdcd(codec, codec->mix[i].reg) & (j & ~0x8000);
> + k >>= codec->mix[i].ofs;
> if (codec->mix[i].reg == AC97_MIX_TONE &&
> - ((j & 0x0001) == 0x0000))
> - j >>= 1;
> - for (k = 0; j != 0; k++)
> - j >>= 1;
> + ((k & 0x0001) == 0x0000))
> + k >>= 1;
> for (j = 0; k != 0; j++)
> k >>= 1;
> if (j != 0) {
> - codec->mix[i].enable = 1;
> #if 0
> - codec->mix[i].bits = j;
> + device_printf(codec->dev,
> + "%d: %d -> %d\n",
> + i, codec->mix[i].bits, j);
> #endif
> + codec->mix[i].enable = 1;
> + codec->mix[i].bits = j;
> } else
> codec->mix[i].enable = 0;
> } else
>
>
> --
>
> Ariff Abdullah
> MyBSD
>
> http://www.MyBSD.org.my (IPv6/IPv4)
> http://staff.MyBSD.org.my (IPv6/IPv4)
> http://tomoyo.MyBSD.org.my (IPv6/IPv4)
>
No good.. please try this one:
--- sys/dev/sound/pcm/ac97.c.orig Wed Aug 10 16:25:42 2005
+++ sys/dev/sound/pcm/ac97.c Wed Aug 10 16:25:53 2005
@@ -618,25 +618,12 @@
}
if ((j & 0x8000)) {
j = ((1 << 6) - 1) << codec->mix[i].ofs;
- if (codec->mix[i].mute)
- j |= 0x8000;
ac97_wrcd(codec, codec->mix[i].reg, j);
j = ac97_rdcd(codec, codec->mix[i].reg) & j;
j >>= codec->mix[i].ofs;
- if (codec->mix[i].reg == AC97_MIX_TONE &&
- ((j & 0x0001) == 0x0000))
- j >>= 1;
- for (k = 0; j != 0; k++)
- j >>= 1;
- for (j = 0; k != 0; j++)
- k >>= 1;
- if (j != 0) {
- codec->mix[i].enable = 1;
-#if 0
- codec->mix[i].bits = j;
-#endif
- } else
- codec->mix[i].enable = 0;
+ codec->mix[i].enable = (j != 0 && j != old)? 1 : 0;
+ for (k = 1; j & (1 << k); k++);
+ codec->mix[i].bits = j? k : 0;
} else
codec->mix[i].enable = 0;
ac97_wrcd(codec, codec->mix[i].reg, old);
More information about the freebsd-bugs
mailing list