summaryrefslogtreecommitdiff
path: root/sys/dev/sound
diff options
context:
space:
mode:
authorAriff Abdullah <ariff@FreeBSD.org>2007-02-04 06:17:48 +0000
committerAriff Abdullah <ariff@FreeBSD.org>2007-02-04 06:17:48 +0000
commit7040bb9cb7e18a242be8519ab82a86693c932367 (patch)
tree45b449578a1f9131cd33a9cedaf8731e26298fe3 /sys/dev/sound
parent186c5813263e69224a6a1f3c031850bd43d0e784 (diff)
Notes
Diffstat (limited to 'sys/dev/sound')
-rw-r--r--sys/dev/sound/pcm/buffer.c10
-rw-r--r--sys/dev/sound/pcm/buffer.h1
2 files changed, 11 insertions, 0 deletions
diff --git a/sys/dev/sound/pcm/buffer.c b/sys/dev/sound/pcm/buffer.c
index b8570f7ad02a..bbfd6e339f8a 100644
--- a/sys/dev/sound/pcm/buffer.c
+++ b/sys/dev/sound/pcm/buffer.c
@@ -46,6 +46,10 @@ sndbuf_create(device_t dev, char *drv, char *desc, struct pcm_channel *channel)
void
sndbuf_destroy(struct snd_dbuf *b)
{
+ if (b->tmpbuf)
+ free(b->tmpbuf, M_DEVBUF);
+ if (!(b->flags & SNDBUF_F_MANAGED) && b->buf)
+ free(b->buf, M_DEVBUF);
free(b, M_DEVBUF);
}
@@ -85,6 +89,7 @@ sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, unsigned int size)
b->maxsize = size;
b->bufsize = b->maxsize;
b->buf_addr = 0;
+ b->flags |= SNDBUF_F_MANAGED;
if (bus_dmamem_alloc(b->dmatag, (void **)&b->buf, BUS_DMA_NOWAIT,
&b->dmamap))
return (ENOMEM);
@@ -104,6 +109,8 @@ 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)
{
+ if (buf)
+ b->flags |= SNDBUF_F_MANAGED;
b->buf = buf;
b->maxsize = size;
b->bufsize = b->maxsize;
@@ -117,6 +124,9 @@ sndbuf_free(struct snd_dbuf *b)
free(b->tmpbuf, M_DEVBUF);
b->tmpbuf = NULL;
+ if (!(b->flags & SNDBUF_F_MANAGED) && b->buf)
+ free(b->buf, M_DEVBUF);
+
if (b->dmamap)
bus_dmamap_unload(b->dmatag, b->dmamap);
diff --git a/sys/dev/sound/pcm/buffer.h b/sys/dev/sound/pcm/buffer.h
index 7b2bffbe127b..44c4420721ce 100644
--- a/sys/dev/sound/pcm/buffer.h
+++ b/sys/dev/sound/pcm/buffer.h
@@ -32,6 +32,7 @@
#define SNDBUF_F_DMA 0x00000001
#define SNDBUF_F_XRUN 0x00000002
#define SNDBUF_F_RUNNING 0x00000004
+#define SNDBUF_F_MANAGED 0x00000008
#define SNDBUF_NAMELEN 48