diff options
author | ariff <ariff@FreeBSD.org> | 2007-03-16 17:15:33 +0000 |
---|---|---|
committer | ariff <ariff@FreeBSD.org> | 2007-03-16 17:15:33 +0000 |
commit | c6b6d0211332031fa7da49d63ef1b36207f06475 (patch) | |
tree | 9fe70166493a7a61859819b7eacda0ea2f4457ec /sys | |
parent | 8f3b53673a4017a05dffacbfc9680a9447c5bed4 (diff) | |
download | FreeBSD-src-c6b6d0211332031fa7da49d63ef1b36207f06475.zip FreeBSD-src-c6b6d0211332031fa7da49d63ef1b36207f06475.tar.gz |
[stage: 4/9]
- Rearrange FEEDER_* constants starting from 0 to 31, so the future
additions will be much easier and consistent.
- Introduce FEEDER_SWAPLR. Few super broken hardwares (found on several
extremely cheap uaudio stick, possibly others) mistakenly wired left
and right channels wrongly, screwing output or input.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/sound/pcm/channel.c | 2 | ||||
-rw-r--r-- | sys/dev/sound/pcm/feeder.c | 77 | ||||
-rw-r--r-- | sys/dev/sound/pcm/feeder.h | 15 | ||||
-rw-r--r-- | sys/dev/sound/pcm/sound.h | 2 |
4 files changed, 64 insertions, 32 deletions
diff --git a/sys/dev/sound/pcm/channel.c b/sys/dev/sound/pcm/channel.c index 3fd8a3e..b3ac7ba4 100644 --- a/sys/dev/sound/pcm/channel.c +++ b/sys/dev/sound/pcm/channel.c @@ -1795,7 +1795,7 @@ chn_buildfeeder(struct pcm_channel *c) DEB(printf("feederflags %x\n", flags)); - for (type = FEEDER_RATE; type <= FEEDER_LAST; type++) { + for (type = FEEDER_RATE; type < FEEDER_LAST; type++) { if (flags & (1 << type)) { desc.type = type; desc.in = 0; diff --git a/sys/dev/sound/pcm/feeder.c b/sys/dev/sound/pcm/feeder.c index 2cd7323..42a2835 100644 --- a/sys/dev/sound/pcm/feeder.c +++ b/sys/dev/sound/pcm/feeder.c @@ -37,8 +37,40 @@ MALLOC_DEFINE(M_FEEDER, "feeder", "pcm feeder"); int feeder_buffersize = FEEDBUFSZ; TUNABLE_INT("hw.snd.feeder_buffersize", &feeder_buffersize); + +#ifdef SND_DEBUG +static int +sysctl_hw_snd_feeder_buffersize(SYSCTL_HANDLER_ARGS) +{ + int i, err, val; + + val = feeder_buffersize; + err = sysctl_handle_int(oidp, &val, sizeof(val), req); + + if (err != 0 || req->newptr == NULL) + return err; + + if (val < FEEDBUFSZ_MIN || val > FEEDBUFSZ_MAX) + return EINVAL; + + i = 0; + while (val >> i) + i++; + i = 1 << i; + if (i > val && (i >> 1) > 0 && (i >> 1) >= ((val * 3) >> 2)) + i >>= 1; + + feeder_buffersize = i; + + return err; +} +SYSCTL_PROC(_hw_snd, OID_AUTO, feeder_buffersize, CTLTYPE_INT | CTLFLAG_RW, + 0, sizeof(int), sysctl_hw_snd_feeder_buffersize, "I", + "feeder buffer size"); +#else SYSCTL_INT(_hw_snd, OID_AUTO, feeder_buffersize, CTLFLAG_RD, &feeder_buffersize, FEEDBUFSZ, "feeder buffer size"); +#endif struct feedertab_entry { SLIST_ENTRY(feedertab_entry) link; @@ -824,10 +856,9 @@ feed_root(struct pcm_feeder *feeder, struct pcm_channel *ch, u_int8_t *buffer, u offset, count, l, ch->feedcount); if (ch->feedcount == 1) { - if (offset > 0) - memset(buffer, - sndbuf_zerodata(sndbuf_getfmt(src)), - offset); + memset(buffer, + sndbuf_zerodata(sndbuf_getfmt(src)), + offset); if (l > 0) sndbuf_dispose(src, buffer + offset, l); else @@ -835,34 +866,32 @@ feed_root(struct pcm_feeder *feeder, struct pcm_channel *ch, u_int8_t *buffer, u } else { if (l > 0) sndbuf_dispose(src, buffer, l); - if (offset > 0) { #if 1 + memset(buffer + l, + sndbuf_zerodata(sndbuf_getfmt(src)), + offset); + if (!(ch->flags & CHN_F_CLOSING)) + ch->xruns++; +#else + if (l < 1 || (ch->flags & CHN_F_CLOSING)) { memset(buffer + l, sndbuf_zerodata(sndbuf_getfmt(src)), offset); if (!(ch->flags & CHN_F_CLOSING)) ch->xruns++; -#else - if (l < 1 || (ch->flags & CHN_F_CLOSING)) { - memset(buffer + l, - sndbuf_zerodata(sndbuf_getfmt(src)), - offset); - if (!(ch->flags & CHN_F_CLOSING)) - ch->xruns++; - } else { - int cp, tgt; - - tgt = l; - while (offset > 0) { - cp = min(l, offset); - memcpy(buffer + tgt, buffer, cp); - offset -= cp; - tgt += cp; - } - ch->xruns++; + } else { + int cp, tgt; + + tgt = l; + while (offset > 0) { + cp = min(l, offset); + memcpy(buffer + tgt, buffer, cp); + offset -= cp; + tgt += cp; } -#endif + ch->xruns++; } +#endif } } else if (l > 0) sndbuf_dispose(src, buffer, l); diff --git a/sys/dev/sound/pcm/feeder.h b/sys/dev/sound/pcm/feeder.h index a3985c0..6bb0741 100644 --- a/sys/dev/sound/pcm/feeder.h +++ b/sys/dev/sound/pcm/feeder.h @@ -74,13 +74,14 @@ static struct feeder_class feeder ## _class = { \ }; \ SYSINIT(feeder, SI_SUB_DRIVERS, SI_ORDER_ANY, feeder_register, &feeder ## _class); -#define FEEDER_ROOT 1 -#define FEEDER_FMT 2 -#define FEEDER_MIXER 3 -#define FEEDER_RATE 4 -#define FEEDER_FILTER 5 -#define FEEDER_VOLUME 6 -#define FEEDER_LAST FEEDER_VOLUME +#define FEEDER_ROOT 0 +#define FEEDER_FMT 1 +#define FEEDER_MIXER 2 +#define FEEDER_RATE 3 +#define FEEDER_FILTER 4 +#define FEEDER_VOLUME 5 +#define FEEDER_SWAPLR 6 +#define FEEDER_LAST 32 #define FEEDRATE_SRC 1 #define FEEDRATE_DST 2 diff --git a/sys/dev/sound/pcm/sound.h b/sys/dev/sound/pcm/sound.h index b62b1a5..ab61e6e 100644 --- a/sys/dev/sound/pcm/sound.h +++ b/sys/dev/sound/pcm/sound.h @@ -138,6 +138,8 @@ nomenclature: #define SD_F_SIMPLEX 0x00000001 #define SD_F_AUTOVCHAN 0x00000002 #define SD_F_SOFTPCMVOL 0x00000004 +#define SD_F_PSWAPLR 0x00000008 +#define SD_F_RSWAPLR 0x00000010 #define SD_F_PRIO_RD 0x10000000 #define SD_F_PRIO_WR 0x20000000 #define SD_F_PRIO_SET (SD_F_PRIO_RD | SD_F_PRIO_WR) |