summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorariff <ariff@FreeBSD.org>2007-03-16 17:15:33 +0000
committerariff <ariff@FreeBSD.org>2007-03-16 17:15:33 +0000
commitc6b6d0211332031fa7da49d63ef1b36207f06475 (patch)
tree9fe70166493a7a61859819b7eacda0ea2f4457ec /sys
parent8f3b53673a4017a05dffacbfc9680a9447c5bed4 (diff)
downloadFreeBSD-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.c2
-rw-r--r--sys/dev/sound/pcm/feeder.c77
-rw-r--r--sys/dev/sound/pcm/feeder.h15
-rw-r--r--sys/dev/sound/pcm/sound.h2
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)
OpenPOWER on IntegriCloud