FreeBSD kernel sound device code
buffer.h
Go to the documentation of this file.
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 1999 Cameron Grant <cg@freebsd.org>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD$
29 */
30
31#define SND_DMA(b) (sndbuf_getflags((b)) & SNDBUF_F_DMA)
32#define SNDBUF_LOCKASSERT(b)
33
34#define SNDBUF_F_DMA 0x00000001
35#define SNDBUF_F_XRUN 0x00000002
36#define SNDBUF_F_RUNNING 0x00000004
37#define SNDBUF_F_MANAGED 0x00000008
38
39#define SNDBUF_NAMELEN 48
40
41struct snd_dbuf {
42 device_t dev;
43 u_int8_t *buf, *tmpbuf;
44 u_int8_t *shadbuf;
45 volatile int sl;
46 unsigned int bufsize, maxsize, allocsize;
47 volatile int dl; /* transfer size */
48 volatile int rp; /* pointers to the ready area */
49 volatile int rl; /* length of ready area */
50 volatile int hp;
51 volatile u_int64_t total, prev_total;
52 int dmachan, dir; /* dma channel */
53 u_int32_t fmt, spd, bps, align;
54 unsigned int blksz, blkcnt;
55 int xrun;
56 u_int32_t flags;
57 bus_dmamap_t dmamap;
58 bus_dma_tag_t dmatag;
59 bus_addr_t buf_addr;
61 struct selinfo sel;
64};
65
66struct snd_dbuf *sndbuf_create(device_t dev, char *drv, char *desc, struct pcm_channel *channel);
67void sndbuf_destroy(struct snd_dbuf *b);
68
69void sndbuf_dump(struct snd_dbuf *b, char *s, u_int32_t what);
70
71int sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, int dmaflags, unsigned int size);
72int sndbuf_setup(struct snd_dbuf *b, void *buf, unsigned int size);
73void sndbuf_free(struct snd_dbuf *b);
74int sndbuf_resize(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz);
75int sndbuf_remalloc(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz);
76void sndbuf_reset(struct snd_dbuf *b);
77void sndbuf_clear(struct snd_dbuf *b, unsigned int length);
78void sndbuf_fillsilence(struct snd_dbuf *b);
79void sndbuf_fillsilence_rl(struct snd_dbuf *b, u_int rl);
80void sndbuf_softreset(struct snd_dbuf *b);
81void sndbuf_clearshadow(struct snd_dbuf *b);
82
83u_int32_t sndbuf_getfmt(struct snd_dbuf *b);
84int sndbuf_setfmt(struct snd_dbuf *b, u_int32_t fmt);
85unsigned int sndbuf_getspd(struct snd_dbuf *b);
86void sndbuf_setspd(struct snd_dbuf *b, unsigned int spd);
87unsigned int sndbuf_getbps(struct snd_dbuf *b);
88
89bus_addr_t sndbuf_getbufaddr(struct snd_dbuf *buf);
90
91void *sndbuf_getbuf(struct snd_dbuf *b);
92void *sndbuf_getbufofs(struct snd_dbuf *b, unsigned int ofs);
93unsigned int sndbuf_getsize(struct snd_dbuf *b);
94unsigned int sndbuf_getmaxsize(struct snd_dbuf *b);
95unsigned int sndbuf_getallocsize(struct snd_dbuf *b);
96unsigned int sndbuf_getalign(struct snd_dbuf *b);
97unsigned int sndbuf_getblkcnt(struct snd_dbuf *b);
98void sndbuf_setblkcnt(struct snd_dbuf *b, unsigned int blkcnt);
99unsigned int sndbuf_getblksz(struct snd_dbuf *b);
100void sndbuf_setblksz(struct snd_dbuf *b, unsigned int blksz);
101unsigned int sndbuf_runsz(struct snd_dbuf *b);
102void sndbuf_setrun(struct snd_dbuf *b, int go);
103struct selinfo *sndbuf_getsel(struct snd_dbuf *b);
104
105unsigned int sndbuf_getxrun(struct snd_dbuf *b);
106void sndbuf_setxrun(struct snd_dbuf *b, unsigned int xrun);
107unsigned int sndbuf_gethwptr(struct snd_dbuf *b);
108void sndbuf_sethwptr(struct snd_dbuf *b, unsigned int ptr);
109unsigned int sndbuf_getfree(struct snd_dbuf *b);
110unsigned int sndbuf_getfreeptr(struct snd_dbuf *b);
111unsigned int sndbuf_getready(struct snd_dbuf *b);
112unsigned int sndbuf_getreadyptr(struct snd_dbuf *b);
113u_int64_t sndbuf_getblocks(struct snd_dbuf *b);
114u_int64_t sndbuf_getprevblocks(struct snd_dbuf *b);
115u_int64_t sndbuf_gettotal(struct snd_dbuf *b);
116u_int64_t sndbuf_getprevtotal(struct snd_dbuf *b);
117unsigned int sndbuf_xbytes(unsigned int v, struct snd_dbuf *from, struct snd_dbuf *to);
118u_int8_t sndbuf_zerodata(u_int32_t fmt);
119void sndbuf_updateprevtotal(struct snd_dbuf *b);
120
121int sndbuf_acquire(struct snd_dbuf *b, u_int8_t *from, unsigned int count);
122int sndbuf_dispose(struct snd_dbuf *b, u_int8_t *to, unsigned int count);
123int sndbuf_feed(struct snd_dbuf *from, struct snd_dbuf *to, struct pcm_channel *channel, struct pcm_feeder *feeder, unsigned int count);
124
125u_int32_t sndbuf_getflags(struct snd_dbuf *b);
126void sndbuf_setflags(struct snd_dbuf *b, u_int32_t flags, int on);
127
128int sndbuf_dmasetup(struct snd_dbuf *b, struct resource *drq);
129int sndbuf_dmasetdir(struct snd_dbuf *b, int dir);
130void sndbuf_dma(struct snd_dbuf *b, int go);
131int sndbuf_dmaptr(struct snd_dbuf *b);
132void sndbuf_dmabounce(struct snd_dbuf *b);
133
134#ifdef OSSV4_EXPERIMENT
135void sndbuf_getpeaks(struct snd_dbuf *b, int *lp, int *rp);
136#endif
137
138static inline u_int32_t
139snd_xbytes(u_int32_t v, u_int32_t from, u_int32_t to)
140{
141
142 if (from == to)
143 return (v);
144 if (from == 0)
145 return (0);
146 return ((u_int64_t)v * to / from);
147}
char * desc
Definition: atiixp.c:174
int go
Definition: audio_dai_if.m:64
unsigned int fmt
Definition: audio_soc.c:91
u_int32_t sndbuf_getflags(struct snd_dbuf *b)
Definition: buffer.c:751
int sndbuf_setup(struct snd_dbuf *b, void *buf, unsigned int size)
Definition: buffer.c:123
u_int64_t sndbuf_gettotal(struct snd_dbuf *b)
Definition: buffer.c:557
void sndbuf_clear(struct snd_dbuf *b, unsigned int length)
Zero out space in buffer free area.
Definition: buffer.c:270
u_int8_t sndbuf_zerodata(u_int32_t fmt)
Definition: buffer.c:591
unsigned int sndbuf_getspd(struct snd_dbuf *b)
Definition: buffer.c:373
int sndbuf_acquire(struct snd_dbuf *b, u_int8_t *from, unsigned int count)
Acquire buffer space to extend ready area.
Definition: buffer.c:618
int sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, int dmaflags, unsigned int size)
Definition: buffer.c:93
void * sndbuf_getbuf(struct snd_dbuf *b)
Definition: buffer.c:421
unsigned int sndbuf_getblkcnt(struct snd_dbuf *b)
Definition: buffer.c:391
int sndbuf_dmasetup(struct snd_dbuf *b, struct resource *drq)
Definition: sndbuf_dma.c:40
bus_addr_t sndbuf_getbufaddr(struct snd_dbuf *buf)
Definition: buffer.c:66
#define SNDBUF_NAMELEN
Definition: buffer.h:39
unsigned int sndbuf_getalign(struct snd_dbuf *b)
Definition: buffer.c:385
void sndbuf_setblkcnt(struct snd_dbuf *b, unsigned int blkcnt)
Definition: buffer.c:397
void sndbuf_reset(struct snd_dbuf *b)
Definition: buffer.c:334
void sndbuf_setblksz(struct snd_dbuf *b, unsigned int blksz)
Definition: buffer.c:409
unsigned int sndbuf_getblksz(struct snd_dbuf *b)
Definition: buffer.c:403
void sndbuf_setspd(struct snd_dbuf *b, unsigned int spd)
Definition: buffer.c:379
void sndbuf_dmabounce(struct snd_dbuf *b)
Definition: sndbuf_dma.c:103
void sndbuf_setxrun(struct snd_dbuf *b, unsigned int xrun)
Definition: buffer.c:480
u_int64_t sndbuf_getprevblocks(struct snd_dbuf *b)
Definition: buffer.c:549
int sndbuf_remalloc(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz)
Definition: buffer.c:214
unsigned int sndbuf_getallocsize(struct snd_dbuf *b)
Definition: buffer.c:447
unsigned int sndbuf_getfreeptr(struct snd_dbuf *b)
Definition: buffer.c:531
void sndbuf_fillsilence(struct snd_dbuf *b)
Zap buffer contents, resetting "ready area" fields.
Definition: buffer.c:299
int sndbuf_setfmt(struct snd_dbuf *b, u_int32_t fmt)
Definition: buffer.c:355
void sndbuf_updateprevtotal(struct snd_dbuf *b)
Definition: buffer.c:573
void sndbuf_dma(struct snd_dbuf *b, int go)
Definition: sndbuf_dma.c:63
void sndbuf_dump(struct snd_dbuf *b, char *s, u_int32_t what)
Definition: buffer.c:733
unsigned int sndbuf_getfree(struct snd_dbuf *b)
Definition: buffer.c:522
unsigned int sndbuf_getmaxsize(struct snd_dbuf *b)
Definition: buffer.c:441
void sndbuf_destroy(struct snd_dbuf *b)
Definition: buffer.c:59
u_int32_t sndbuf_getfmt(struct snd_dbuf *b)
Definition: buffer.c:349
unsigned int sndbuf_getxrun(struct snd_dbuf *b)
Definition: buffer.c:472
unsigned int sndbuf_xbytes(unsigned int v, struct snd_dbuf *from, struct snd_dbuf *to)
Definition: buffer.c:581
unsigned int sndbuf_getready(struct snd_dbuf *b)
Definition: buffer.c:504
unsigned int sndbuf_getsize(struct snd_dbuf *b)
Definition: buffer.c:435
void sndbuf_softreset(struct snd_dbuf *b)
Reset buffer w/o flushing statistics.
Definition: buffer.c:326
void sndbuf_free(struct snd_dbuf *b)
Definition: buffer.c:135
static u_int32_t snd_xbytes(u_int32_t v, u_int32_t from, u_int32_t to)
Definition: buffer.h:139
struct snd_dbuf * sndbuf_create(device_t dev, char *drv, char *desc, struct pcm_channel *channel)
Definition: buffer.c:46
void sndbuf_setrun(struct snd_dbuf *b, int go)
Definition: buffer.c:459
void sndbuf_fillsilence_rl(struct snd_dbuf *b, u_int rl)
Definition: buffer.c:308
struct selinfo * sndbuf_getsel(struct snd_dbuf *b)
Definition: buffer.c:465
unsigned int sndbuf_gethwptr(struct snd_dbuf *b)
Definition: buffer.c:488
unsigned int sndbuf_getbps(struct snd_dbuf *b)
Definition: buffer.c:415
void * sndbuf_getbufofs(struct snd_dbuf *b, unsigned int ofs)
Definition: buffer.c:427
void sndbuf_clearshadow(struct snd_dbuf *b)
Clear the shadow buffer by filling with samples equal to zero.
Definition: buffer.c:770
void sndbuf_setflags(struct snd_dbuf *b, u_int32_t flags, int on)
Definition: buffer.c:757
int sndbuf_dmaptr(struct snd_dbuf *b)
Definition: sndbuf_dma.c:88
u_int64_t sndbuf_getprevtotal(struct snd_dbuf *b)
Definition: buffer.c:565
int sndbuf_resize(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz)
Definition: buffer.c:164
unsigned int sndbuf_runsz(struct snd_dbuf *b)
Definition: buffer.c:453
u_int64_t sndbuf_getblocks(struct snd_dbuf *b)
Definition: buffer.c:541
int sndbuf_feed(struct snd_dbuf *from, struct snd_dbuf *to, struct pcm_channel *channel, struct pcm_feeder *feeder, unsigned int count)
Definition: buffer.c:691
int sndbuf_dispose(struct snd_dbuf *b, u_int8_t *to, unsigned int count)
Dispose samples from channel buffer, increasing size of ready area.
Definition: buffer.c:655
unsigned int sndbuf_getreadyptr(struct snd_dbuf *b)
Definition: buffer.c:513
int sndbuf_dmasetdir(struct snd_dbuf *b, int dir)
Definition: sndbuf_dma.c:53
void sndbuf_sethwptr(struct snd_dbuf *b, unsigned int ptr)
Definition: buffer.c:496
INTERFACE channel
Definition: channel_if.m:35
struct snd_dbuf * b
Definition: channel_if.m:105
uint32_t spd
Definition: dsp.c:394
u_int32_t count
Definition: feeder_if.m:86
INTERFACE feeder
Definition: feeder_if.m:33
int what
Definition: feeder_if.m:73
int blksz
Definition: hdac_if.m:64
int dir
Definition: hdac_if.m:45
bus_addr_t buf
Definition: hdac_if.m:63
int blkcnt
Definition: hdac_if.m:65
unsigned dev
Definition: mixer_if.m:59
volatile int dl
Definition: buffer.h:47
u_int32_t bps
Definition: buffer.h:53
u_int8_t * tmpbuf
Definition: buffer.h:43
bus_addr_t buf_addr
Definition: buffer.h:59
unsigned int blksz
Definition: buffer.h:54
device_t dev
Definition: buffer.h:42
volatile int rl
Definition: buffer.h:49
u_int32_t spd
Definition: buffer.h:53
unsigned int maxsize
Definition: buffer.h:46
u_int32_t flags
Definition: buffer.h:56
volatile u_int64_t prev_total
Definition: buffer.h:51
u_int8_t * buf
Definition: buffer.h:43
volatile u_int64_t total
Definition: buffer.h:51
int dmachan
Definition: buffer.h:52
volatile int rp
Definition: buffer.h:48
int xrun
Definition: buffer.h:55
int dir
Definition: buffer.h:52
int dmaflags
Definition: buffer.h:60
u_int32_t fmt
Definition: buffer.h:53
char name[SNDBUF_NAMELEN]
Definition: buffer.h:63
struct pcm_channel * channel
Definition: buffer.h:62
bus_dma_tag_t dmatag
Definition: buffer.h:58
u_int32_t align
Definition: buffer.h:53
volatile int hp
Definition: buffer.h:50
bus_dmamap_t dmamap
Definition: buffer.h:57
unsigned int blkcnt
Definition: buffer.h:54
unsigned int allocsize
Definition: buffer.h:46
u_int8_t * shadbuf
Definition: buffer.h:44
unsigned int bufsize
Definition: buffer.h:46
volatile int sl
Definition: buffer.h:45
struct selinfo sel
Definition: buffer.h:61