diff options
author | cg <cg@FreeBSD.org> | 2001-05-27 14:39:34 +0000 |
---|---|---|
committer | cg <cg@FreeBSD.org> | 2001-05-27 14:39:34 +0000 |
commit | ebee48177eba658fc1e6a0c8c80a5eb647eb6e81 (patch) | |
tree | 416a9ecc7483305f73414c3d48f22be3cb7dabbf /sys/dev | |
parent | 55f1baae2740dae2b347d665841eb00b6795772c (diff) | |
download | FreeBSD-src-ebee48177eba658fc1e6a0c8c80a5eb647eb6e81.zip FreeBSD-src-ebee48177eba658fc1e6a0c8c80a5eb647eb6e81.tar.gz |
don't erase info in sndbuf_setup()
set free'd pointers to NULL in sndbuf_free()
add a new function
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/sound/pcm/buffer.c | 29 | ||||
-rw-r--r-- | sys/dev/sound/pcm/buffer.h | 1 |
2 files changed, 24 insertions, 6 deletions
diff --git a/sys/dev/sound/pcm/buffer.c b/sys/dev/sound/pcm/buffer.c index ddc3219..3cdbf0a 100644 --- a/sys/dev/sound/pcm/buffer.c +++ b/sys/dev/sound/pcm/buffer.c @@ -100,7 +100,6 @@ sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, unsigned int size) int sndbuf_setup(struct snd_dbuf *b, void *buf, unsigned int size) { - bzero(b, sizeof(*b)); b->buf = buf; b->maxsize = size; b->bufsize = b->maxsize; @@ -119,6 +118,8 @@ sndbuf_free(struct snd_dbuf *b) if (b->dmamap && b->buf) bus_dmamem_free(b->dmatag, b->buf, b->dmamap); + b->dmamap = NULL; + b->buf = NULL; } int @@ -186,11 +187,6 @@ sndbuf_clear(struct snd_dbuf *b, unsigned int length) else data = 0x80; - if (b->fmt & AFMT_16BIT) - data <<= 8; - else - data |= data << 8; - i = sndbuf_getfreeptr(b); p = sndbuf_getbuf(b); while (length > 0) { @@ -203,6 +199,25 @@ sndbuf_clear(struct snd_dbuf *b, unsigned int length) } void +sndbuf_fillsilence(struct snd_dbuf *b) +{ + int i; + u_char data, *p; + + if (b->fmt & AFMT_SIGNED) + data = 0x00; + else + data = 0x80; + + i = 0; + p = sndbuf_getbuf(b); + while (i < b->bufsize) + p[i++] = data; + b->rp = 0; + b->rl = b->bufsize; +} + +void sndbuf_reset(struct snd_dbuf *b) { b->hp = 0; @@ -510,6 +525,8 @@ sndbuf_uiomove(struct snd_dbuf *b, struct uio *uio, unsigned int count) int sndbuf_feed(struct snd_dbuf *from, struct snd_dbuf *to, struct pcm_channel *channel, struct pcm_feeder *feeder, unsigned int count) { + KASSERT(count > 0, ("can't feed 0 bytes")); + if (sndbuf_getfree(to) < count) return EINVAL; diff --git a/sys/dev/sound/pcm/buffer.h b/sys/dev/sound/pcm/buffer.h index 53ac279..2a57b22 100644 --- a/sys/dev/sound/pcm/buffer.h +++ b/sys/dev/sound/pcm/buffer.h @@ -45,6 +45,7 @@ int sndbuf_resize(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz); int sndbuf_remalloc(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz); void sndbuf_reset(struct snd_dbuf *b); void sndbuf_clear(struct snd_dbuf *b, unsigned int length); +void sndbuf_fillsilence(struct snd_dbuf *b); u_int32_t sndbuf_getfmt(struct snd_dbuf *b); int sndbuf_setfmt(struct snd_dbuf *b, u_int32_t fmt); |