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