Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 06 Nov 2005 21:49:11 +0900
From:      Watanabe Kazuhiro <CQG00620@nifty.ne.jp>
To:        freebsd-multimedia <freebsd-multimedia@freebsd.org>
Subject:   [patch] als4000.c recording mixer problem
Message-ID:  <20051106124900.7D4EF1E5F4@mail.asahi-net.or.jp>

next in thread | raw e-mail | index | archive | help
Hi, everyone.

I have an AOpen AW200 sound card which uses the AvanceLogic ALS4000
soundchip.

When I try to record from the card's line input with wavrec (a part of
ports/audio/wavplay) on FreeBSD 5.4, only record the left channel. The
right channel has no sound.


But on FreeBSD-7-current (CVSup'ed Nov. 5), it can record both left
and right channel.  It looks like correct, however, it also selects an
another input(s) to the recording source.

To find out this problem, add a bit of modify to
sys/dev/sound/pci/als4000.c and run mixer(1) command.

@@ -616,7 +616,9 @@ alsmix_setrecsrc(struct snd_mixer *m, u_
        if (src & SOUND_MASK_SYNTH)
                mask |= 0x60;
 
+printf("l=%x\n", l|mask);
        als_mix_wr(sc, SB16_IMASK_L, l|mask);
+printf("r=%x\n", r|mask);
        als_mix_wr(sc, SB16_IMASK_R, r|mask);
        return src;
 }


 * Environment

$ uname -a
FreeBSD scorpio.zodiac.org 7.0-CURRENT FreeBSD 7.0-CURRENT #3: Sat Nov  5 17:23:54 JST 2005     nabe@scorpio.zodiac.org:/FreeBSD/obj-current/FreeBSD/FreeBSD-current/src/sys/GENERIC  i386
$ cat /dev/sndstat
FreeBSD Audio Driver (newpcm)
Installed devices:
pcm0: <Avance Logic ALS4000> at io 0xe800 irq 9 kld snd_als4000 (1p/1r/0v channels duplex default)
pcm1: <SB16 DSP 4.13> at io 0x240 irq 5 drq 1:5 bufsz 4096d kld snd_sb16 (1p/1r/0v channels duplex)
pcm2: <CS423x> at io 0x534 irq 10 drq 3:0 bufsz 4096 (1p/1r/0v channels duplex)


 * Test commands and summary of the results

Command			Actual recording source
			Left channel	Right channel
--------------------------------------------------------
mixer =rec mic		mic		mic&cd
mixer =rec cd		dummy&cd	dummy&cd&line
mixer =rec line		dummy&line	line&dummy&synth

I've referred to the Avance Logic ALS4000 datasheet pp14 ("MX3D" and
"MX3E"). The datasheet is available from:
http://www.alsa-project.org/alsa/ftp/manuals/avance_logic/ALS4000a.PDF


It's a fix patch.

--- sys/dev/sound/pci/als4000.c.orig	Thu Oct  6 05:05:52 2005
+++ sys/dev/sound/pci/als4000.c	Sun Nov  6 20:20:56 2005
@@ -591,33 +591,23 @@ static int
 alsmix_setrecsrc(struct snd_mixer *m, u_int32_t src)
 {
 	struct sc_info *sc = mix_getdevinfo(m);
-	u_int32_t i, l, r, mask;
+	u_int32_t i, l, r;
 
 	for (i = l = r = 0; i < SOUND_MIXER_NRDEVICES; i++) {
 		if (src & (1 << i)) {
-			l |= amt[i].iselect;
-			r |= amt[i].iselect << 1;
+			if (amt[i].iselect == 1) {	/* microphone */
+				l |= amt[i].iselect;
+				r |= amt[i].iselect;
+			} else {
+				l |= amt[i].iselect;
+				r |= amt[i].iselect >> 1;
+			}
+
 		}
 	}
 
-	/* ALS mixer is really an SB16 mixer */
-
-	mask = 0;
-	
-	if (src & SOUND_MASK_MIC)
-		mask |= 0x01;
-		
-	if (src & SOUND_MASK_CD)
-		mask |= 0x06;
-		
-	if (src & SOUND_MASK_LINE)
-		mask |= 0x18;
-		
-	if (src & SOUND_MASK_SYNTH)
-		mask |= 0x60;
-		
-	als_mix_wr(sc, SB16_IMASK_L, l|mask);
-	als_mix_wr(sc, SB16_IMASK_R, r|mask);
+	als_mix_wr(sc, SB16_IMASK_L, l);
+	als_mix_wr(sc, SB16_IMASK_R, r);
 	return src;
 }
 
---
Watanabe Kazuhiro (CQG00620@nifty.ne.jp)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20051106124900.7D4EF1E5F4>