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