Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 22 Dec 2001 12:10:50 GMT
From:      yorickhardy@yahoo.com
To:        freebsd-hackers@freebsd.org
Subject:   patch for sb live record channel dead
Message-ID:  <200112221210.fBMCAo601226@Yorick.>

next in thread | raw e-mail | index | archive | help
This patch should fix the pcm0 recording channel dead error for the
sb live. This is my first patch, so I hope it applies correctly.
The patch is against stable, I do not believe it will work for current
but I might be able to fix this also if the problem is present in 
current.

(the patch can be applied from /usr/src as the current directory.)

Yorick Hardy.

*** /home/yorick/FreeBSD/ctm/src/sys/dev/sound/pci/emu10k1.c	Wed Aug  1 23:32:24 2001
--- sys/dev/sound/pci/emu10k1.c	Tue Dec 21 11:01:14 1999
***************
*** 146,154 ****
};

static struct pcmchan_caps emu_reccaps[3] = {
- 	{8000, 48000, emu_rfmt_ac97, 0},
- 	{8000, 8000, emu_rfmt_mic, 0},
{48000, 48000, emu_rfmt_efx, 0},
};

static u_int32_t emu_pfmt[] = {
--- 146,154 ----
};

static struct pcmchan_caps emu_reccaps[3] = {
{48000, 48000, emu_rfmt_efx, 0},
+ 	{8000, 8000, emu_rfmt_mic, 0},
+ 	{8000, 48000, emu_rfmt_ac97, 0},
};

static u_int32_t emu_pfmt[] = {
***************
*** 765,771 ****
ch->spd = 8000;
ch->num = sc->rnum;
switch(sc->rnum) {
! 	case 0:
ch->idxreg = ADCIDX;
ch->basereg = ADCBA;
ch->sizereg = ADCBS;
--- 765,771 ----
ch->spd = 8000;
ch->num = sc->rnum;
switch(sc->rnum) {
! 	case 2:
ch->idxreg = ADCIDX;
ch->basereg = ADCBA;
ch->sizereg = ADCBS;
***************
*** 781,787 ****
ch->irqmask = INTE_MICBUFENABLE;
break;

! 	case 2:
ch->idxreg = FXIDX;
ch->basereg = FXBA;
ch->sizereg = FXBS;
--- 781,787 ----
ch->irqmask = INTE_MICBUFENABLE;
break;

! 	case 0:
ch->idxreg = FXIDX;
ch->basereg = FXBA;
ch->sizereg = FXBS;
***************
*** 815,825 ****
{
struct sc_rchinfo *ch = data;

! 	if (ch->num == 0)
speed = adcspeed[emu_recval(speed)];
if (ch->num == 1)
speed = 8000;
! 	if (ch->num == 2)
speed = 48000;
ch->spd = speed;
return ch->spd;
--- 815,825 ----
{
struct sc_rchinfo *ch = data;

! 	if (ch->num == 2)
speed = adcspeed[emu_recval(speed)];
if (ch->num == 1)
speed = 8000;
! 	if (ch->num == 0)
speed = 48000;
ch->spd = speed;
return ch->spd;
***************
*** 854,860 ****
case PCMTRIG_START:
ch->run = 1;
emu_wrptr(sc, 0, ch->sizereg, ADCBS_BUFSIZE_4096);
! 		if (ch->num == 0) {
val = ADCCR_LCHANENABLE;
if (ch->fmt & AFMT_STEREO)
val |= ADCCR_RCHANENABLE;
--- 854,860 ----
case PCMTRIG_START:
ch->run = 1;
emu_wrptr(sc, 0, ch->sizereg, ADCBS_BUFSIZE_4096);
! 		if (ch->num == 2) {
val = ADCCR_LCHANENABLE;
if (ch->fmt & AFMT_STEREO)
val |= ADCCR_RCHANENABLE;
***************
*** 939,946 ****

if (stat & (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL)) {
ack |= stat & (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL);
! 			if (sc->rch[0].channel)
! 				chn_intr(sc->rch[0].channel);
}
if (stat & (IPR_MICBUFFULL | IPR_MICBUFHALFFULL)) {
ack |= stat & (IPR_MICBUFFULL | IPR_MICBUFHALFFULL);
--- 939,946 ----

if (stat & (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL)) {
ack |= stat & (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL);
! 			if (sc->rch[2].channel)
! 				chn_intr(sc->rch[2].channel);
}
if (stat & (IPR_MICBUFFULL | IPR_MICBUFHALFFULL)) {
ack |= stat & (IPR_MICBUFFULL | IPR_MICBUFHALFFULL);
***************
*** 949,956 ****
}
if (stat & (IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL)) {
ack |= stat & (IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL);
! 			if (sc->rch[2].channel)
! 				chn_intr(sc->rch[2].channel);
}
if (stat & IPR_PCIERROR) {
ack |= IPR_PCIERROR;
--- 949,956 ----
}
if (stat & (IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL)) {
ack |= stat & (IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL);
! 			if (sc->rch[0].channel)
! 				chn_intr(sc->rch[0].channel);
}
if (stat & IPR_PCIERROR) {
ack |= IPR_PCIERROR;


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




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