Lines Matching +full:- +full:b

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2005-2009 Ariff Abdullah <ariff@FreeBSD.org>
5 * Portions Copyright (c) Ryan Beasley <ryan.beasley@gmail.com> - GSoC 2006
50 struct snd_dbuf *b; in sndbuf_create() local
52 b = malloc(sizeof(*b), M_DEVBUF, M_WAITOK | M_ZERO); in sndbuf_create()
53 snprintf(b->name, SNDBUF_NAMELEN, "%s:%s", channel->name, desc); in sndbuf_create()
54 b->channel = channel; in sndbuf_create()
56 return b; in sndbuf_create()
60 sndbuf_destroy(struct snd_dbuf *b) in sndbuf_destroy() argument
62 sndbuf_free(b); in sndbuf_destroy()
63 free(b, M_DEVBUF); in sndbuf_destroy()
69 struct snd_dbuf *b = (struct snd_dbuf *)arg; in sndbuf_setmap() local
74 printf("%p -> %lx\n", b->buf, (u_long)segs[0].ds_addr); in sndbuf_setmap()
77 b->buf_addr = segs[0].ds_addr; in sndbuf_setmap()
79 b->buf_addr = 0; in sndbuf_setmap()
88 sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, int dmaflags, in sndbuf_alloc() argument
93 b->dmatag = dmatag; in sndbuf_alloc()
94 b->dmaflags = dmaflags | BUS_DMA_NOWAIT | BUS_DMA_COHERENT; in sndbuf_alloc()
95 b->maxsize = size; in sndbuf_alloc()
96 b->bufsize = b->maxsize; in sndbuf_alloc()
97 b->buf_addr = 0; in sndbuf_alloc()
98 b->flags |= SNDBUF_F_MANAGED; in sndbuf_alloc()
99 if (bus_dmamem_alloc(b->dmatag, (void **)&b->buf, b->dmaflags, in sndbuf_alloc()
100 &b->dmamap)) { in sndbuf_alloc()
101 sndbuf_free(b); in sndbuf_alloc()
104 if (bus_dmamap_load(b->dmatag, b->dmamap, b->buf, b->maxsize, in sndbuf_alloc()
105 sndbuf_setmap, b, BUS_DMA_NOWAIT) != 0 || b->buf_addr == 0) { in sndbuf_alloc()
106 sndbuf_free(b); in sndbuf_alloc()
110 ret = sndbuf_resize(b, 2, b->maxsize / 2); in sndbuf_alloc()
112 sndbuf_free(b); in sndbuf_alloc()
118 sndbuf_setup(struct snd_dbuf *b, void *buf, unsigned int size) in sndbuf_setup() argument
120 b->flags &= ~SNDBUF_F_MANAGED; in sndbuf_setup()
122 b->flags |= SNDBUF_F_MANAGED; in sndbuf_setup()
123 b->buf = buf; in sndbuf_setup()
124 b->maxsize = size; in sndbuf_setup()
125 b->bufsize = b->maxsize; in sndbuf_setup()
126 return sndbuf_resize(b, 2, b->maxsize / 2); in sndbuf_setup()
130 sndbuf_free(struct snd_dbuf *b) in sndbuf_free() argument
132 if (b->tmpbuf) in sndbuf_free()
133 free(b->tmpbuf, M_DEVBUF); in sndbuf_free()
135 if (b->shadbuf) in sndbuf_free()
136 free(b->shadbuf, M_DEVBUF); in sndbuf_free()
138 if (b->buf) { in sndbuf_free()
139 if (b->flags & SNDBUF_F_MANAGED) { in sndbuf_free()
140 if (b->buf_addr) in sndbuf_free()
141 bus_dmamap_unload(b->dmatag, b->dmamap); in sndbuf_free()
142 if (b->dmatag) in sndbuf_free()
143 bus_dmamem_free(b->dmatag, b->buf, b->dmamap); in sndbuf_free()
145 free(b->buf, M_DEVBUF); in sndbuf_free()
147 seldrain(&b->sel); in sndbuf_free()
149 b->tmpbuf = NULL; in sndbuf_free()
150 b->shadbuf = NULL; in sndbuf_free()
151 b->buf = NULL; in sndbuf_free()
152 b->sl = 0; in sndbuf_free()
153 b->dmatag = NULL; in sndbuf_free()
154 b->dmamap = NULL; in sndbuf_free()
160 sndbuf_resize(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz) in sndbuf_resize() argument
165 CHN_LOCK(b->channel); in sndbuf_resize()
166 if (b->maxsize == 0) in sndbuf_resize()
169 blkcnt = b->blkcnt; in sndbuf_resize()
171 blksz = b->blksz; in sndbuf_resize()
172 if (blkcnt < 2 || blksz < 16 || (blkcnt * blksz) > b->maxsize) { in sndbuf_resize()
173 CHN_UNLOCK(b->channel); in sndbuf_resize()
176 if (blkcnt == b->blkcnt && blksz == b->blksz) in sndbuf_resize()
181 if (bufsize > b->allocsize || in sndbuf_resize()
182 bufsize < (b->allocsize >> SNDBUF_CACHE_SHIFT)) { in sndbuf_resize()
184 CHN_UNLOCK(b->channel); in sndbuf_resize()
186 CHN_LOCK(b->channel); in sndbuf_resize()
188 printf("%s(): b=%p %p -> %p [%d -> %d : %d]\n", in sndbuf_resize()
189 __func__, b, b->tmpbuf, tmpbuf, in sndbuf_resize()
190 b->allocsize, allocsize, bufsize); in sndbuf_resize()
191 if (b->tmpbuf != NULL) in sndbuf_resize()
192 free(b->tmpbuf, M_DEVBUF); in sndbuf_resize()
193 b->tmpbuf = tmpbuf; in sndbuf_resize()
194 b->allocsize = allocsize; in sndbuf_resize()
196 printf("%s(): b=%p %d [%d] NOCHANGE\n", in sndbuf_resize()
197 __func__, b, b->allocsize, b->bufsize); in sndbuf_resize()
199 b->blkcnt = blkcnt; in sndbuf_resize()
200 b->blksz = blksz; in sndbuf_resize()
201 b->bufsize = bufsize; in sndbuf_resize()
203 sndbuf_reset(b); in sndbuf_resize()
205 CHN_UNLOCK(b->channel); in sndbuf_resize()
210 sndbuf_remalloc(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz) in sndbuf_remalloc() argument
220 if (bufsize > b->allocsize || in sndbuf_remalloc()
221 bufsize < (b->allocsize >> SNDBUF_CACHE_SHIFT)) { in sndbuf_remalloc()
223 CHN_UNLOCK(b->channel); in sndbuf_remalloc()
227 CHN_LOCK(b->channel); in sndbuf_remalloc()
228 if (b->buf != NULL) in sndbuf_remalloc()
229 free(b->buf, M_DEVBUF); in sndbuf_remalloc()
230 b->buf = buf; in sndbuf_remalloc()
231 if (b->tmpbuf != NULL) in sndbuf_remalloc()
232 free(b->tmpbuf, M_DEVBUF); in sndbuf_remalloc()
233 b->tmpbuf = tmpbuf; in sndbuf_remalloc()
234 if (b->shadbuf != NULL) in sndbuf_remalloc()
235 free(b->shadbuf, M_DEVBUF); in sndbuf_remalloc()
236 b->shadbuf = shadbuf; in sndbuf_remalloc()
238 printf("%s(): b=%p %d -> %d [%d]\n", in sndbuf_remalloc()
239 __func__, b, b->allocsize, allocsize, bufsize); in sndbuf_remalloc()
240 b->allocsize = allocsize; in sndbuf_remalloc()
242 printf("%s(): b=%p %d [%d] NOCHANGE\n", in sndbuf_remalloc()
243 __func__, b, b->allocsize, b->bufsize); in sndbuf_remalloc()
245 b->blkcnt = blkcnt; in sndbuf_remalloc()
246 b->blksz = blksz; in sndbuf_remalloc()
247 b->bufsize = bufsize; in sndbuf_remalloc()
248 b->maxsize = bufsize; in sndbuf_remalloc()
249 b->sl = bufsize; in sndbuf_remalloc()
251 sndbuf_reset(b); in sndbuf_remalloc()
262 * @param b buffer context
266 sndbuf_clear(struct snd_dbuf *b, unsigned int length) in sndbuf_clear() argument
273 if (length > b->bufsize) in sndbuf_clear()
274 length = b->bufsize; in sndbuf_clear()
276 data = sndbuf_zerodata(b->fmt); in sndbuf_clear()
277 i = sndbuf_getfreeptr(b); in sndbuf_clear()
278 p = b->buf; in sndbuf_clear()
279 for (; length > 0; length--, i++) in sndbuf_clear()
280 p[i % b->bufsize] = data; in sndbuf_clear()
286 * @param b buffer context
289 sndbuf_fillsilence(struct snd_dbuf *b) in sndbuf_fillsilence() argument
291 if (b->bufsize > 0) in sndbuf_fillsilence()
292 memset(b->buf, sndbuf_zerodata(b->fmt), b->bufsize); in sndbuf_fillsilence()
293 b->rp = 0; in sndbuf_fillsilence()
294 b->rl = b->bufsize; in sndbuf_fillsilence()
298 sndbuf_fillsilence_rl(struct snd_dbuf *b, u_int rl) in sndbuf_fillsilence_rl() argument
300 if (b->bufsize > 0) in sndbuf_fillsilence_rl()
301 memset(b->buf, sndbuf_zerodata(b->fmt), b->bufsize); in sndbuf_fillsilence_rl()
302 b->rp = 0; in sndbuf_fillsilence_rl()
303 b->rl = min(b->bufsize, rl); in sndbuf_fillsilence_rl()
313 * @param b buffer context
316 sndbuf_softreset(struct snd_dbuf *b) in sndbuf_softreset() argument
318 b->rl = 0; in sndbuf_softreset()
319 if (b->buf && b->bufsize > 0) in sndbuf_softreset()
320 sndbuf_clear(b, b->bufsize); in sndbuf_softreset()
324 sndbuf_reset(struct snd_dbuf *b) in sndbuf_reset() argument
326 b->hp = 0; in sndbuf_reset()
327 b->rp = 0; in sndbuf_reset()
328 b->rl = 0; in sndbuf_reset()
329 b->dl = 0; in sndbuf_reset()
330 b->prev_total = 0; in sndbuf_reset()
331 b->total = 0; in sndbuf_reset()
332 b->xrun = 0; in sndbuf_reset()
333 if (b->buf && b->bufsize > 0) in sndbuf_reset()
334 sndbuf_clear(b, b->bufsize); in sndbuf_reset()
335 sndbuf_clearshadow(b); in sndbuf_reset()
339 sndbuf_setfmt(struct snd_dbuf *b, u_int32_t fmt) in sndbuf_setfmt() argument
341 b->fmt = fmt; in sndbuf_setfmt()
342 b->bps = AFMT_BPS(b->fmt); in sndbuf_setfmt()
343 b->align = AFMT_ALIGN(b->fmt); in sndbuf_setfmt()
348 sndbuf_setspd(struct snd_dbuf *b, unsigned int spd) in sndbuf_setspd() argument
350 b->spd = spd; in sndbuf_setspd()
354 sndbuf_getbufofs(struct snd_dbuf *b, unsigned int ofs) in sndbuf_getbufofs() argument
356 KASSERT(ofs < b->bufsize, ("%s: ofs invalid %d", __func__, ofs)); in sndbuf_getbufofs()
358 return b->buf + ofs; in sndbuf_getbufofs()
362 sndbuf_runsz(struct snd_dbuf *b) in sndbuf_runsz() argument
364 return b->dl; in sndbuf_runsz()
368 sndbuf_setrun(struct snd_dbuf *b, int go) in sndbuf_setrun() argument
370 b->dl = go? b->blksz : 0; in sndbuf_setrun()
374 sndbuf_setxrun(struct snd_dbuf *b, unsigned int xrun) in sndbuf_setxrun() argument
376 b->xrun = xrun; in sndbuf_setxrun()
380 sndbuf_getready(struct snd_dbuf *b) in sndbuf_getready() argument
382 KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl)); in sndbuf_getready()
384 return b->rl; in sndbuf_getready()
388 sndbuf_getreadyptr(struct snd_dbuf *b) in sndbuf_getreadyptr() argument
390 KASSERT((b->rp >= 0) && (b->rp <= b->bufsize), ("%s: b->rp invalid %d", __func__, b->rp)); in sndbuf_getreadyptr()
392 return b->rp; in sndbuf_getreadyptr()
396 sndbuf_getfree(struct snd_dbuf *b) in sndbuf_getfree() argument
398 KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl)); in sndbuf_getfree()
400 return b->bufsize - b->rl; in sndbuf_getfree()
404 sndbuf_getfreeptr(struct snd_dbuf *b) in sndbuf_getfreeptr() argument
406 KASSERT((b->rp >= 0) && (b->rp <= b->bufsize), ("%s: b->rp invalid %d", __func__, b->rp)); in sndbuf_getfreeptr()
407 KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl)); in sndbuf_getfreeptr()
409 return (b->rp + b->rl) % b->bufsize; in sndbuf_getfreeptr()
413 sndbuf_getblocks(struct snd_dbuf *b) in sndbuf_getblocks() argument
415 return b->total / b->blksz; in sndbuf_getblocks()
424 return snd_xbytes(v, from->align * from->spd, to->align * to->spd); in sndbuf_xbytes()
448 * @param b audio buffer
455 sndbuf_acquire(struct snd_dbuf *b, u_int8_t *from, unsigned int count) in sndbuf_acquire() argument
459 …KASSERT(count <= sndbuf_getfree(b), ("%s: count %d > free %d", __func__, count, sndbuf_getfree(b))… in sndbuf_acquire()
460 KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl)); in sndbuf_acquire()
461 b->total += count; in sndbuf_acquire()
464 l = min(count, b->bufsize - sndbuf_getfreeptr(b)); in sndbuf_acquire()
465 bcopy(from, sndbuf_getbufofs(b, sndbuf_getfreeptr(b)), l); in sndbuf_acquire()
467 b->rl += l; in sndbuf_acquire()
468 count -= l; in sndbuf_acquire()
471 b->rl += count; in sndbuf_acquire()
472 …KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d, count %d", __func__, b->rl,… in sndbuf_acquire()
485 * @param b PCM channel sound buffer
492 sndbuf_dispose(struct snd_dbuf *b, u_int8_t *to, unsigned int count) in sndbuf_dispose() argument
496 …KASSERT(count <= sndbuf_getready(b), ("%s: count %d > ready %d", __func__, count, sndbuf_getready( in sndbuf_dispose()
497 KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d", __func__, b->rl)); in sndbuf_dispose()
500 l = min(count, b->bufsize - sndbuf_getreadyptr(b)); in sndbuf_dispose()
501 bcopy(sndbuf_getbufofs(b, sndbuf_getreadyptr(b)), to, l); in sndbuf_dispose()
503 b->rl -= l; in sndbuf_dispose()
504 b->rp = (b->rp + l) % b->bufsize; in sndbuf_dispose()
505 count -= l; in sndbuf_dispose()
508 b->rl -= count; in sndbuf_dispose()
509 b->rp = (b->rp + count) % b->bufsize; in sndbuf_dispose()
511 …KASSERT((b->rl >= 0) && (b->rl <= b->bufsize), ("%s: b->rl invalid %d, count %d", __func__, b->rl,… in sndbuf_dispose()
545 maxfeed = SND_FXROUND(SND_FXDIV_MAX, to->align); in sndbuf_feed()
548 cnt = FEEDER_FEED(feeder, channel, to->tmpbuf, in sndbuf_feed()
552 sndbuf_acquire(to, to->tmpbuf, cnt); in sndbuf_feed()
553 count -= cnt; in sndbuf_feed()
570 * @param b buffer to clear
573 sndbuf_clearshadow(struct snd_dbuf *b) in sndbuf_clearshadow() argument
575 KASSERT(b != NULL, ("b is a null pointer")); in sndbuf_clearshadow()
576 KASSERT(b->sl >= 0, ("illegal shadow length")); in sndbuf_clearshadow()
578 if ((b->shadbuf != NULL) && (b->sl > 0)) in sndbuf_clearshadow()
579 memset(b->shadbuf, sndbuf_zerodata(b->fmt), b->sl); in sndbuf_clearshadow()
586 * Peak ranges from 0-32767. If channel is monaural, most significant 16
587 * bits will be zero. For now, only expects to work with 1-2 channel
592 * @param b buffer to analyze
597 sndbuf_getpeaks(struct snd_dbuf *b, int *lp, int *rp) in sndbuf_getpeaks() argument