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