1/*- 2 * Copyright (c) 1999 Cameron Grant <cg@freebsd.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 *
| 1/*- 2 * Copyright (c) 1999 Cameron Grant <cg@freebsd.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 *
|
26 * $FreeBSD: head/sys/dev/sound/pcm/channel.h 164614 2006-11-26 12:24:06Z ariff $
| 26 * $FreeBSD: head/sys/dev/sound/pcm/channel.h 170161 2007-05-31 18:43:33Z ariff $
|
27 */ 28
| 27 */ 28
|
29struct pcmchan_children { 30 SLIST_ENTRY(pcmchan_children) link; 31 struct pcm_channel *channel; 32}; 33
| |
34struct pcmchan_caps { 35 u_int32_t minspeed, maxspeed; 36 u_int32_t *fmtlist; 37 u_int32_t caps; 38}; 39 40/* Forward declarations */ 41struct pcm_channel; 42struct pcmchan_syncgroup; 43struct pcmchan_syncmember; 44 45extern struct mtx snd_pcm_syncgroups_mtx; 46extern SLIST_HEAD(pcm_synclist, pcmchan_syncgroup) snd_pcm_syncgroups; 47 48#define PCM_SG_LOCK() mtx_lock(&snd_pcm_syncgroups_mtx) 49#define PCM_SG_TRYLOCK() mtx_trylock(&snd_pcm_syncgroups_mtx) 50#define PCM_SG_UNLOCK() mtx_unlock(&snd_pcm_syncgroups_mtx) 51#define PCM_SG_LOCKASSERT(arg) mtx_assert(&snd_pcm_syncgroups_mtx, arg) 52 53/** 54 * @brief Specifies an audio device sync group 55 */ 56struct pcmchan_syncgroup { 57 SLIST_ENTRY(pcmchan_syncgroup) link; 58 SLIST_HEAD(, pcmchan_syncmember) members; 59 int id; /**< Group identifier; set to address of group. */ 60}; 61 62/** 63 * @brief Specifies a container for members of a sync group 64 */ 65struct pcmchan_syncmember { 66 SLIST_ENTRY(pcmchan_syncmember) link; 67 struct pcmchan_syncgroup *parent; /**< group head */ 68 struct pcm_channel *ch; 69}; 70 71#define CHN_NAMELEN 32 72struct pcm_channel { 73 kobj_t methods; 74
| 29struct pcmchan_caps { 30 u_int32_t minspeed, maxspeed; 31 u_int32_t *fmtlist; 32 u_int32_t caps; 33}; 34 35/* Forward declarations */ 36struct pcm_channel; 37struct pcmchan_syncgroup; 38struct pcmchan_syncmember; 39 40extern struct mtx snd_pcm_syncgroups_mtx; 41extern SLIST_HEAD(pcm_synclist, pcmchan_syncgroup) snd_pcm_syncgroups; 42 43#define PCM_SG_LOCK() mtx_lock(&snd_pcm_syncgroups_mtx) 44#define PCM_SG_TRYLOCK() mtx_trylock(&snd_pcm_syncgroups_mtx) 45#define PCM_SG_UNLOCK() mtx_unlock(&snd_pcm_syncgroups_mtx) 46#define PCM_SG_LOCKASSERT(arg) mtx_assert(&snd_pcm_syncgroups_mtx, arg) 47 48/** 49 * @brief Specifies an audio device sync group 50 */ 51struct pcmchan_syncgroup { 52 SLIST_ENTRY(pcmchan_syncgroup) link; 53 SLIST_HEAD(, pcmchan_syncmember) members; 54 int id; /**< Group identifier; set to address of group. */ 55}; 56 57/** 58 * @brief Specifies a container for members of a sync group 59 */ 60struct pcmchan_syncmember { 61 SLIST_ENTRY(pcmchan_syncmember) link; 62 struct pcmchan_syncgroup *parent; /**< group head */ 63 struct pcm_channel *ch; 64}; 65 66#define CHN_NAMELEN 32 67struct pcm_channel { 68 kobj_t methods; 69
|
75 int num;
| |
76 pid_t pid; 77 int refcount; 78 struct pcm_feeder *feeder; 79 u_int32_t align; 80 81 int volume; 82 int latency; 83 u_int32_t speed; 84 u_int32_t format; 85 u_int32_t flags; 86 u_int32_t feederflags; 87 u_int32_t blocks; 88 89 int direction; 90 unsigned int interrupts, xruns, feedcount; 91 unsigned int timeout; 92 struct snd_dbuf *bufhard, *bufsoft; 93 struct snddev_info *parentsnddev; 94 struct pcm_channel *parentchannel; 95 void *devinfo; 96 device_t dev;
| 70 pid_t pid; 71 int refcount; 72 struct pcm_feeder *feeder; 73 u_int32_t align; 74 75 int volume; 76 int latency; 77 u_int32_t speed; 78 u_int32_t format; 79 u_int32_t flags; 80 u_int32_t feederflags; 81 u_int32_t blocks; 82 83 int direction; 84 unsigned int interrupts, xruns, feedcount; 85 unsigned int timeout; 86 struct snd_dbuf *bufhard, *bufsoft; 87 struct snddev_info *parentsnddev; 88 struct pcm_channel *parentchannel; 89 void *devinfo; 90 device_t dev;
|
| 91 int unit;
|
97 char name[CHN_NAMELEN]; 98 struct mtx *lock;
| 92 char name[CHN_NAMELEN]; 93 struct mtx *lock;
|
| 94 int trigger;
|
99 /** 100 * Increment,decrement this around operations that temporarily yield 101 * lock. 102 */ 103 unsigned int inprog; 104 /** 105 * Special channel operations should examine @c inprog after acquiring 106 * lock. If zero, operations may continue. Else, thread should 107 * wait on this cv for previous operation to finish. 108 */ 109 struct cv cv; 110 /** 111 * Low water mark for select()/poll(). 112 * 113 * This is initialized to the channel's fragment size, and will be 114 * overwritten if a new fragment size is set. Users may alter this 115 * value directly with the @c SNDCTL_DSP_LOW_WATER ioctl. 116 */ 117 unsigned int lw; 118 /** 119 * If part of a sync group, this will point to the syncmember 120 * container. 121 */ 122 struct pcmchan_syncmember *sm; 123#ifdef OSSV4_EXPERIMENT 124 u_int16_t lpeak, rpeak; /**< Peak value from 0-32767. */ 125#endif
| 95 /** 96 * Increment,decrement this around operations that temporarily yield 97 * lock. 98 */ 99 unsigned int inprog; 100 /** 101 * Special channel operations should examine @c inprog after acquiring 102 * lock. If zero, operations may continue. Else, thread should 103 * wait on this cv for previous operation to finish. 104 */ 105 struct cv cv; 106 /** 107 * Low water mark for select()/poll(). 108 * 109 * This is initialized to the channel's fragment size, and will be 110 * overwritten if a new fragment size is set. Users may alter this 111 * value directly with the @c SNDCTL_DSP_LOW_WATER ioctl. 112 */ 113 unsigned int lw; 114 /** 115 * If part of a sync group, this will point to the syncmember 116 * container. 117 */ 118 struct pcmchan_syncmember *sm; 119#ifdef OSSV4_EXPERIMENT 120 u_int16_t lpeak, rpeak; /**< Peak value from 0-32767. */ 121#endif
|
126 SLIST_HEAD(, pcmchan_children) children;
| 122 123 struct { 124 SLIST_HEAD(, pcm_channel) head; 125 SLIST_ENTRY(pcm_channel) link; 126 struct { 127 SLIST_HEAD(, pcm_channel) head; 128 SLIST_ENTRY(pcm_channel) link; 129 } busy; 130 } children; 131 132 struct { 133 struct { 134 SLIST_ENTRY(pcm_channel) link; 135 struct { 136 SLIST_ENTRY(pcm_channel) link; 137 } busy; 138 } pcm; 139 } channels; 140 141 void *data1, *data2;
|
127}; 128
| 142}; 143
|
| 144#define CHN_HEAD(x, y) &(x)->y.head 145#define CHN_INIT(x, y) SLIST_INIT(CHN_HEAD(x, y)) 146#define CHN_LINK(y) y.link 147#define CHN_EMPTY(x, y) SLIST_EMPTY(CHN_HEAD(x, y)) 148#define CHN_FIRST(x, y) SLIST_FIRST(CHN_HEAD(x, y)) 149 150#define CHN_FOREACH(x, y, z) \ 151 SLIST_FOREACH(x, CHN_HEAD(y, z), CHN_LINK(z)) 152 153#define CHN_FOREACH_SAFE(w, x, y, z) \ 154 SLIST_FOREACH_SAFE(w, CHN_HEAD(x, z), CHN_LINK(z), y) 155 156#define CHN_INSERT_HEAD(x, y, z) \ 157 SLIST_INSERT_HEAD(CHN_HEAD(x, z), y, CHN_LINK(z)) 158 159#define CHN_INSERT_AFTER(x, y, z) \ 160 SLIST_INSERT_AFTER(x, y, CHN_LINK(z)) 161 162#define CHN_REMOVE(x, y, z) \ 163 SLIST_REMOVE(CHN_HEAD(x, z), y, pcm_channel, CHN_LINK(z)) 164 165#define CHN_INSERT_HEAD_SAFE(x, y, z) do { \ 166 struct pcm_channel *t = NULL; \ 167 CHN_FOREACH(t, x, z) { \ 168 if (t == y) \ 169 break; \ 170 } \ 171 if (t != y) { \ 172 CHN_INSERT_HEAD(x, y, z); \ 173 } \ 174} while(0) 175 176#define CHN_INSERT_AFTER_SAFE(w, x, y, z) do { \ 177 struct pcm_channel *t = NULL; \ 178 CHN_FOREACH(t, w, z) { \ 179 if (t == y) \ 180 break; \ 181 } \ 182 if (t != y) { \ 183 CHN_INSERT_AFTER(x, y, z); \ 184 } \ 185} while(0) 186 187#define CHN_REMOVE_SAFE(x, y, z) do { \ 188 struct pcm_channel *t = NULL; \ 189 CHN_FOREACH(t, x, z) { \ 190 if (t == y) \ 191 break; \ 192 } \ 193 if (t == y) { \ 194 CHN_REMOVE(x, y, z); \ 195 } \ 196} while(0) 197 198#define CHN_UNIT(x) (snd_unit2u((x)->unit)) 199#define CHN_DEV(x) (snd_unit2d((x)->unit)) 200#define CHN_CHAN(x) (snd_unit2c((x)->unit)) 201
|
129#include "channel_if.h" 130 131int chn_reinit(struct pcm_channel *c); 132int chn_write(struct pcm_channel *c, struct uio *buf); 133int chn_read(struct pcm_channel *c, struct uio *buf); 134u_int32_t chn_start(struct pcm_channel *c, int force); 135int chn_sync(struct pcm_channel *c, int threshold); 136int chn_flush(struct pcm_channel *c); 137int chn_poll(struct pcm_channel *c, int ev, struct thread *td); 138 139int chn_init(struct pcm_channel *c, void *devinfo, int dir, int direction); 140int chn_kill(struct pcm_channel *c); 141int chn_setdir(struct pcm_channel *c, int dir); 142int chn_reset(struct pcm_channel *c, u_int32_t fmt); 143int chn_setvolume(struct pcm_channel *c, int left, int right); 144int chn_setspeed(struct pcm_channel *c, int speed); 145int chn_setformat(struct pcm_channel *c, u_int32_t fmt); 146int chn_setblocksize(struct pcm_channel *c, int blkcnt, int blksz); 147int chn_setlatency(struct pcm_channel *c, int latency); 148int chn_trigger(struct pcm_channel *c, int go); 149int chn_getptr(struct pcm_channel *c); 150struct pcmchan_caps *chn_getcaps(struct pcm_channel *c); 151u_int32_t chn_getformats(struct pcm_channel *c); 152 153void chn_resetbuf(struct pcm_channel *c); 154void chn_intr(struct pcm_channel *c); 155int chn_wrfeed(struct pcm_channel *c); 156int chn_rdfeed(struct pcm_channel *c); 157int chn_abort(struct pcm_channel *c); 158 159void chn_wrupdate(struct pcm_channel *c); 160void chn_rdupdate(struct pcm_channel *c); 161 162int chn_notify(struct pcm_channel *c, u_int32_t flags); 163void chn_lock(struct pcm_channel *c); 164void chn_unlock(struct pcm_channel *c); 165 166int chn_getrates(struct pcm_channel *c, int **rates); 167int chn_syncdestroy(struct pcm_channel *c); 168 169#ifdef OSSV4_EXPERIMENT 170int chn_getpeaks(struct pcm_channel *c, int *lpeak, int *rpeak); 171#endif 172 173#ifdef USING_MUTEX 174#define CHN_LOCK(c) mtx_lock((struct mtx *)((c)->lock)) 175#define CHN_UNLOCK(c) mtx_unlock((struct mtx *)((c)->lock)) 176#define CHN_TRYLOCK(c) mtx_trylock((struct mtx *)((c)->lock)) 177#define CHN_LOCKASSERT(c) mtx_assert((struct mtx *)((c)->lock), MA_OWNED) 178#else 179#define CHN_LOCK(c) 180#define CHN_UNLOCK(c) 181#define CHN_TRYLOCK(c) 182#define CHN_LOCKASSERT(c) 183#endif 184 185int fmtvalid(u_int32_t fmt, u_int32_t *fmtlist); 186 187#define AFMTSTR_NONE 0 /* "s16le" */ 188#define AFMTSTR_SIMPLE 1 /* "s16le:s" */ 189#define AFMTSTR_NUM 2 /* "s16le:2" */ 190#define AFMTSTR_FULL 3 /* "s16le:stereo" */ 191 192#define AFMTSTR_MAXSZ 13 /* include null terminator */ 193 194#define AFMTSTR_MONO_RETURN 0 195#define AFMTSTR_STEREO_RETURN 1 196 197struct afmtstr_table { 198 char *fmtstr; 199 u_int32_t format; 200}; 201 202int afmtstr_swap_sign(char *); 203int afmtstr_swap_endian(char *); 204u_int32_t afmtstr2afmt(struct afmtstr_table *, const char *, int); 205u_int32_t afmt2afmtstr(struct afmtstr_table *, u_int32_t, char *, size_t, int, int); 206 207extern int chn_latency; 208extern int chn_latency_profile; 209extern int report_soft_formats; 210
| 202#include "channel_if.h" 203 204int chn_reinit(struct pcm_channel *c); 205int chn_write(struct pcm_channel *c, struct uio *buf); 206int chn_read(struct pcm_channel *c, struct uio *buf); 207u_int32_t chn_start(struct pcm_channel *c, int force); 208int chn_sync(struct pcm_channel *c, int threshold); 209int chn_flush(struct pcm_channel *c); 210int chn_poll(struct pcm_channel *c, int ev, struct thread *td); 211 212int chn_init(struct pcm_channel *c, void *devinfo, int dir, int direction); 213int chn_kill(struct pcm_channel *c); 214int chn_setdir(struct pcm_channel *c, int dir); 215int chn_reset(struct pcm_channel *c, u_int32_t fmt); 216int chn_setvolume(struct pcm_channel *c, int left, int right); 217int chn_setspeed(struct pcm_channel *c, int speed); 218int chn_setformat(struct pcm_channel *c, u_int32_t fmt); 219int chn_setblocksize(struct pcm_channel *c, int blkcnt, int blksz); 220int chn_setlatency(struct pcm_channel *c, int latency); 221int chn_trigger(struct pcm_channel *c, int go); 222int chn_getptr(struct pcm_channel *c); 223struct pcmchan_caps *chn_getcaps(struct pcm_channel *c); 224u_int32_t chn_getformats(struct pcm_channel *c); 225 226void chn_resetbuf(struct pcm_channel *c); 227void chn_intr(struct pcm_channel *c); 228int chn_wrfeed(struct pcm_channel *c); 229int chn_rdfeed(struct pcm_channel *c); 230int chn_abort(struct pcm_channel *c); 231 232void chn_wrupdate(struct pcm_channel *c); 233void chn_rdupdate(struct pcm_channel *c); 234 235int chn_notify(struct pcm_channel *c, u_int32_t flags); 236void chn_lock(struct pcm_channel *c); 237void chn_unlock(struct pcm_channel *c); 238 239int chn_getrates(struct pcm_channel *c, int **rates); 240int chn_syncdestroy(struct pcm_channel *c); 241 242#ifdef OSSV4_EXPERIMENT 243int chn_getpeaks(struct pcm_channel *c, int *lpeak, int *rpeak); 244#endif 245 246#ifdef USING_MUTEX 247#define CHN_LOCK(c) mtx_lock((struct mtx *)((c)->lock)) 248#define CHN_UNLOCK(c) mtx_unlock((struct mtx *)((c)->lock)) 249#define CHN_TRYLOCK(c) mtx_trylock((struct mtx *)((c)->lock)) 250#define CHN_LOCKASSERT(c) mtx_assert((struct mtx *)((c)->lock), MA_OWNED) 251#else 252#define CHN_LOCK(c) 253#define CHN_UNLOCK(c) 254#define CHN_TRYLOCK(c) 255#define CHN_LOCKASSERT(c) 256#endif 257 258int fmtvalid(u_int32_t fmt, u_int32_t *fmtlist); 259 260#define AFMTSTR_NONE 0 /* "s16le" */ 261#define AFMTSTR_SIMPLE 1 /* "s16le:s" */ 262#define AFMTSTR_NUM 2 /* "s16le:2" */ 263#define AFMTSTR_FULL 3 /* "s16le:stereo" */ 264 265#define AFMTSTR_MAXSZ 13 /* include null terminator */ 266 267#define AFMTSTR_MONO_RETURN 0 268#define AFMTSTR_STEREO_RETURN 1 269 270struct afmtstr_table { 271 char *fmtstr; 272 u_int32_t format; 273}; 274 275int afmtstr_swap_sign(char *); 276int afmtstr_swap_endian(char *); 277u_int32_t afmtstr2afmt(struct afmtstr_table *, const char *, int); 278u_int32_t afmt2afmtstr(struct afmtstr_table *, u_int32_t, char *, size_t, int, int); 279 280extern int chn_latency; 281extern int chn_latency_profile; 282extern int report_soft_formats; 283
|
211#define PCMDIR_VIRTUAL 2 212#define PCMDIR_PLAY 1 213#define PCMDIR_REC -1
| 284#define PCMDIR_PLAY 1 285#define PCMDIR_PLAY_VIRTUAL 2 286#define PCMDIR_REC -1 287#define PCMDIR_REC_VIRTUAL -2
|
214 215#define PCMTRIG_START 1 216#define PCMTRIG_EMLDMAWR 2 217#define PCMTRIG_EMLDMARD 3 218#define PCMTRIG_STOP 0 219#define PCMTRIG_ABORT -1 220 221#define CHN_F_CLOSING 0x00000004 /* a pending close */ 222#define CHN_F_ABORTING 0x00000008 /* a pending abort */ 223#define CHN_F_RUNNING 0x00000010 /* dma is running */ 224#define CHN_F_TRIGGERED 0x00000020 225#define CHN_F_NOTRIGGER 0x00000040
| 288 289#define PCMTRIG_START 1 290#define PCMTRIG_EMLDMAWR 2 291#define PCMTRIG_EMLDMARD 3 292#define PCMTRIG_STOP 0 293#define PCMTRIG_ABORT -1 294 295#define CHN_F_CLOSING 0x00000004 /* a pending close */ 296#define CHN_F_ABORTING 0x00000008 /* a pending abort */ 297#define CHN_F_RUNNING 0x00000010 /* dma is running */ 298#define CHN_F_TRIGGERED 0x00000020 299#define CHN_F_NOTRIGGER 0x00000040
|
| 300#define CHN_F_SLEEPING 0x00000080
|
226 227#define CHN_F_BUSY 0x00001000 /* has been opened */ 228#define CHN_F_HAS_SIZE 0x00002000 /* user set block size */ 229#define CHN_F_NBIO 0x00004000 /* do non-blocking i/o */ 230#define CHN_F_MAPPED 0x00010000 /* has been mmap()ed */ 231#define CHN_F_DEAD 0x00020000 232#define CHN_F_BADSETTING 0x00040000 233#define CHN_F_SETBLOCKSIZE 0x00080000 234#define CHN_F_HAS_VCHAN 0x00100000 235 236#define CHN_F_VIRTUAL 0x10000000 /* not backed by hardware */ 237 238#define CHN_F_RESET (CHN_F_BUSY | CHN_F_DEAD | \ 239 CHN_F_HAS_VCHAN | CHN_F_VIRTUAL) 240 241 242#define CHN_N_RATE 0x00000001 243#define CHN_N_FORMAT 0x00000002 244#define CHN_N_VOLUME 0x00000004 245#define CHN_N_BLOCKSIZE 0x00000008 246#define CHN_N_TRIGGER 0x00000010 247 248#define CHN_LATENCY_MIN 0 249#define CHN_LATENCY_MAX 10 250#define CHN_LATENCY_DEFAULT 5 251#define CHN_POLICY_MIN CHN_LATENCY_MIN 252#define CHN_POLICY_MAX CHN_LATENCY_MAX 253#define CHN_POLICY_DEFAULT CHN_LATENCY_DEFAULT 254 255#define CHN_LATENCY_PROFILE_MIN 0 256#define CHN_LATENCY_PROFILE_MAX 1 257#define CHN_LATENCY_PROFILE_DEFAULT CHN_LATENCY_PROFILE_MAX 258 259/* 260 * This should be large enough to hold all pcm data between 261 * tsleeps in chn_{read,write} at the highest sample rate. 262 * (which is usually 48kHz * 16bit * stereo = 192000 bytes/sec) 263 */ 264#define CHN_2NDBUFBLKSIZE (2 * 1024) 265/* The total number of blocks per secondary bufhard. */ 266#define CHN_2NDBUFBLKNUM (32) 267/* The size of a whole secondary bufhard. */ 268#define CHN_2NDBUFMAXSIZE (131072) 269 270#define CHANNEL_DECLARE(name) static DEFINE_CLASS(name, name ## _methods, sizeof(struct kobj))
| 301 302#define CHN_F_BUSY 0x00001000 /* has been opened */ 303#define CHN_F_HAS_SIZE 0x00002000 /* user set block size */ 304#define CHN_F_NBIO 0x00004000 /* do non-blocking i/o */ 305#define CHN_F_MAPPED 0x00010000 /* has been mmap()ed */ 306#define CHN_F_DEAD 0x00020000 307#define CHN_F_BADSETTING 0x00040000 308#define CHN_F_SETBLOCKSIZE 0x00080000 309#define CHN_F_HAS_VCHAN 0x00100000 310 311#define CHN_F_VIRTUAL 0x10000000 /* not backed by hardware */ 312 313#define CHN_F_RESET (CHN_F_BUSY | CHN_F_DEAD | \ 314 CHN_F_HAS_VCHAN | CHN_F_VIRTUAL) 315 316 317#define CHN_N_RATE 0x00000001 318#define CHN_N_FORMAT 0x00000002 319#define CHN_N_VOLUME 0x00000004 320#define CHN_N_BLOCKSIZE 0x00000008 321#define CHN_N_TRIGGER 0x00000010 322 323#define CHN_LATENCY_MIN 0 324#define CHN_LATENCY_MAX 10 325#define CHN_LATENCY_DEFAULT 5 326#define CHN_POLICY_MIN CHN_LATENCY_MIN 327#define CHN_POLICY_MAX CHN_LATENCY_MAX 328#define CHN_POLICY_DEFAULT CHN_LATENCY_DEFAULT 329 330#define CHN_LATENCY_PROFILE_MIN 0 331#define CHN_LATENCY_PROFILE_MAX 1 332#define CHN_LATENCY_PROFILE_DEFAULT CHN_LATENCY_PROFILE_MAX 333 334/* 335 * This should be large enough to hold all pcm data between 336 * tsleeps in chn_{read,write} at the highest sample rate. 337 * (which is usually 48kHz * 16bit * stereo = 192000 bytes/sec) 338 */ 339#define CHN_2NDBUFBLKSIZE (2 * 1024) 340/* The total number of blocks per secondary bufhard. */ 341#define CHN_2NDBUFBLKNUM (32) 342/* The size of a whole secondary bufhard. */ 343#define CHN_2NDBUFMAXSIZE (131072) 344 345#define CHANNEL_DECLARE(name) static DEFINE_CLASS(name, name ## _methods, sizeof(struct kobj))
|