buffer.c revision 139749
1139749Simp/*-
2119853Scg * Copyright (c) 1999 Cameron Grant <cg@freebsd.org>
370291Scg * All rights reserved.
470291Scg *
570291Scg * Redistribution and use in source and binary forms, with or without
670291Scg * modification, are permitted provided that the following conditions
770291Scg * are met:
870291Scg * 1. Redistributions of source code must retain the above copyright
970291Scg *    notice, this list of conditions and the following disclaimer.
1070291Scg * 2. Redistributions in binary form must reproduce the above copyright
1170291Scg *    notice, this list of conditions and the following disclaimer in the
1270291Scg *    documentation and/or other materials provided with the distribution.
1370291Scg *
1470291Scg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1570291Scg * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1670291Scg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1770291Scg * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1870291Scg * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1970291Scg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2070291Scg * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2170291Scg * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2270291Scg * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2370291Scg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2470291Scg * SUCH DAMAGE.
2570291Scg */
2670291Scg
2770291Scg#include <dev/sound/pcm/sound.h>
2870291Scg
2974763Scg#include "feeder_if.h"
3074763Scg
3182180ScgSND_DECLARE_FILE("$FreeBSD: head/sys/dev/sound/pcm/buffer.c 139749 2005-01-06 01:43:34Z imp $");
3282180Scg
3374763Scgstruct snd_dbuf *
34125136Struckmansndbuf_create(device_t dev, char *drv, char *desc, struct pcm_channel *channel)
3574763Scg{
3674763Scg	struct snd_dbuf *b;
3774763Scg
38111119Simp	b = malloc(sizeof(*b), M_DEVBUF, M_WAITOK | M_ZERO);
3974763Scg	snprintf(b->name, SNDBUF_NAMELEN, "%s:%s", drv, desc);
4089834Scg	b->dev = dev;
41125136Struckman	b->channel = channel;
4289834Scg
4374763Scg	return b;
4474763Scg}
4574763Scg
4674763Scgvoid
4774763Scgsndbuf_destroy(struct snd_dbuf *b)
4874763Scg{
4974763Scg	free(b, M_DEVBUF);
5074763Scg}
5174763Scg
52111183Scognetbus_addr_t
53111183Scognetsndbuf_getbufaddr(struct snd_dbuf *buf)
54111183Scognet{
55111183Scognet	return (buf->buf_addr);
56111183Scognet}
57111183Scognet
5870291Scgstatic void
5970291Scgsndbuf_setmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
6070291Scg{
6174763Scg	struct snd_dbuf *b = (struct snd_dbuf *)arg;
6270291Scg
6370291Scg	if (bootverbose) {
64136531Syongari		device_printf(b->dev, "sndbuf_setmap %lx, %lx; ",
65136531Syongari		    (u_long)segs[0].ds_addr, (u_long)segs[0].ds_len);
66136531Syongari		printf("%p -> %lx\n", b->buf, (u_long)segs[0].ds_addr);
6770291Scg	}
68136531Syongari	if (error == 0)
69136531Syongari		b->buf_addr = segs[0].ds_addr;
70136531Syongari	else
71136531Syongari		b->buf_addr = 0;
7270291Scg}
7370291Scg
7470291Scg/*
7574763Scg * Allocate memory for DMA buffer. If the device does not use DMA transfers,
7674763Scg * the driver can call malloc(9) and sndbuf_setup() itself.
7770291Scg */
78111183Scognet
7970291Scgint
8074763Scgsndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, unsigned int size)
8170291Scg{
82136531Syongari	int ret;
83136531Syongari
8470291Scg	b->dmatag = dmatag;
8570291Scg	b->maxsize = size;
8670291Scg	b->bufsize = b->maxsize;
87136531Syongari	b->buf_addr = 0;
88136531Syongari	if (bus_dmamem_alloc(b->dmatag, (void **)&b->buf, BUS_DMA_NOWAIT,
89136531Syongari	    &b->dmamap))
90136531Syongari		return (ENOMEM);
91136531Syongari	if (bus_dmamap_load(b->dmatag, b->dmamap, b->buf, b->maxsize,
92136531Syongari	    sndbuf_setmap, b, 0) != 0 || b->buf_addr == 0) {
93136531Syongari		bus_dmamem_free(b->dmatag, b->buf, b->dmamap);
94136531Syongari		b->dmamap = NULL;
95136531Syongari		return (ENOMEM);
96136531Syongari	}
97136531Syongari
98136531Syongari	ret = sndbuf_resize(b, 2, b->maxsize / 2);
99136531Syongari	if (ret != 0)
100136531Syongari		sndbuf_free(b);
101136531Syongari	return (ret);
10270291Scg}
10370291Scg
10470291Scgint
10574763Scgsndbuf_setup(struct snd_dbuf *b, void *buf, unsigned int size)
10670291Scg{
10770291Scg	b->buf = buf;
10870291Scg	b->maxsize = size;
10970291Scg	b->bufsize = b->maxsize;
11070291Scg	return sndbuf_resize(b, 2, b->maxsize / 2);
11170291Scg}
11270291Scg
11370291Scgvoid
11474763Scgsndbuf_free(struct snd_dbuf *b)
11570291Scg{
11674763Scg	if (b->tmpbuf)
11774763Scg		free(b->tmpbuf, M_DEVBUF);
11874763Scg	b->tmpbuf = NULL;
11974763Scg
12074763Scg	if (b->dmamap)
12174797Scg		bus_dmamap_unload(b->dmatag, b->dmamap);
12274763Scg
12374763Scg	if (b->dmamap && b->buf)
12474797Scg		bus_dmamem_free(b->dmatag, b->buf, b->dmamap);
12577265Scg	b->dmamap = NULL;
12677265Scg	b->buf = NULL;
12770291Scg}
12870291Scg
12970291Scgint
13074763Scgsndbuf_resize(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz)
13170291Scg{
132125136Struckman	u_int8_t *tmpbuf, *f2;
133125136Struckman
134125136Struckman	chn_lock(b->channel);
13574763Scg	if (b->maxsize == 0)
136125136Struckman		goto out;
13770291Scg	if (blkcnt == 0)
13870291Scg		blkcnt = b->blkcnt;
13970291Scg	if (blksz == 0)
14070291Scg		blksz = b->blksz;
141125136Struckman	if (blkcnt < 2 || blksz < 16 || (blkcnt * blksz > b->maxsize)) {
142125136Struckman		chn_unlock(b->channel);
14370291Scg		return EINVAL;
144125136Struckman	}
14589834Scg	if (blkcnt == b->blkcnt && blksz == b->blksz)
146125136Struckman		goto out;
147125136Struckman
148125136Struckman	chn_unlock(b->channel);
149128730Sgreen	tmpbuf = malloc(blkcnt * blksz, M_DEVBUF, M_NOWAIT);
150125136Struckman	if (tmpbuf == NULL)
151125136Struckman		return ENOMEM;
152125136Struckman	chn_lock(b->channel);
15370291Scg	b->blkcnt = blkcnt;
15470291Scg	b->blksz = blksz;
15570291Scg	b->bufsize = blkcnt * blksz;
156125136Struckman	f2 =  b->tmpbuf;
157113752Sorion	b->tmpbuf = tmpbuf;
15870291Scg	sndbuf_reset(b);
159125136Struckman	chn_unlock(b->channel);
160125136Struckman	free(f2, M_DEVBUF);
16170291Scg	return 0;
162125136Struckmanout:
163125136Struckman	chn_unlock(b->channel);
164125136Struckman	return 0;
16570291Scg}
16670291Scg
16774763Scgint
16874763Scgsndbuf_remalloc(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz)
16974763Scg{
170107237Scg        u_int8_t *buf, *tmpbuf, *f1, *f2;
171107237Scg        unsigned int bufsize;
172125136Struckman	int ret;
173107237Scg
17474763Scg	if (blkcnt < 2 || blksz < 16)
17574763Scg		return EINVAL;
17674763Scg
177107237Scg	bufsize = blksz * blkcnt;
17874763Scg
179125136Struckman	chn_unlock(b->channel);
180125136Struckman	buf = malloc(bufsize, M_DEVBUF, M_WAITOK);
181125136Struckman	if (buf == NULL) {
182125136Struckman		ret = ENOMEM;
183125136Struckman		goto out;
184125136Struckman	}
18574763Scg
186125136Struckman	tmpbuf = malloc(bufsize, M_DEVBUF, M_WAITOK);
187107237Scg   	if (tmpbuf == NULL) {
188107237Scg		free(buf, M_DEVBUF);
189125136Struckman		ret = ENOMEM;
190125136Struckman		goto out;
191107237Scg	}
192125136Struckman	chn_lock(b->channel);
19374763Scg
194107237Scg	b->blkcnt = blkcnt;
195107237Scg	b->blksz = blksz;
196107237Scg	b->bufsize = bufsize;
197107237Scg	b->maxsize = bufsize;
198107237Scg	f1 = b->buf;
199107237Scg	f2 = b->tmpbuf;
200107237Scg	b->buf = buf;
201107237Scg	b->tmpbuf = tmpbuf;
202107237Scg
203125136Struckman	sndbuf_reset(b);
204125136Struckman
205125136Struckman	chn_unlock(b->channel);
206107237Scg      	if (f1)
207107237Scg		free(f1, M_DEVBUF);
208107237Scg      	if (f2)
209107237Scg		free(f2, M_DEVBUF);
210107237Scg
211125136Struckman	ret = 0;
212125136Struckmanout:
213125136Struckman	chn_lock(b->channel);
214125136Struckman	return ret;
21574763Scg}
21674763Scg
21770291Scgvoid
21874763Scgsndbuf_clear(struct snd_dbuf *b, unsigned int length)
21970291Scg{
22070291Scg	int i;
22173768Scg	u_char data, *p;
22270291Scg
22370291Scg	if (length == 0)
22470291Scg		return;
22573768Scg	if (length > b->bufsize)
22673768Scg		length = b->bufsize;
22770291Scg
22870291Scg	if (b->fmt & AFMT_SIGNED)
22970291Scg		data = 0x00;
23070291Scg	else
23170291Scg		data = 0x80;
23270291Scg
23374763Scg	i = sndbuf_getfreeptr(b);
23474763Scg	p = sndbuf_getbuf(b);
23573768Scg	while (length > 0) {
23673768Scg		p[i] = data;
23773768Scg		length--;
23873768Scg		i++;
23973768Scg		if (i >= b->bufsize)
24070291Scg			i = 0;
24170291Scg	}
24270291Scg}
24370291Scg
24470291Scgvoid
24577265Scgsndbuf_fillsilence(struct snd_dbuf *b)
24677265Scg{
24777265Scg	int i;
24877265Scg	u_char data, *p;
24977265Scg
25077265Scg	if (b->fmt & AFMT_SIGNED)
25177265Scg		data = 0x00;
25277265Scg	else
25377265Scg		data = 0x80;
25477265Scg
25577265Scg	i = 0;
25677265Scg	p = sndbuf_getbuf(b);
25777265Scg	while (i < b->bufsize)
25877265Scg		p[i++] = data;
25977265Scg	b->rp = 0;
26077265Scg	b->rl = b->bufsize;
26177265Scg}
26277265Scg
26377265Scgvoid
26474763Scgsndbuf_reset(struct snd_dbuf *b)
26570291Scg{
26674763Scg	b->hp = 0;
26774763Scg	b->rp = 0;
26874763Scg	b->rl = 0;
26974763Scg	b->dl = 0;
27074763Scg	b->prev_total = 0;
27174763Scg	b->total = 0;
27274763Scg	b->xrun = 0;
27370291Scg	if (b->buf && b->bufsize > 0)
27470291Scg		sndbuf_clear(b, b->bufsize);
27570291Scg}
27670291Scg
27774763Scgu_int32_t
27874763Scgsndbuf_getfmt(struct snd_dbuf *b)
27974763Scg{
28074763Scg	return b->fmt;
28174763Scg}
28274763Scg
28370291Scgint
28474763Scgsndbuf_setfmt(struct snd_dbuf *b, u_int32_t fmt)
28570291Scg{
28670291Scg	b->fmt = fmt;
28770291Scg	b->bps = 1;
28870291Scg	b->bps <<= (b->fmt & AFMT_STEREO)? 1 : 0;
28970291Scg	b->bps <<= (b->fmt & AFMT_16BIT)? 1 : 0;
29070291Scg	b->bps <<= (b->fmt & AFMT_32BIT)? 2 : 0;
29170291Scg	return 0;
29270291Scg}
29370291Scg
29474763Scgunsigned int
29574763Scgsndbuf_getspd(struct snd_dbuf *b)
29670291Scg{
29774763Scg	return b->spd;
29874763Scg}
29974763Scg
30074763Scgvoid
30174763Scgsndbuf_setspd(struct snd_dbuf *b, unsigned int spd)
30274763Scg{
30374763Scg	b->spd = spd;
30474763Scg}
30574763Scg
30674763Scgunsigned int
30774763Scgsndbuf_getalign(struct snd_dbuf *b)
30874763Scg{
30974763Scg	static int align[] = {0, 1, 1, 2, 2, 2, 2, 3};
31074763Scg
31174763Scg	return align[b->bps - 1];
31274763Scg}
31374763Scg
31474763Scgunsigned int
31574763Scgsndbuf_getblkcnt(struct snd_dbuf *b)
31674763Scg{
31774763Scg	return b->blkcnt;
31874763Scg}
31974763Scg
32074763Scgvoid
32174763Scgsndbuf_setblkcnt(struct snd_dbuf *b, unsigned int blkcnt)
32274763Scg{
32374763Scg	b->blkcnt = blkcnt;
32474763Scg}
32574763Scg
32674763Scgunsigned int
32774763Scgsndbuf_getblksz(struct snd_dbuf *b)
32874763Scg{
32974763Scg	return b->blksz;
33074763Scg}
33174763Scg
33274763Scgvoid
33374763Scgsndbuf_setblksz(struct snd_dbuf *b, unsigned int blksz)
33474763Scg{
33574763Scg	b->blksz = blksz;
33674763Scg}
33774763Scg
33874763Scgunsigned int
33974763Scgsndbuf_getbps(struct snd_dbuf *b)
34074763Scg{
34170291Scg	return b->bps;
34270291Scg}
34370291Scg
34470291Scgvoid *
34574763Scgsndbuf_getbuf(struct snd_dbuf *b)
34670291Scg{
34770291Scg	return b->buf;
34870291Scg}
34970291Scg
35074763Scgvoid *
35174763Scgsndbuf_getbufofs(struct snd_dbuf *b, unsigned int ofs)
35270291Scg{
35389771Scg	KASSERT(ofs < b->bufsize, ("%s: ofs invalid %d", __func__, ofs));
35474763Scg
35574763Scg	return b->buf + ofs;
35674763Scg}
35774763Scg
35874763Scgunsigned int
35974763Scgsndbuf_getsize(struct snd_dbuf *b)
36074763Scg{
36170291Scg	return b->bufsize;
36270291Scg}
36370291Scg
36474763Scgunsigned int
36574763Scgsndbuf_getmaxsize(struct snd_dbuf *b)
36670291Scg{
36774763Scg	return b->maxsize;
36874763Scg}
36974763Scg
37074763Scgunsigned int
37174763Scgsndbuf_runsz(struct snd_dbuf *b)
37274763Scg{
37370291Scg	return b->dl;
37470291Scg}
37570291Scg
37674763Scgvoid
37774763Scgsndbuf_setrun(struct snd_dbuf *b, int go)
37874763Scg{
37974763Scg	b->dl = go? b->blksz : 0;
38074763Scg}
38174763Scg
38274763Scgstruct selinfo *
38374763Scgsndbuf_getsel(struct snd_dbuf *b)
38474763Scg{
38574763Scg	return &b->sel;
38674763Scg}
38774763Scg
38874763Scg/************************************************************/
38974763Scgunsigned int
39074763Scgsndbuf_getxrun(struct snd_dbuf *b)
39174763Scg{
39274763Scg	SNDBUF_LOCKASSERT(b);
39374763Scg
39474763Scg	return b->xrun;
39574763Scg}
39674763Scg
39774763Scgvoid
39874763Scgsndbuf_setxrun(struct snd_dbuf *b, unsigned int cnt)
39974763Scg{
40074763Scg	SNDBUF_LOCKASSERT(b);
40174763Scg
40274763Scg	b->xrun = cnt;
40374763Scg}
40474763Scg
40574763Scgunsigned int
40674763Scgsndbuf_gethwptr(struct snd_dbuf *b)
40774763Scg{
40874763Scg	SNDBUF_LOCKASSERT(b);
40974763Scg
41074763Scg	return b->hp;
41174763Scg}
41274763Scg
41374763Scgvoid
41474763Scgsndbuf_sethwptr(struct snd_dbuf *b, unsigned int ptr)
41574763Scg{
41674763Scg	SNDBUF_LOCKASSERT(b);
41774763Scg
41874763Scg	b->hp = ptr;
41974763Scg}
42074763Scg
42174763Scgunsigned int
42274763Scgsndbuf_getready(struct snd_dbuf *b)
42374763Scg{
42474763Scg	SNDBUF_LOCKASSERT(b);
42587599Sobrien	KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl));
42674763Scg
42774763Scg	return b->rl;
42874763Scg}
42974763Scg
43074763Scgunsigned int
43174763Scgsndbuf_getreadyptr(struct snd_dbuf *b)
43274763Scg{
43374763Scg	SNDBUF_LOCKASSERT(b);
43487599Sobrien	KASSERT((b->rp >= 0) && (b->rp <= b->bufsize), ("%s: b->rp invalid %d", __func__, b->rp));
43574763Scg
43674763Scg	return b->rp;
43774763Scg}
43874763Scg
43974763Scgunsigned int
44074763Scgsndbuf_getfree(struct snd_dbuf *b)
44174763Scg{
44274763Scg	SNDBUF_LOCKASSERT(b);
44387599Sobrien	KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl));
44474763Scg
44574763Scg	return b->bufsize - b->rl;
44674763Scg}
44774763Scg
44874763Scgunsigned int
44974763Scgsndbuf_getfreeptr(struct snd_dbuf *b)
45074763Scg{
45174763Scg	SNDBUF_LOCKASSERT(b);
45287599Sobrien	KASSERT((b->rp >= 0) && (b->rp <= b->bufsize), ("%s: b->rp invalid %d", __func__, b->rp));
45387599Sobrien	KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl));
45474763Scg
45574763Scg	return (b->rp + b->rl) % b->bufsize;
45674763Scg}
45774763Scg
45874763Scgunsigned int
45974763Scgsndbuf_getblocks(struct snd_dbuf *b)
46074763Scg{
46174763Scg	SNDBUF_LOCKASSERT(b);
46274763Scg
46374763Scg	return b->total / b->blksz;
46474763Scg}
46574763Scg
46674763Scgunsigned int
46774763Scgsndbuf_getprevblocks(struct snd_dbuf *b)
46874763Scg{
46974763Scg	SNDBUF_LOCKASSERT(b);
47074763Scg
47174763Scg	return b->prev_total / b->blksz;
47274763Scg}
47374763Scg
47474763Scgunsigned int
47574763Scgsndbuf_gettotal(struct snd_dbuf *b)
47674763Scg{
47774763Scg	SNDBUF_LOCKASSERT(b);
47874763Scg
47974763Scg	return b->total;
48074763Scg}
48174763Scg
48274763Scgvoid
48374763Scgsndbuf_updateprevtotal(struct snd_dbuf *b)
48474763Scg{
48574763Scg	SNDBUF_LOCKASSERT(b);
48674763Scg
48774763Scg	b->prev_total = b->total;
48874763Scg}
48974763Scg
49074763Scg/************************************************************/
49174763Scg
49270291Scgint
49374763Scgsndbuf_acquire(struct snd_dbuf *b, u_int8_t *from, unsigned int count)
49470291Scg{
49574763Scg	int l;
49674763Scg
49787599Sobrien	KASSERT(count <= sndbuf_getfree(b), ("%s: count %d > free %d", __func__, count, sndbuf_getfree(b)));
49887599Sobrien	KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl));
49974763Scg	b->total += count;
50074763Scg	if (from != NULL) {
50174763Scg		while (count > 0) {
50274763Scg			l = MIN(count, sndbuf_getsize(b) - sndbuf_getfreeptr(b));
50374763Scg			bcopy(from, sndbuf_getbufofs(b, sndbuf_getfreeptr(b)), l);
50474763Scg			from += l;
50574763Scg			b->rl += l;
50674763Scg			count -= l;
50774763Scg		}
50874763Scg	} else
50974763Scg		b->rl += count;
51087599Sobrien	KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d, count %d", __func__, b->rl, count));
51174763Scg
51274763Scg	return 0;
51374763Scg}
51474763Scg
51574763Scgint
51674763Scgsndbuf_dispose(struct snd_dbuf *b, u_int8_t *to, unsigned int count)
51774763Scg{
51874763Scg	int l;
51974763Scg
52087599Sobrien	KASSERT(count <= sndbuf_getready(b), ("%s: count %d > ready %d", __func__, count, sndbuf_getready(b)));
52187599Sobrien	KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl));
52274763Scg	if (to != NULL) {
52374763Scg		while (count > 0) {
52474763Scg			l = MIN(count, sndbuf_getsize(b) - sndbuf_getreadyptr(b));
52574763Scg			bcopy(sndbuf_getbufofs(b, sndbuf_getreadyptr(b)), to, l);
52674763Scg			to += l;
52774763Scg			b->rl -= l;
52874763Scg			b->rp = (b->rp + l) % b->bufsize;
52974763Scg			count -= l;
53074763Scg		}
53174763Scg	} else {
53274763Scg		b->rl -= count;
53374763Scg		b->rp = (b->rp + count) % b->bufsize;
53474763Scg	}
53587599Sobrien	KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d, count %d", __func__, b->rl, count));
53674763Scg
53774763Scg	return 0;
53874763Scg}
53974763Scg
54074763Scg/* count is number of bytes we want added to destination buffer */
54174763Scgint
54274763Scgsndbuf_feed(struct snd_dbuf *from, struct snd_dbuf *to, struct pcm_channel *channel, struct pcm_feeder *feeder, unsigned int count)
54374763Scg{
54477265Scg	KASSERT(count > 0, ("can't feed 0 bytes"));
54577265Scg
54674763Scg	if (sndbuf_getfree(to) < count)
54774763Scg		return EINVAL;
54874763Scg
54974763Scg	count = FEEDER_FEED(feeder, channel, to->tmpbuf, count, from);
55075317Scg	if (count)
55175317Scg		sndbuf_acquire(to, to->tmpbuf, count);
55274763Scg	/* the root feeder has called sndbuf_dispose(from, , bytes fetched) */
55374763Scg
55474763Scg	return 0;
55574763Scg}
55674763Scg
55774763Scg/************************************************************/
55874763Scg
55974763Scgvoid
56074763Scgsndbuf_dump(struct snd_dbuf *b, char *s, u_int32_t what)
56174763Scg{
56274763Scg	printf("%s: [", s);
56374763Scg	if (what & 0x01)
56474763Scg		printf(" bufsize: %d, maxsize: %d", b->bufsize, b->maxsize);
56574763Scg	if (what & 0x02)
56674763Scg		printf(" dl: %d, rp: %d, rl: %d, hp: %d", b->dl, b->rp, b->rl, b->hp);
56774763Scg	if (what & 0x04)
56874763Scg		printf(" total: %d, prev_total: %d, xrun: %d", b->total, b->prev_total, b->xrun);
56974763Scg   	if (what & 0x08)
57074763Scg		printf(" fmt: 0x%x, spd: %d", b->fmt, b->spd);
57174763Scg	if (what & 0x10)
57274763Scg		printf(" blksz: %d, blkcnt: %d, flags: 0x%x", b->blksz, b->blkcnt, b->flags);
57374763Scg	printf(" ]\n");
57474763Scg}
57574763Scg
57674763Scg/************************************************************/
57774763Scgu_int32_t
57874763Scgsndbuf_getflags(struct snd_dbuf *b)
57974763Scg{
58074763Scg	return b->flags;
58174763Scg}
58274763Scg
58374763Scgvoid
58474763Scgsndbuf_setflags(struct snd_dbuf *b, u_int32_t flags, int on)
58574763Scg{
58674763Scg	b->flags &= ~flags;
58774763Scg	if (on)
58874763Scg		b->flags |= flags;
58974763Scg}
59074763Scg
591