kern/91683: "bug" on sound driver & solution

Marc Flambard marc-pub at sarambard.homedns.org
Wed Jan 11 13:00:22 PST 2006


>Number:         91683
>Category:       kern
>Synopsis:       "bug" on sound driver & solution
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jan 11 21:00:19 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Marc Flambard
>Release:        6.0
>Organization:
RAC Technologie
>Environment:
FreeBSD pc-marc1.maison 6.0-STABLE FreeBSD 6.0-STABLE #21: Tue Jan 10 17:10:37 CET 2006     marc at pc-marc1.maison:/usr/obj/usr/src/sys/pc-marc-v3  i386
>Description:
I found "bug" on sound driver (channel.c,v 1.99.2.1 & feeder.c,v 1.33.2.1).
I use CS4630 based sound card (minimum 11025Hz at recording).

Changing format capacity for record channel on csa driver(csapcm.c),
reveals some interesting things.
I show you sndstat on 2 situations (I use application that require 8Khz mono)

WITH:
static u_int32_t csa_recfmt[] = {
	AFMT_S16_LE,
	AFMT_STEREO | AFMT_S16_LE,
	0
};
SNDSTAT:
{hardware} -> feeder_root(0x10000010) -> feeder_rate(11025 -> 8000) -> feeder_stereotomono16(0x10000010 -> 0x00000010) -> {userland}

here everything is ok.

WITH:
static u_int32_t csa_recfmt[] = {
	AFMT_STEREO | AFMT_S16_LE,
	AFMT_S16_LE,
	0
};
SNDSTAT:
{hardware} -> feeder_root(0x00000010) -> feeder_monotostereo16(0x00000010 -> 0x10000010) -> feeder_rate(11025 -> 8000) -> feeder_stereotomono16(0x10000010 -> 0x00000010) -> {userland}

why using mono capacity with feeder_monotostereo whereas the hardware is able to deliver stereo?

>How-To-Repeat:
change record format order of your sound card
example for csa:
static u_int32_t csa_recfmt[] = {
	AFMT_S16_LE,
	AFMT_STEREO | AFMT_S16_LE,
	0
};
change by:
static u_int32_t csa_recfmt[] = {
	AFMT_STEREO | AFMT_S16_LE,
	AFMT_S16_LE,
	0
};

>Fix:
In function feeder_fmtchain(feeder.c):
if we test maxdepth before testing validity,
the function chn_fmtchain(feeder.c) will be able to
distinguish the difference between [feeder_root->feeder_monotostereo16->feeder_rate]
and [feeder_root->feeder_rate] without dependency on format arrangement and
without changes made between feeder.c-v1.33 and v1.33.2.1 (particularly reverse scanning!).
Moreover this change simplify chn_buildfeeder(channel.c).

I join diffs and tests with debug messages.

Marc Flambard

Tests with debug messages:

-----ACTUALLY-----

WITH:
static u_int32_t csa_recfmt[] = {
	AFMT_S16_LE,
	AFMT_STEREO | AFMT_S16_LE,
	0
};
SNDSTAT:
{hardware} -> feeder_root(0x10000010) -> feeder_rate(11025 -> 8000) -> feeder_stereotomono16(0x10000010 -> 0x00000010) -> {userland}
DEBUG:
Jan 11 15:55:46 pc-marc1 kernel: setspeed, channel pcm0:record:0
Jan 11 15:55:46 pc-marc1 kernel: want speed 8000, try speed 11025, got speed 11025
Jan 11 15:55:46 pc-marc1 kernel: feederflags 10
Jan 11 15:55:46 pc-marc1 kernel: find feeder type 4, got 0xc76efce0
Jan 11 15:55:46 pc-marc1 kernel: chn_buildfeeder>>type:4
Jan 11 15:55:46 pc-marc1 kernel: chn_buildfeeder>>c->format:00000010
Jan 11 15:55:46 pc-marc1 kernel: chn_buildfeeder>>fc->desc->in:10000010
Jan 11 15:55:46 pc-marc1 kernel: chn_buildfeeder>>fc->desc->out:10000010
Jan 11 15:55:46 pc-marc1 kernel: chn_buildfeeder>>c->feeder->desc->out:00000010
Jan 11 15:55:46 pc-marc1 kernel: chn_buildfeeder>>fmtlist[0]:00000010
Jan 11 15:55:46 pc-marc1 kernel: chn_buildfeeder>>fmtlist[1]:10000010
Jan 11 15:55:46 pc-marc1 kernel: build fmtchain from 0x10 to 0x10000010:
Jan 11 15:55:46 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_root (0 -> 10000010)...
Jan 11 15:55:46 pc-marc1 kernel: got it
Jan 11 15:55:46 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_root (0 -> 10)...
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_endian16 (10 -> 20)...
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_sign16le (10 -> 80)...
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_monotostereo16 (10 -> 10000010)...
Jan 11 15:55:46 pc-marc1 kernel: got it
Jan 11 15:55:46 pc-marc1 kernel: call feeder_fmtchain for best chain (maxdepth=0)
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_root (0 -> 10000010)...
Jan 11 15:55:46 pc-marc1 kernel: got it
Jan 11 15:55:46 pc-marc1 kernel: ok
Jan 11 15:55:46 pc-marc1 kernel: added feeder 0xc76efce0, output 0x10000010
Jan 11 15:55:46 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_rate (10000010 -> 10000010)...
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_endian16 (10000010 -> 10000020)...
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_sign16le (10000010 -> 10000080)...
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_stereotomono16 (10000010 -> 10)...
Jan 11 15:55:46 pc-marc1 kernel: got it
Jan 11 15:55:46 pc-marc1 kernel: call feeder_fmtchain for best chain (maxdepth=0)
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_rate (10000010 -> 10000010)...
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_endian16 (10000010 -> 10000020)...
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_sign16le (10000010 -> 10000080)...
Jan 11 15:55:46 pc-marc1 kernel: trying feeder_stereotomono16 (10000010 -> 10)...
Jan 11 15:55:46 pc-marc1 kernel: got it
Jan 11 15:55:46 pc-marc1 kernel: r = 0
Jan 11 15:55:46 pc-marc1 kernel: chn_setblocksize(0, 0)
Jan 11 15:55:46 pc-marc1 kernel: feedrate = 0xc5e26180
Jan 11 15:55:46 pc-marc1 kernel: feeder_set(FEEDRATE_SRC, 11025) = 0
Jan 11 15:55:46 pc-marc1 kernel: feeder_set(FEEDRATE_DST, 8000) = 0
Jan 11 15:55:46 pc-marc1 kernel: setspeed done, r = 0

WITH:
static u_int32_t csa_recfmt[] = {
	AFMT_STEREO | AFMT_S16_LE,
	AFMT_S16_LE,
	0
};
SNDSTAT:
{hardware} -> feeder_root(0x00000010) -> feeder_monotostereo16(0x00000010 -> 0x10000010) -> feeder_rate(11025 -> 8000) -> feeder_stereotomono16(0x10000010 -> 0x00000010) -> {userland}
DEBUG:
Jan 11 15:59:21 pc-marc1 kernel: setspeed, channel pcm0:record:0
Jan 11 15:59:21 pc-marc1 kernel: want speed 8000, try speed 11025, got speed 11025
Jan 11 15:59:21 pc-marc1 kernel: feederflags 10
Jan 11 15:59:21 pc-marc1 kernel: find feeder type 4, got 0xc76efce0
Jan 11 15:59:21 pc-marc1 kernel: chn_buildfeeder>>type:4
Jan 11 15:59:21 pc-marc1 kernel: chn_buildfeeder>>c->format:00000010
Jan 11 15:59:21 pc-marc1 kernel: chn_buildfeeder>>fc->desc->in:10000010
Jan 11 15:59:21 pc-marc1 kernel: chn_buildfeeder>>fc->desc->out:10000010
Jan 11 15:59:21 pc-marc1 kernel: chn_buildfeeder>>c->feeder->desc->out:00000010
Jan 11 15:59:21 pc-marc1 kernel: chn_buildfeeder>>fmtlist[0]:10000010
Jan 11 15:59:21 pc-marc1 kernel: chn_buildfeeder>>fmtlist[1]:00000010
Jan 11 15:59:21 pc-marc1 kernel: build fmtchain from 0x10 to 0x10000010:
Jan 11 15:59:21 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_root (0 -> 10)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_endian16 (10 -> 20)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_sign16le (10 -> 80)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_monotostereo16 (10 -> 10000010)...
Jan 11 15:59:21 pc-marc1 kernel: got it
Jan 11 15:59:21 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_root (0 -> 10000010)...
Jan 11 15:59:21 pc-marc1 kernel: got it
Jan 11 15:59:21 pc-marc1 kernel: call feeder_fmtchain for best chain (maxdepth=0)
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_root (0 -> 10)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_endian16 (10 -> 20)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_sign16le (10 -> 80)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_monotostereo16 (10 -> 10000010)...
Jan 11 15:59:21 pc-marc1 kernel: got it
Jan 11 15:59:21 pc-marc1 kernel: ok
Jan 11 15:59:21 pc-marc1 kernel: added feeder 0xc76efce0, output 0x10000010
Jan 11 15:59:21 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_rate (10000010 -> 10000010)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_endian16 (10000010 -> 10000020)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_sign16le (10000010 -> 10000080)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_stereotomono16 (10000010 -> 10)...
Jan 11 15:59:21 pc-marc1 kernel: got it
Jan 11 15:59:21 pc-marc1 kernel: call feeder_fmtchain for best chain (maxdepth=0)
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_rate (10000010 -> 10000010)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_endian16 (10000010 -> 10000020)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_sign16le (10000010 -> 10000080)...
Jan 11 15:59:21 pc-marc1 kernel: trying feeder_stereotomono16 (10000010 -> 10)...
Jan 11 15:59:21 pc-marc1 kernel: got it
Jan 11 15:59:21 pc-marc1 kernel: r = 0
Jan 11 15:59:21 pc-marc1 kernel: chn_setblocksize(0, 0)
Jan 11 15:59:21 pc-marc1 kernel: feedrate = 0xc5e1eac0
Jan 11 15:59:21 pc-marc1 kernel: feeder_set(FEEDRATE_SRC, 11025) = 0
Jan 11 15:59:21 pc-marc1 kernel: feeder_set(FEEDRATE_DST, 8000) = 0
Jan 11 15:59:21 pc-marc1 kernel: setspeed done, r = 0

-----WITH MY MODIFICATIONS-----

WITH:
static u_int32_t csa_recfmt[] = {
	AFMT_S16_LE,
	AFMT_STEREO | AFMT_S16_LE,
SNDSTAT:
{hardware} -> feeder_root(0x10000010) -> feeder_rate(11025 -> 8000) -> feeder_stereotomono16(0x10000010 -> 0x00000010) -> {userland}
DEBUG:
Jan 11 15:29:17 pc-marc1 kernel: setspeed, channel pcm0:record:0
Jan 11 15:29:17 pc-marc1 kernel: want speed 8000, try speed 11025, got speed 11025
Jan 11 15:29:17 pc-marc1 kernel: feederflags 10
Jan 11 15:29:17 pc-marc1 kernel: find feeder type 4, got 0xc752ac40
Jan 11 15:29:17 pc-marc1 kernel: chn_buildfeeder>>type:4
Jan 11 15:29:17 pc-marc1 kernel: chn_buildfeeder>>c->format:00000010
Jan 11 15:29:17 pc-marc1 kernel: chn_buildfeeder>>fc->desc->in:10000010
Jan 11 15:29:17 pc-marc1 kernel: chn_buildfeeder>>fc->desc->out:10000010
Jan 11 15:29:17 pc-marc1 kernel: chn_buildfeeder>>c->feeder->desc->out:00000010
Jan 11 15:29:17 pc-marc1 kernel: chn_buildfeeder>>fmtlist[0]:00000010
Jan 11 15:29:17 pc-marc1 kernel: chn_buildfeeder>>fmtlist[1]:10000010
Jan 11 15:29:17 pc-marc1 kernel: build fmtchain from 0x10 to 0x10000010:
Jan 11 15:29:17 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_root (0 -> 10)...
Jan 11 15:29:17 pc-marc1 kernel: call feeder_fmtchain with maxdepth=1
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_root (0 -> 10)...
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_endian16 (10 -> 20)...
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_sign16le (10 -> 80)...
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_monotostereo16 (10 -> 10000010)...
Jan 11 15:29:17 pc-marc1 kernel: got it
Jan 11 15:29:17 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_root (0 -> 10000010)...
Jan 11 15:29:17 pc-marc1 kernel: got it
Jan 11 15:29:17 pc-marc1 kernel: call feeder_fmtchain for best chain (maxdepth=0)
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_root (0 -> 10000010)...
Jan 11 15:29:17 pc-marc1 kernel: got it
Jan 11 15:29:17 pc-marc1 kernel: ok
Jan 11 15:29:17 pc-marc1 kernel: added feeder 0xc752ac40, output 0x10000010
Jan 11 15:29:17 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_rate (10000010 -> 10000010)...
Jan 11 15:29:17 pc-marc1 kernel: call feeder_fmtchain with maxdepth=1
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_rate (10000010 -> 10000010)...
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_endian16 (10000010 -> 10000020)...
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_sign16le (10000010 -> 10000080)...
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_stereotomono16 (10000010 -> 10)...
Jan 11 15:29:17 pc-marc1 kernel: got it
Jan 11 15:29:17 pc-marc1 kernel: call feeder_fmtchain for best chain (maxdepth=1)
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_rate (10000010 -> 10000010)...
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_endian16 (10000010 -> 10000020)...
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_sign16le (10000010 -> 10000080)...
Jan 11 15:29:17 pc-marc1 kernel: trying feeder_stereotomono16 (10000010 -> 10)...
Jan 11 15:29:17 pc-marc1 kernel: got it
Jan 11 15:29:17 pc-marc1 kernel: r = 0
Jan 11 15:29:17 pc-marc1 kernel: chn_setblocksize(0, 0)
Jan 11 15:29:17 pc-marc1 kernel: feedrate = 0xc5669000
Jan 11 15:29:17 pc-marc1 kernel: feeder_set(FEEDRATE_SRC, 11025) = 0
Jan 11 15:29:17 pc-marc1 kernel: feeder_set(FEEDRATE_DST, 8000) = 0
Jan 11 15:29:17 pc-marc1 kernel: setspeed done, r = 0

WITH:
static u_int32_t csa_recfmt[] = {
	AFMT_STEREO | AFMT_S16_LE,
	AFMT_S16_LE,
	0
};
SNDSTAT:
{hardware} -> feeder_root(0x10000010) -> feeder_rate(11025 -> 8000) -> feeder_stereotomono16(0x10000010 -> 0x00000010) -> {userland}
DEBUG:
Jan 11 15:39:02 pc-marc1 kernel: setspeed, channel pcm0:record:0
Jan 11 15:39:02 pc-marc1 kernel: want speed 8000, try speed 11025, got speed 11025
Jan 11 15:39:02 pc-marc1 kernel: feederflags 10
Jan 11 15:39:02 pc-marc1 kernel: find feeder type 4, got 0xc76efc40
Jan 11 15:39:02 pc-marc1 kernel: chn_buildfeeder>>type:4
Jan 11 15:39:02 pc-marc1 kernel: chn_buildfeeder>>c->format:00000010
Jan 11 15:39:02 pc-marc1 kernel: chn_buildfeeder>>fc->desc->in:10000010
Jan 11 15:39:02 pc-marc1 kernel: chn_buildfeeder>>fc->desc->out:10000010
Jan 11 15:39:02 pc-marc1 kernel: chn_buildfeeder>>c->feeder->desc->out:00000010
Jan 11 15:39:02 pc-marc1 kernel: chn_buildfeeder>>fmtlist[0]:10000010
Jan 11 15:39:02 pc-marc1 kernel: chn_buildfeeder>>fmtlist[1]:00000010
Jan 11 15:39:02 pc-marc1 kernel: build fmtchain from 0x10 to 0x10000010:
Jan 11 15:39:02 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_root (0 -> 10000010)...
Jan 11 15:39:02 pc-marc1 kernel: got it
Jan 11 15:39:02 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_root (0 -> 10)...
Jan 11 15:39:02 pc-marc1 kernel: call feeder_fmtchain with maxdepth=1
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_root (0 -> 10)...
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_endian16 (10 -> 20)...
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_sign16le (10 -> 80)...
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_monotostereo16 (10 -> 10000010)...
Jan 11 15:39:02 pc-marc1 kernel: got it
Jan 11 15:39:02 pc-marc1 kernel: call feeder_fmtchain for best chain (maxdepth=0)
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_root (0 -> 10000010)...
Jan 11 15:39:02 pc-marc1 kernel: got it
Jan 11 15:39:02 pc-marc1 kernel: ok
Jan 11 15:39:02 pc-marc1 kernel: added feeder 0xc76efc40, output 0x10000010
Jan 11 15:39:02 pc-marc1 kernel: call feeder_fmtchain with maxdepth=0
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_rate (10000010 -> 10000010)...
Jan 11 15:39:02 pc-marc1 kernel: call feeder_fmtchain with maxdepth=1
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_rate (10000010 -> 10000010)...
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_endian16 (10000010 -> 10000020)...
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_sign16le (10000010 -> 10000080)...
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_stereotomono16 (10000010 -> 10)...
Jan 11 15:39:02 pc-marc1 kernel: got it
Jan 11 15:39:02 pc-marc1 kernel: call feeder_fmtchain for best chain (maxdepth=1)
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_rate (10000010 -> 10000010)...
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_endian16 (10000010 -> 10000020)...
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_sign16le (10000010 -> 10000080)...
Jan 11 15:39:02 pc-marc1 kernel: trying feeder_stereotomono16 (10000010 -> 10)...
Jan 11 15:39:02 pc-marc1 kernel: got it
Jan 11 15:39:02 pc-marc1 kernel: r = 0
Jan 11 15:39:02 pc-marc1 kernel: chn_setblocksize(0, 0)
Jan 11 15:39:02 pc-marc1 kernel: feedrate = 0xc57ff8c0
Jan 11 15:39:02 pc-marc1 kernel: feeder_set(FEEDRATE_SRC, 11025) = 0
Jan 11 15:39:02 pc-marc1 kernel: feeder_set(FEEDRATE_DST, 8000) = 0
Jan 11 15:39:02 pc-marc1 kernel: setspeed done, r = 0


diffs:

-----channel.diff-----
1292c1292
< 	int err;
---
> 	int err,cnt;
1361,1372c1361,1375
< 			if ((type == FEEDER_RATE &&
< 					!fmtvalid(fc->desc->in, fmtlist))
< 					|| c->feeder->desc->out != fc->desc->in) {
<  				DEB(printf("build fmtchain from 0x%x to 0x%x: ", c->feeder->desc->out, fc->desc->in));
< 				tmp[0] = fc->desc->in;
< 				tmp[1] = 0;
< 				if (chn_fmtchain(c, tmp) == 0) {
< 					DEB(printf("failed\n"));
< 
< 					return ENODEV;
< 				}
<  				DEB(printf("ok\n"));
---
>  			DEB(printf("chn_buildfeeder>>c->format:%08x\n", c->format));
>  			DEB(printf("chn_buildfeeder>>fc->desc->in:%08x\n", fc->desc->in));
>  			DEB(printf("chn_buildfeeder>>fc->desc->out:%08x\n", fc->desc->out));
>  			DEB(printf("chn_buildfeeder>>c->feeder->desc->out:%08x\n", c->feeder->desc->out));
> 			cnt=-1;
> 			while(fmtlist[++cnt])
>  			   DEB(printf("chn_buildfeeder>>fmtlist[%i]:%08x\n", cnt, fmtlist[cnt]));
> 
>  			DEB(printf("build fmtchain to 0x%x:\n", fc->desc->in));
> 			tmp[0] = fc->desc->in;
> 			tmp[1] = 0;
> 			if (chn_fmtchain(c, tmp) == 0) {
> 				DEB(printf("failed\n"));
> 
> 				return ENODEV;
1373a1377
>  			DEB(printf("ok\n"));
1385,1396c1389,1394
< 	if (fmtvalid(c->feeder->desc->out, fmtlist)
< 			&& !(c->direction == PCMDIR_REC &&
< 				c->format != c->feeder->desc->out))
< 		hwfmt = c->feeder->desc->out;
< 	else {
< 		if (c->direction == PCMDIR_REC) {
< 			tmp[0] = c->format;
< 			tmp[1] = 0;
< 			hwfmt = chn_fmtchain(c, tmp);
< 		} else
< 			hwfmt = chn_fmtchain(c, fmtlist);
< 	}
---
> 	if (c->direction == PCMDIR_REC) {
> 		tmp[0] = c->format;
> 		tmp[1] = 0;
> 		hwfmt = chn_fmtchain(c, tmp);
> 	} else
> 		hwfmt = chn_fmtchain(c, fmtlist);

-----feeder.diff-----
268c268,271
< 	/* printf("trying %s (%x -> %x)...\n", source->class->name, source->desc->in, source->desc->out); */
---
> 	if (maxdepth < 0)
> 		return NULL;
> 
> 	DEB(printf("trying %s (%x -> %x)...\n", source->class->name, source->desc->in, source->desc->out)); 
270c273
< 		/* printf("got it\n"); */
---
> 		DEB(printf("got it\n")); 
274,276d276
< 	if (maxdepth < 0)
< 		return NULL;
< 
323,326c323
< 	while (from[i] != 0)
< 		i++;
< 	while (i > 0) {
< 		i--;
---
> 	while (from[i] != 0) {
330a328
> 			DEB(printf("call feeder_fmtchain with maxdepth=%i\n",max));
343a342
> 		i++;
348a348
> 	DEB(printf("call feeder_fmtchain for best chain (maxdepth=%i)\n",bestmax));
376,385c376
< 	if (c->direction == PCMDIR_REC) {
< 		try = c->feeder;
< 		while (try != NULL) {
< 			if (try->desc->type == FEEDER_ROOT)
< 				return try->desc->out;
< 			try = try->source;
< 		}
< 		return best;
< 	} else
< 		return c->feeder->desc->out;
---
> 	return (c->direction == PCMDIR_REC)? best : c->feeder->desc->out;


Marc Flambard
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list