sound.h revision 187030
1139749Simp/*- 2119853Scg * Copyright (c) 1999 Cameron Grant <cg@freebsd.org> 350724Scg * Copyright by Hannu Savolainen 1995 450724Scg * All rights reserved. 550724Scg * 650724Scg * Redistribution and use in source and binary forms, with or without 750724Scg * modification, are permitted provided that the following conditions 850724Scg * are met: 950724Scg * 1. Redistributions of source code must retain the above copyright 1050724Scg * notice, this list of conditions and the following disclaimer. 1150724Scg * 2. Redistributions in binary form must reproduce the above copyright 1250724Scg * notice, this list of conditions and the following disclaimer in the 1350724Scg * documentation and/or other materials provided with the distribution. 1450724Scg * 1550724Scg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1650724Scg * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1750724Scg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1850724Scg * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1950724Scg * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2050724Scg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2150724Scg * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2250724Scg * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2350724Scg * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2450724Scg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2550724Scg * SUCH DAMAGE. 2650724Scg * 2750733Speter * $FreeBSD: head/sys/dev/sound/pcm/sound.h 187030 2009-01-10 18:19:22Z mav $ 2850724Scg */ 2950724Scg 3050724Scg/* 3150724Scg * first, include kernel header files. 3250724Scg */ 3350724Scg 3450724Scg#ifndef _OS_H_ 3550724Scg#define _OS_H_ 3650724Scg 3755205Speter#ifdef _KERNEL 3850724Scg#include <sys/param.h> 3950724Scg#include <sys/systm.h> 4050724Scg#include <sys/ioccom.h> 4150724Scg#include <sys/filio.h> 4250724Scg#include <sys/sockio.h> 4350724Scg#include <sys/fcntl.h> 44181874Sed#include <sys/selinfo.h> 4550724Scg#include <sys/proc.h> 4650724Scg#include <sys/kernel.h> /* for DATA_SET */ 4750724Scg#include <sys/module.h> 4850724Scg#include <sys/conf.h> 4950724Scg#include <sys/file.h> 5050724Scg#include <sys/uio.h> 5150724Scg#include <sys/syslog.h> 5250724Scg#include <sys/errno.h> 5350724Scg#include <sys/malloc.h> 5450724Scg#include <sys/bus.h> 55103327Sphk#if __FreeBSD_version < 500000 56103327Sphk#include <sys/buf.h> 5763469Scg#endif 5850724Scg#include <machine/resource.h> 5950724Scg#include <machine/bus.h> 6050724Scg#include <sys/rman.h> 61164614Sariff#include <sys/limits.h> 6250724Scg#include <sys/mman.h> 6350724Scg#include <sys/poll.h> 6482180Scg#include <sys/sbuf.h> 6550724Scg#include <sys/soundcard.h> 6670617Sjhb#include <sys/sysctl.h> 6773769Scg#include <sys/kobj.h> 6850724Scg#include <vm/vm.h> 6950724Scg#include <vm/pmap.h> 7050724Scg 7178670Scg#undef USING_MUTEX 7278670Scg#undef USING_DEVFS 7378670Scg 7473126Scg#if __FreeBSD_version > 500000 75103338Sbde#include <sys/lock.h> 76103338Sbde#include <sys/mutex.h> 77162588Snetchild#include <sys/condvar.h> 78103338Sbde 7973126Scg#define USING_MUTEX 8073126Scg#define USING_DEVFS 81128232Sgreen#else 82128232Sgreen#define INTR_TYPE_AV INTR_TYPE_TTY 83128232Sgreen#define INTR_MPSAFE 0 8473760Scg#endif 8582180Scg 8673126Scg#define SND_DYNSYSCTL 8773126Scg 8874763Scgstruct pcm_channel; 8974763Scgstruct pcm_feeder; 9074763Scgstruct snd_dbuf; 9174763Scgstruct snd_mixer; 9274763Scg 9374763Scg#include <dev/sound/pcm/buffer.h> 9453465Scg#include <dev/sound/pcm/channel.h> 9564881Scg#include <dev/sound/pcm/feeder.h> 9653465Scg#include <dev/sound/pcm/mixer.h> 97162588Snetchild#include <dev/sound/pcm/dsp.h> 98170161Sariff#include <dev/sound/clone.h> 99170161Sariff#include <dev/sound/unit.h> 10050724Scg 10182180Scg#define PCM_SOFTC_SIZE 512 10277269Scg 10374763Scg#define SND_STATUSLEN 64 10464442Scg 105168846Sariff#define SOUND_MODVER 2 10662483Scg 107168846Sariff#define SOUND_MINVER SOUND_MODVER 108132236Stanimura#define SOUND_PREFVER SOUND_MODVER 109168846Sariff#define SOUND_MAXVER SOUND_MODVER 11062483Scg 11178362Scg/* 112169319Sariff * We're abusing the fact that MAXMINOR still have enough room 113170161Sariff * for our bit twiddling and nobody ever need 512 unique soundcards, 114170161Sariff * 32 unique device types and 1024 unique cloneable devices for the 115170161Sariff * next 100 years... 116169319Sariff */ 11750724Scg 118170161Sariff#define PCMMAXUNIT (snd_max_u()) 119170161Sariff#define PCMMAXDEV (snd_max_d()) 120170161Sariff#define PCMMAXCHAN (snd_max_c()) 12178362Scg 122170161Sariff#define PCMMAXCLONE PCMMAXCHAN 123170161Sariff 124170161Sariff#define PCMUNIT(x) (snd_unit2u(dev2unit(x))) 125170161Sariff#define PCMDEV(x) (snd_unit2d(dev2unit(x))) 126170161Sariff#define PCMCHAN(x) (snd_unit2c(dev2unit(x))) 127170161Sariff 128170161Sariff/* 129170161Sariff * By design, limit possible channels for each direction. 130170161Sariff */ 131170161Sariff#define SND_MAXHWCHAN 256 132170161Sariff#define SND_MAXVCHANS SND_MAXHWCHAN 133170161Sariff 13450724Scg#define SD_F_SIMPLEX 0x00000001 135150827Snetchild#define SD_F_AUTOVCHAN 0x00000002 136162738Sariff#define SD_F_SOFTPCMVOL 0x00000004 137167644Sariff#define SD_F_PSWAPLR 0x00000008 138167644Sariff#define SD_F_RSWAPLR 0x00000010 139170161Sariff#define SD_F_DYING 0x00000020 140170161Sariff#define SD_F_SUICIDE 0x00000040 141170815Sariff#define SD_F_BUSY 0x00000080 142170815Sariff#define SD_F_MPSAFE 0x00000100 143170815Sariff#define SD_F_REGISTERED 0x00000200 144170815Sariff 14550724Scg#define SD_F_PRIO_RD 0x10000000 14650724Scg#define SD_F_PRIO_WR 0x20000000 14750724Scg#define SD_F_PRIO_SET (SD_F_PRIO_RD | SD_F_PRIO_WR) 14850724Scg#define SD_F_DIR_SET 0x40000000 14950724Scg#define SD_F_TRANSIENT 0xf0000000 15050724Scg 151170815Sariff#define PCM_ALIVE(x) ((x) != NULL && (x)->lock != NULL && \ 152170815Sariff !((x)->flags & SD_F_DYING)) 153170815Sariff#define PCM_REGISTERED(x) (PCM_ALIVE(x) && \ 154170815Sariff ((x)->flags & SD_F_REGISTERED)) 155170815Sariff 15650724Scg/* many variables should be reduced to a range. Here define a macro */ 15750724Scg#define RANGE(var, low, high) (var) = \ 15850724Scg (((var)<(low))? (low) : ((var)>(high))? (high) : (var)) 15955204Scg#define DSP_BUFFSIZE (8192) 16050724Scg 161164614Sariff/* 162164614Sariff * Macros for reading/writing PCM sample / int values from bytes array. 163164614Sariff * Since every process is done using signed integer (and to make our life 164164614Sariff * less miserable), unsigned sample will be converted to its signed 165164614Sariff * counterpart and restored during writing back. To avoid overflow, 166164614Sariff * we truncate 32bit (and only 32bit) samples down to 24bit (see below 167164614Sariff * for the reason), unless PCM_USE_64BIT_ARITH is defined. 168164614Sariff */ 169164614Sariff 170164614Sariff/* 171164614Sariff * Automatically turn on 64bit arithmetic on suitable archs 172164614Sariff * (amd64 64bit, ia64, etc..) for wider 32bit samples / integer processing. 173164614Sariff */ 174164614Sariff#if LONG_BIT >= 64 175164614Sariff#undef PCM_USE_64BIT_ARITH 176164614Sariff#define PCM_USE_64BIT_ARITH 1 177164614Sariff#else 178164614Sariff#if 0 179164614Sariff#undef PCM_USE_64BIT_ARITH 180164614Sariff#define PCM_USE_64BIT_ARITH 1 181164614Sariff#endif 182164614Sariff#endif 183164614Sariff 184164614Sariff#ifdef PCM_USE_64BIT_ARITH 185164614Sarifftypedef int64_t intpcm_t; 186164614Sariff#else 187164614Sarifftypedef int32_t intpcm_t; 188164614Sariff#endif 189164614Sariff 190164614Sariff/* 32bit fixed point shift */ 191164614Sariff#define PCM_FXSHIFT 8 192164614Sariff 193164614Sariff#define PCM_S8_MAX 0x7f 194164614Sariff#define PCM_S8_MIN -0x80 195164614Sariff#define PCM_S16_MAX 0x7fff 196164614Sariff#define PCM_S16_MIN -0x8000 197164614Sariff#define PCM_S24_MAX 0x7fffff 198164614Sariff#define PCM_S24_MIN -0x800000 199164614Sariff#ifdef PCM_USE_64BIT_ARITH 200164614Sariff#if LONG_BIT >= 64 201164614Sariff#define PCM_S32_MAX 0x7fffffffL 202164614Sariff#define PCM_S32_MIN -0x80000000L 203164614Sariff#else 204164614Sariff#define PCM_S32_MAX 0x7fffffffLL 205164614Sariff#define PCM_S32_MIN -0x80000000LL 206164614Sariff#endif 207164614Sariff#else 208164614Sariff#define PCM_S32_MAX 0x7fffffff 209164614Sariff#define PCM_S32_MIN (-0x7fffffff - 1) 210164614Sariff#endif 211164614Sariff 212164614Sariff/* Bytes-per-sample definition */ 213164614Sariff#define PCM_8_BPS 1 214164614Sariff#define PCM_16_BPS 2 215164614Sariff#define PCM_24_BPS 3 216164614Sariff#define PCM_32_BPS 4 217164614Sariff 218164614Sariff#if BYTE_ORDER == LITTLE_ENDIAN 219164614Sariff#define PCM_READ_S16_LE(b8) *((int16_t *)(b8)) 220164614Sariff#define _PCM_READ_S32_LE(b8) *((int32_t *)(b8)) 221164614Sariff#define PCM_READ_S16_BE(b8) \ 222164614Sariff ((int32_t)((b8)[1] | ((int8_t)((b8)[0])) << 8)) 223164614Sariff#define _PCM_READ_S32_BE(b8) \ 224164614Sariff ((int32_t)((b8)[3] | (b8)[2] << 8 | (b8)[1] << 16 | \ 225164614Sariff ((int8_t)((b8)[0])) << 24)) 226164614Sariff 227164614Sariff#define PCM_WRITE_S16_LE(b8, val) *((int16_t *)(b8)) = (val) 228164614Sariff#define _PCM_WRITE_S32_LE(b8, val) *((int32_t *)(b8)) = (val) 229164614Sariff#define PCM_WRITE_S16_BE(bb8, vval) do { \ 230164614Sariff int32_t val = (vval); \ 231164614Sariff uint8_t *b8 = (bb8); \ 232164614Sariff b8[1] = val; \ 233164614Sariff b8[0] = val >> 8; \ 234164614Sariff } while(0) 235164614Sariff#define _PCM_WRITE_S32_BE(bb8, vval) do { \ 236164614Sariff int32_t val = (vval); \ 237164614Sariff uint8_t *b8 = (bb8); \ 238164614Sariff b8[3] = val; \ 239164614Sariff b8[2] = val >> 8; \ 240164614Sariff b8[1] = val >> 16; \ 241164614Sariff b8[0] = val >> 24; \ 242164614Sariff } while(0) 243164614Sariff 244164614Sariff#define PCM_READ_U16_LE(b8) ((int16_t)(*((uint16_t *)(b8)) ^ 0x8000)) 245164614Sariff#define _PCM_READ_U32_LE(b8) ((int32_t)(*((uint32_t *)(b8)) ^ 0x80000000)) 246164614Sariff#define PCM_READ_U16_BE(b8) \ 247164614Sariff ((int32_t)((b8)[1] | ((int8_t)((b8)[0] ^ 0x80)) << 8)) 248164614Sariff#define _PCM_READ_U32_BE(b8) \ 249164614Sariff ((int32_t)((b8)[3] | (b8)[2] << 8 | (b8)[1] << 16 | \ 250164614Sariff ((int8_t)((b8)[0] ^ 0x80)) << 24)) 251164614Sariff 252164614Sariff#define PCM_WRITE_U16_LE(b8, val) *((uint16_t *)(b8)) = (val) ^ 0x8000 253164614Sariff#define _PCM_WRITE_U32_LE(b8, val) *((uint32_t *)(b8)) = (val) ^ 0x80000000 254164614Sariff#define PCM_WRITE_U16_BE(bb8, vval) do { \ 255164614Sariff int32_t val = (vval); \ 256164614Sariff uint8_t *b8 = (bb8); \ 257164614Sariff b8[1] = val; \ 258164614Sariff b8[0] = (val >> 8) ^ 0x80; \ 259164614Sariff } while(0) 260164614Sariff#define _PCM_WRITE_U32_BE(bb8, vval) do { \ 261164614Sariff int32_t val = (vval); \ 262164614Sariff uint8_t *b8 = (bb8); \ 263164614Sariff b8[3] = val; \ 264164614Sariff b8[2] = val >> 8; \ 265164614Sariff b8[1] = val >> 16; \ 266164614Sariff b8[0] = (val >> 24) ^ 0x80; \ 267164614Sariff } while(0) 268164614Sariff#else /* !LITTLE_ENDIAN */ 269164614Sariff#define PCM_READ_S16_LE(b8) \ 270164614Sariff ((int32_t)((b8)[0] | ((int8_t)((b8)[1])) << 8)) 271164614Sariff#define _PCM_READ_S32_LE(b8) \ 272164614Sariff ((int32_t)((b8)[0] | (b8)[1] << 8 | (b8)[2] << 16 | \ 273164614Sariff ((int8_t)((b8)[3])) << 24)) 274164614Sariff#define PCM_READ_S16_BE(b8) *((int16_t *)(b8)) 275164614Sariff#define _PCM_READ_S32_BE(b8) *((int32_t *)(b8)) 276164614Sariff 277164614Sariff#define PCM_WRITE_S16_LE(bb8, vval) do { \ 278164614Sariff int32_t val = (vval); \ 279164614Sariff uint8_t *b8 = (bb8); \ 280164614Sariff b8[0] = val; \ 281164614Sariff b8[1] = val >> 8; \ 282164614Sariff } while(0) 283164614Sariff#define _PCM_WRITE_S32_LE(bb8, vval) do { \ 284164614Sariff int32_t val = (vval); \ 285164614Sariff uint8_t *b8 = (bb8); \ 286164614Sariff b8[0] = val; \ 287164614Sariff b8[1] = val >> 8; \ 288164614Sariff b8[2] = val >> 16; \ 289164614Sariff b8[3] = val >> 24; \ 290164614Sariff } while(0) 291164614Sariff#define PCM_WRITE_S16_BE(b8, val) *((int16_t *)(b8)) = (val) 292164614Sariff#define _PCM_WRITE_S32_BE(b8, val) *((int32_t *)(b8)) = (val) 293164614Sariff 294164614Sariff#define PCM_READ_U16_LE(b8) \ 295164614Sariff ((int32_t)((b8)[0] | ((int8_t)((b8)[1] ^ 0x80)) << 8)) 296164614Sariff#define _PCM_READ_U32_LE(b8) \ 297164614Sariff ((int32_t)((b8)[0] | (b8)[1] << 8 | (b8)[2] << 16 | \ 298164614Sariff ((int8_t)((b8)[3] ^ 0x80)) << 24)) 299164614Sariff#define PCM_READ_U16_BE(b8) ((int16_t)(*((uint16_t *)(b8)) ^ 0x8000)) 300164614Sariff#define _PCM_READ_U32_BE(b8) ((int32_t)(*((uint32_t *)(b8)) ^ 0x80000000)) 301164614Sariff 302164614Sariff#define PCM_WRITE_U16_LE(bb8, vval) do { \ 303164614Sariff int32_t val = (vval); \ 304164614Sariff uint8_t *b8 = (bb8); \ 305164614Sariff b8[0] = val; \ 306164614Sariff b8[1] = (val >> 8) ^ 0x80; \ 307164614Sariff } while(0) 308164614Sariff#define _PCM_WRITE_U32_LE(bb8, vval) do { \ 309164614Sariff int32_t val = (vval); \ 310164614Sariff uint8_t *b8 = (bb8); \ 311164614Sariff b8[0] = val; \ 312164614Sariff b8[1] = val >> 8; \ 313164614Sariff b8[2] = val >> 16; \ 314164614Sariff b8[3] = (val >> 24) ^ 0x80; \ 315164614Sariff } while(0) 316164614Sariff#define PCM_WRITE_U16_BE(b8, val) *((uint16_t *)(b8)) = (val) ^ 0x8000 317164614Sariff#define _PCM_WRITE_U32_BE(b8, val) *((uint32_t *)(b8)) = (val) ^ 0x80000000 318164614Sariff#endif 319164614Sariff 320164614Sariff#define PCM_READ_S24_LE(b8) \ 321164614Sariff ((int32_t)((b8)[0] | (b8)[1] << 8 | ((int8_t)((b8)[2])) << 16)) 322164614Sariff#define PCM_READ_S24_BE(b8) \ 323164614Sariff ((int32_t)((b8)[2] | (b8)[1] << 8 | ((int8_t)((b8)[0])) << 16)) 324164614Sariff 325164614Sariff#define PCM_WRITE_S24_LE(bb8, vval) do { \ 326164614Sariff int32_t val = (vval); \ 327164614Sariff uint8_t *b8 = (bb8); \ 328164614Sariff b8[0] = val; \ 329164614Sariff b8[1] = val >> 8; \ 330164614Sariff b8[2] = val >> 16; \ 331164614Sariff } while(0) 332164614Sariff#define PCM_WRITE_S24_BE(bb8, vval) do { \ 333164614Sariff int32_t val = (vval); \ 334164614Sariff uint8_t *b8 = (bb8); \ 335164614Sariff b8[2] = val; \ 336164614Sariff b8[1] = val >> 8; \ 337164614Sariff b8[0] = val >> 16; \ 338164614Sariff } while(0) 339164614Sariff 340164614Sariff#define PCM_READ_U24_LE(b8) \ 341164614Sariff ((int32_t)((b8)[0] | (b8)[1] << 8 | \ 342164614Sariff ((int8_t)((b8)[2] ^ 0x80)) << 16)) 343164614Sariff#define PCM_READ_U24_BE(b8) \ 344164614Sariff ((int32_t)((b8)[2] | (b8)[1] << 8 | \ 345164614Sariff ((int8_t)((b8)[0] ^ 0x80)) << 16)) 346164614Sariff 347164614Sariff#define PCM_WRITE_U24_LE(bb8, vval) do { \ 348164614Sariff int32_t val = (vval); \ 349164614Sariff uint8_t *b8 = (bb8); \ 350164614Sariff b8[0] = val; \ 351164614Sariff b8[1] = val >> 8; \ 352164614Sariff b8[2] = (val >> 16) ^ 0x80; \ 353164614Sariff } while(0) 354164614Sariff#define PCM_WRITE_U24_BE(bb8, vval) do { \ 355164614Sariff int32_t val = (vval); \ 356164614Sariff uint8_t *b8 = (bb8); \ 357164614Sariff b8[2] = val; \ 358164614Sariff b8[1] = val >> 8; \ 359164614Sariff b8[0] = (val >> 16) ^ 0x80; \ 360164614Sariff } while(0) 361164614Sariff 362164614Sariff#ifdef PCM_USE_64BIT_ARITH 363164614Sariff#define PCM_READ_S32_LE(b8) _PCM_READ_S32_LE(b8) 364164614Sariff#define PCM_READ_S32_BE(b8) _PCM_READ_S32_BE(b8) 365164614Sariff#define PCM_WRITE_S32_LE(b8, val) _PCM_WRITE_S32_LE(b8, val) 366164614Sariff#define PCM_WRITE_S32_BE(b8, val) _PCM_WRITE_S32_BE(b8, val) 367164614Sariff 368164614Sariff#define PCM_READ_U32_LE(b8) _PCM_READ_U32_LE(b8) 369164614Sariff#define PCM_READ_U32_BE(b8) _PCM_READ_U32_BE(b8) 370164614Sariff#define PCM_WRITE_U32_LE(b8, val) _PCM_WRITE_U32_LE(b8, val) 371164614Sariff#define PCM_WRITE_U32_BE(b8, val) _PCM_WRITE_U32_BE(b8, val) 372164614Sariff#else /* !PCM_USE_64BIT_ARITH */ 373164614Sariff/* 374164614Sariff * 24bit integer ?!? This is quite unfortunate, eh? Get the fact straight: 375164614Sariff * Dynamic range for: 376164614Sariff * 1) Human =~ 140db 377164614Sariff * 2) 16bit = 96db (close enough) 378164614Sariff * 3) 24bit = 144db (perfect) 379164614Sariff * 4) 32bit = 196db (way too much) 380164614Sariff * 5) Bugs Bunny = Gazillion!@%$Erbzzztt-EINVAL db 381164614Sariff * Since we're not Bugs Bunny ..uh..err.. avoiding 64bit arithmetic, 24bit 382164614Sariff * is pretty much sufficient for our signed integer processing. 383164614Sariff */ 384164614Sariff#define PCM_READ_S32_LE(b8) (_PCM_READ_S32_LE(b8) >> PCM_FXSHIFT) 385164614Sariff#define PCM_READ_S32_BE(b8) (_PCM_READ_S32_BE(b8) >> PCM_FXSHIFT) 386164614Sariff#define PCM_WRITE_S32_LE(b8, val) _PCM_WRITE_S32_LE(b8, (val) << PCM_FXSHIFT) 387164614Sariff#define PCM_WRITE_S32_BE(b8, val) _PCM_WRITE_S32_BE(b8, (val) << PCM_FXSHIFT) 388164614Sariff 389164614Sariff#define PCM_READ_U32_LE(b8) (_PCM_READ_U32_LE(b8) >> PCM_FXSHIFT) 390164614Sariff#define PCM_READ_U32_BE(b8) (_PCM_READ_U32_BE(b8) >> PCM_FXSHIFT) 391164614Sariff#define PCM_WRITE_U32_LE(b8, val) _PCM_WRITE_U32_LE(b8, (val) << PCM_FXSHIFT) 392164614Sariff#define PCM_WRITE_U32_BE(b8, val) _PCM_WRITE_U32_BE(b8, (val) << PCM_FXSHIFT) 393164614Sariff#endif 394164614Sariff 395164614Sariff/* 396164614Sariff * 8bit sample is pretty much useless since it doesn't provide 397164614Sariff * sufficient dynamic range throughout our filtering process. 398164614Sariff * For the sake of completeness, declare it anyway. 399164614Sariff */ 400164614Sariff#define PCM_READ_S8(b8) *((int8_t *)(b8)) 401164614Sariff#define PCM_READ_S8_NE(b8) PCM_READ_S8(b8) 402164614Sariff#define PCM_READ_U8(b8) ((int8_t)(*((uint8_t *)(b8)) ^ 0x80)) 403164614Sariff#define PCM_READ_U8_NE(b8) PCM_READ_U8(b8) 404164614Sariff 405164614Sariff#define PCM_WRITE_S8(b8, val) *((int8_t *)(b8)) = (val) 406164614Sariff#define PCM_WRITE_S8_NE(b8, val) PCM_WRITE_S8(b8, val) 407164614Sariff#define PCM_WRITE_U8(b8, val) *((uint8_t *)(b8)) = (val) ^ 0x80 408164614Sariff#define PCM_WRITE_U8_NE(b8, val) PCM_WRITE_U8(b8, val) 409164614Sariff 410164614Sariff#define PCM_CLAMP_S8(val) \ 411164614Sariff (((val) > PCM_S8_MAX) ? PCM_S8_MAX : \ 412164614Sariff (((val) < PCM_S8_MIN) ? PCM_S8_MIN : (val))) 413164614Sariff#define PCM_CLAMP_S16(val) \ 414164614Sariff (((val) > PCM_S16_MAX) ? PCM_S16_MAX : \ 415164614Sariff (((val) < PCM_S16_MIN) ? PCM_S16_MIN : (val))) 416164614Sariff#define PCM_CLAMP_S24(val) \ 417164614Sariff (((val) > PCM_S24_MAX) ? PCM_S24_MAX : \ 418164614Sariff (((val) < PCM_S24_MIN) ? PCM_S24_MIN : (val))) 419164614Sariff 420164614Sariff#ifdef PCM_USE_64BIT_ARITH 421164614Sariff#define PCM_CLAMP_S32(val) \ 422164614Sariff (((val) > PCM_S32_MAX) ? PCM_S32_MAX : \ 423164614Sariff (((val) < PCM_S32_MIN) ? PCM_S32_MIN : (val))) 424164614Sariff#else 425164614Sariff#define PCM_CLAMP_S32(val) \ 426164614Sariff (((val) > PCM_S24_MAX) ? PCM_S32_MAX : \ 427164614Sariff (((val) < PCM_S24_MIN) ? PCM_S32_MIN : \ 428164614Sariff ((val) << PCM_FXSHIFT))) 429164614Sariff#endif 430164614Sariff 431164614Sariff#define PCM_CLAMP_U8(val) PCM_CLAMP_S8(val) 432164614Sariff#define PCM_CLAMP_U16(val) PCM_CLAMP_S16(val) 433164614Sariff#define PCM_CLAMP_U24(val) PCM_CLAMP_S24(val) 434164614Sariff#define PCM_CLAMP_U32(val) PCM_CLAMP_S32(val) 435164614Sariff 43650724Scg/* make figuring out what a format is easier. got AFMT_STEREO already */ 43765486Scg#define AFMT_32BIT (AFMT_S32_LE | AFMT_S32_BE | AFMT_U32_LE | AFMT_U32_BE) 438148606Snetchild#define AFMT_24BIT (AFMT_S24_LE | AFMT_S24_BE | AFMT_U24_LE | AFMT_U24_BE) 43950724Scg#define AFMT_16BIT (AFMT_S16_LE | AFMT_S16_BE | AFMT_U16_LE | AFMT_U16_BE) 440149950Snetchild#define AFMT_8BIT (AFMT_MU_LAW | AFMT_A_LAW | AFMT_U8 | AFMT_S8) 441148606Snetchild#define AFMT_SIGNED (AFMT_S32_LE | AFMT_S32_BE | AFMT_S24_LE | AFMT_S24_BE | \ 442148606Snetchild AFMT_S16_LE | AFMT_S16_BE | AFMT_S8) 443148606Snetchild#define AFMT_BIGENDIAN (AFMT_S32_BE | AFMT_U32_BE | AFMT_S24_BE | AFMT_U24_BE | \ 444148606Snetchild AFMT_S16_BE | AFMT_U16_BE) 44550724Scg 44674763Scgstruct pcm_channel *fkchan_setup(device_t dev); 44774763Scgint fkchan_kill(struct pcm_channel *c); 44850724Scg 44978362Scg/* 45050724Scg * Minor numbers for the sound driver. 45150724Scg * 45250724Scg * Unfortunately Creative called the codec chip of SB as a DSP. For this 45350724Scg * reason the /dev/dsp is reserved for digitized audio use. There is a 45450724Scg * device for true DSP processors but it will be called something else. 45550724Scg * In v3.0 it's /dev/sndproc but this could be a temporary solution. 45650724Scg */ 45750724Scg 45850724Scg#define SND_DEV_CTL 0 /* Control port /dev/mixer */ 45950724Scg#define SND_DEV_SEQ 1 /* Sequencer /dev/sequencer */ 46050724Scg#define SND_DEV_MIDIN 2 /* Raw midi access */ 46150724Scg#define SND_DEV_DSP 3 /* Digitized voice /dev/dsp */ 46250724Scg#define SND_DEV_AUDIO 4 /* Sparc compatible /dev/audio */ 46350724Scg#define SND_DEV_DSP16 5 /* Like /dev/dsp but 16 bits/sample */ 46450724Scg#define SND_DEV_STATUS 6 /* /dev/sndstat */ 46550724Scg /* #7 not in use now. */ 46650724Scg#define SND_DEV_SEQ2 8 /* /dev/sequencer, level 2 interface */ 46750724Scg#define SND_DEV_SNDPROC 9 /* /dev/sndproc for programmable devices */ 46850724Scg#define SND_DEV_PSS SND_DEV_SNDPROC /* ? */ 46951769Scg#define SND_DEV_NORESET 10 47050724Scg 471170161Sariff#define SND_DEV_DSPHW_PLAY 11 /* specific playback channel */ 472170161Sariff#define SND_DEV_DSPHW_VPLAY 12 /* specific virtual playback channel */ 473170161Sariff#define SND_DEV_DSPHW_REC 13 /* specific record channel */ 474170161Sariff#define SND_DEV_DSPHW_VREC 14 /* specific virtual record channel */ 475170161Sariff 476170815Sariff#define SND_DEV_DSPHW_CD 15 /* s16le/stereo 44100Hz CD */ 477170815Sariff 478170815Sariff#define SND_DEV_DSP_MMAP 16 /* OSSv4 compatible /dev/dsp_mmap */ 479170815Sariff 480170815Sariff#define SND_DEV_LAST SND_DEV_DSP_MMAP 481170815Sariff#define SND_DEV_MAX PCMMAXDEV 482170815Sariff 48350724Scg#define DSP_DEFAULT_SPEED 8000 48450724Scg 48550724Scg#define ON 1 48650724Scg#define OFF 0 48750724Scg 48889834Scgextern int pcm_veto_load; 48978362Scgextern int snd_unit; 490164614Sariffextern int snd_maxautovchans; 491164614Sariffextern int snd_verbose; 49278362Scgextern devclass_t pcm_devclass; 493162588Snetchildextern struct unrhdr *pcmsg_unrhdr; 49478362Scg 49550724Scg/* 49650724Scg * some macros for debugging purposes 49750724Scg * DDB/DEB to enable/disable debugging stuff 49850724Scg * BVDDB to enable debugging when bootverbose 49950724Scg */ 50050724Scg#define BVDDB(x) if (bootverbose) x 50150724Scg 50250724Scg#ifndef DEB 50350724Scg#define DEB(x) 50450724Scg#endif 50550724Scg 50670617SjhbSYSCTL_DECL(_hw_snd); 50770617Sjhb 50882180Scgstruct pcm_channel *pcm_getfakechan(struct snddev_info *d); 509170161Sariffint pcm_chnalloc(struct snddev_info *d, struct pcm_channel **ch, int direction, pid_t pid, int devunit); 51078214Scgint pcm_chnrelease(struct pcm_channel *c); 51177269Scgint pcm_chnref(struct pcm_channel *c, int ref); 51282180Scgint pcm_inprog(struct snddev_info *d, int delta); 51377269Scg 514170161Sariffstruct pcm_channel *pcm_chn_create(struct snddev_info *d, struct pcm_channel *parent, kobj_class_t cls, int dir, int num, void *devinfo); 51577269Scgint pcm_chn_destroy(struct pcm_channel *ch); 516124740Smatkint pcm_chn_add(struct snddev_info *d, struct pcm_channel *ch); 517124740Smatkint pcm_chn_remove(struct snddev_info *d, struct pcm_channel *ch); 51877269Scg 51970134Scgint pcm_addchan(device_t dev, int dir, kobj_class_t cls, void *devinfo); 520160439Snetchildunsigned int pcm_getbuffersize(device_t dev, unsigned int minbufsz, unsigned int deflt, unsigned int maxbufsz); 52150724Scgint pcm_register(device_t dev, void *devinfo, int numplay, int numrec); 52265340Scgint pcm_unregister(device_t dev); 52350724Scgint pcm_setstatus(device_t dev, char *str); 52450724Scgu_int32_t pcm_getflags(device_t dev); 52550724Scgvoid pcm_setflags(device_t dev, u_int32_t val); 52658384Scgvoid *pcm_getdevinfo(device_t dev); 52750724Scg 528124617Sphk 52973131Scgint snd_setup_intr(device_t dev, struct resource *res, int flags, 53073131Scg driver_intr_t hand, void *param, void **cookiep); 53173131Scg 53293814Sjhbvoid *snd_mtxcreate(const char *desc, const char *type); 53373131Scgvoid snd_mtxfree(void *m); 53473131Scgvoid snd_mtxassert(void *m); 535119096Scg#define snd_mtxlock(m) mtx_lock(m) 536119096Scg#define snd_mtxunlock(m) mtx_unlock(m) 537119096Scg 53882180Scgint sysctl_hw_snd_vchans(SYSCTL_HANDLER_ARGS); 53982180Scg 54082180Scgtypedef int (*sndstat_handler)(struct sbuf *s, device_t dev, int verbose); 541170161Sariffint sndstat_acquire(struct thread *td); 542170161Sariffint sndstat_release(struct thread *td); 54382180Scgint sndstat_register(device_t dev, char *str, sndstat_handler handler); 54482180Scgint sndstat_registerfile(char *str); 54582180Scgint sndstat_unregister(device_t dev); 54682180Scgint sndstat_unregisterfile(char *str); 54782180Scg 54882180Scg#define SND_DECLARE_FILE(version) \ 54982180Scg _SND_DECLARE_FILE(__LINE__, version) 55082180Scg 55182180Scg#define _SND_DECLARE_FILE(uniq, version) \ 55282180Scg __SND_DECLARE_FILE(uniq, version) 55382180Scg 55482180Scg#define __SND_DECLARE_FILE(uniq, version) \ 55582180Scg static char sndstat_vinfo[] = version; \ 55682180Scg SYSINIT(sdf_ ## uniq, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, sndstat_registerfile, sndstat_vinfo); \ 55782180Scg SYSUNINIT(sdf_ ## uniq, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, sndstat_unregisterfile, sndstat_vinfo); 55882180Scg 55950724Scg/* usage of flags in device config entry (config file) */ 56050724Scg#define DV_F_DRQ_MASK 0x00000007 /* mask for secondary drq */ 56150724Scg#define DV_F_DUAL_DMA 0x00000010 /* set to use secondary dma channel */ 56250724Scg 563119096Scg/* ought to be made obsolete but still used by mss */ 56450724Scg#define DV_F_DEV_MASK 0x0000ff00 /* force device type/class */ 56550724Scg#define DV_F_DEV_SHIFT 8 /* force device type/class */ 56682180Scg 567119096Scg#define PCM_DEBUG_MTX 568107237Scg 569119096Scg/* 570119096Scg * this is rather kludgey- we need to duplicate these struct def'ns from sound.c 571119096Scg * so that the macro versions of pcm_{,un}lock can dereference them. 572124617Sphk * we also have to do this now makedev() has gone away. 573119096Scg */ 574119096Scg 575119096Scgstruct snddev_info { 576170161Sariff struct { 577170161Sariff struct { 578170161Sariff SLIST_HEAD(, pcm_channel) head; 579170161Sariff struct { 580170161Sariff SLIST_HEAD(, pcm_channel) head; 581170161Sariff } busy; 582170161Sariff } pcm; 583170161Sariff } channels; 584170815Sariff TAILQ_HEAD(dsp_cdevinfo_linkhead, dsp_cdevinfo) dsp_cdevinfo_pool; 585170161Sariff struct snd_clone *clones; 586119096Scg struct pcm_channel *fakechan; 587170161Sariff unsigned devcount, playcount, reccount, pvchancount, rvchancount ; 588119096Scg unsigned flags; 589119096Scg int inprog; 590119096Scg unsigned int bufsz; 591119096Scg void *devinfo; 592119096Scg device_t dev; 593119096Scg char status[SND_STATUSLEN]; 594119096Scg struct mtx *lock; 595130585Sphk struct cdev *mixer_dev; 596170161Sariff uint32_t pvchanrate, pvchanformat; 597170161Sariff uint32_t rvchanrate, rvchanformat; 598170161Sariff struct sysctl_ctx_list play_sysctl_ctx, rec_sysctl_ctx; 599170161Sariff struct sysctl_oid *play_sysctl_tree, *rec_sysctl_tree; 600170815Sariff struct cv cv; 601119096Scg}; 602119096Scg 603162588Snetchildvoid sound_oss_sysinfo(oss_sysinfo *); 604187030Smavint sound_oss_card_info(oss_card_info *); 605162588Snetchild 606124617Sphk#ifdef PCM_DEBUG_MTX 607119096Scg#define pcm_lock(d) mtx_lock(((struct snddev_info *)(d))->lock) 608119096Scg#define pcm_unlock(d) mtx_unlock(((struct snddev_info *)(d))->lock) 609119096Scg#else 610119096Scgvoid pcm_lock(struct snddev_info *d); 611119096Scgvoid pcm_unlock(struct snddev_info *d); 612119096Scg#endif 613119096Scg 614170815Sariff/* 615170815Sariff * For PCM_CV_[WAIT | ACQUIRE | RELEASE], be sure to surround these 616170815Sariff * with pcm_lock/unlock() sequence, or I'll come to gnaw upon you! 617170815Sariff */ 618170815Sariff#ifdef SND_DIAGNOSTIC 619170815Sariff#define PCM_WAIT(x) do { \ 620170815Sariff if (mtx_owned((x)->lock) == 0) \ 621170815Sariff panic("%s(%d): [PCM WAIT] Mutex not owned!", \ 622170815Sariff __func__, __LINE__); \ 623170815Sariff while ((x)->flags & SD_F_BUSY) { \ 624170815Sariff if (snd_verbose > 3) \ 625170815Sariff device_printf((x)->dev, \ 626170815Sariff "%s(%d): [PCM WAIT] calling cv_wait().\n", \ 627170815Sariff __func__, __LINE__); \ 628170815Sariff cv_wait(&(x)->cv, (x)->lock); \ 629170815Sariff } \ 630170815Sariff} while(0) 631170815Sariff 632170815Sariff#define PCM_ACQUIRE(x) do { \ 633170815Sariff if (mtx_owned((x)->lock) == 0) \ 634170815Sariff panic("%s(%d): [PCM ACQUIRE] Mutex not owned!", \ 635170815Sariff __func__, __LINE__); \ 636170815Sariff if ((x)->flags & SD_F_BUSY) \ 637170815Sariff panic("%s(%d): [PCM ACQUIRE] " \ 638170815Sariff "Trying to acquire BUSY cv!", __func__, __LINE__); \ 639170815Sariff (x)->flags |= SD_F_BUSY; \ 640170815Sariff} while(0) 641170815Sariff 642170815Sariff#define PCM_RELEASE(x) do { \ 643170815Sariff if (mtx_owned((x)->lock) == 0) \ 644170815Sariff panic("%s(%d): [PCM RELEASE] Mutex not owned!", \ 645170815Sariff __func__, __LINE__); \ 646170815Sariff if ((x)->flags & SD_F_BUSY) { \ 647170815Sariff (x)->flags &= ~SD_F_BUSY; \ 648170815Sariff if ((x)->cv.cv_waiters != 0) { \ 649170815Sariff if ((x)->cv.cv_waiters > 1 && snd_verbose > 3) \ 650170815Sariff device_printf((x)->dev, \ 651170815Sariff "%s(%d): [PCM RELEASE] " \ 652170815Sariff "cv_waiters=%d > 1!\n", \ 653170815Sariff __func__, __LINE__, \ 654170815Sariff (x)->cv.cv_waiters); \ 655170815Sariff cv_broadcast(&(x)->cv); \ 656170815Sariff } \ 657170815Sariff } else \ 658170815Sariff panic("%s(%d): [PCM RELEASE] Releasing non-BUSY cv!", \ 659170815Sariff __func__, __LINE__); \ 660170815Sariff} while(0) 661170815Sariff 662170815Sariff/* Quick version, for shorter path. */ 663170815Sariff#define PCM_ACQUIRE_QUICK(x) do { \ 664170815Sariff if (mtx_owned((x)->lock) != 0) \ 665170815Sariff panic("%s(%d): [PCM ACQUIRE QUICK] Mutex owned!", \ 666170815Sariff __func__, __LINE__); \ 667170815Sariff pcm_lock(x); \ 668170815Sariff PCM_WAIT(x); \ 669170815Sariff PCM_ACQUIRE(x); \ 670170815Sariff pcm_unlock(x); \ 671170815Sariff} while(0) 672170815Sariff 673170815Sariff#define PCM_RELEASE_QUICK(x) do { \ 674170815Sariff if (mtx_owned((x)->lock) != 0) \ 675170815Sariff panic("%s(%d): [PCM RELEASE QUICK] Mutex owned!", \ 676170815Sariff __func__, __LINE__); \ 677170815Sariff pcm_lock(x); \ 678170815Sariff PCM_RELEASE(x); \ 679170815Sariff pcm_unlock(x); \ 680170815Sariff} while(0) 681170815Sariff 682170815Sariff#define PCM_BUSYASSERT(x) do { \ 683170815Sariff if (!((x) != NULL && ((x)->flags & SD_F_BUSY))) \ 684170815Sariff panic("%s(%d): [PCM BUSYASSERT] " \ 685170815Sariff "Failed, snddev_info=%p", __func__, __LINE__, x); \ 686170815Sariff} while(0) 687170815Sariff 688170815Sariff#define PCM_GIANT_ENTER(x) do { \ 689170815Sariff int _pcm_giant = 0; \ 690170815Sariff if (mtx_owned((x)->lock) != 0) \ 691170815Sariff panic("%s(%d): [GIANT ENTER] PCM lock owned!", \ 692170815Sariff __func__, __LINE__); \ 693170815Sariff if (mtx_owned(&Giant) != 0 && snd_verbose > 3) \ 694170815Sariff device_printf((x)->dev, \ 695170815Sariff "%s(%d): [GIANT ENTER] Giant owned!\n", \ 696170815Sariff __func__, __LINE__); \ 697170815Sariff if (!((x)->flags & SD_F_MPSAFE) && mtx_owned(&Giant) == 0) \ 698170815Sariff do { \ 699170815Sariff mtx_lock(&Giant); \ 700170815Sariff _pcm_giant = 1; \ 701170815Sariff } while(0) 702170815Sariff 703170815Sariff#define PCM_GIANT_EXIT(x) do { \ 704170815Sariff if (mtx_owned((x)->lock) != 0) \ 705170815Sariff panic("%s(%d): [GIANT EXIT] PCM lock owned!", \ 706170815Sariff __func__, __LINE__); \ 707170815Sariff if (!(_pcm_giant == 0 || _pcm_giant == 1)) \ 708170815Sariff panic("%s(%d): [GIANT EXIT] _pcm_giant screwed!", \ 709170815Sariff __func__, __LINE__); \ 710170815Sariff if ((x)->flags & SD_F_MPSAFE) { \ 711170815Sariff if (_pcm_giant == 1) \ 712170815Sariff panic("%s(%d): [GIANT EXIT] MPSAFE Giant?", \ 713170815Sariff __func__, __LINE__); \ 714170815Sariff if (mtx_owned(&Giant) != 0 && snd_verbose > 3) \ 715170815Sariff device_printf((x)->dev, \ 716170815Sariff "%s(%d): [GIANT EXIT] Giant owned!\n", \ 717170815Sariff __func__, __LINE__); \ 718170815Sariff } \ 719170815Sariff if (_pcm_giant != 0) { \ 720170815Sariff if (mtx_owned(&Giant) == 0) \ 721170815Sariff panic("%s(%d): [GIANT EXIT] Giant not owned!", \ 722170815Sariff __func__, __LINE__); \ 723170815Sariff _pcm_giant = 0; \ 724170815Sariff mtx_unlock(&Giant); \ 725170815Sariff } \ 726170815Sariff} while(0) 727170815Sariff#else /* SND_DIAGNOSTIC */ 728170815Sariff#define PCM_WAIT(x) do { \ 729170815Sariff mtx_assert((x)->lock, MA_OWNED); \ 730170815Sariff while ((x)->flags & SD_F_BUSY) \ 731170815Sariff cv_wait(&(x)->cv, (x)->lock); \ 732170815Sariff} while(0) 733170815Sariff 734170815Sariff#define PCM_ACQUIRE(x) do { \ 735170815Sariff mtx_assert((x)->lock, MA_OWNED); \ 736170815Sariff KASSERT(!((x)->flags & SD_F_BUSY), \ 737170815Sariff ("%s(%d): [PCM ACQUIRE] Trying to acquire BUSY cv!", \ 738170815Sariff __func__, __LINE__)); \ 739170815Sariff (x)->flags |= SD_F_BUSY; \ 740170815Sariff} while(0) 741170815Sariff 742170815Sariff#define PCM_RELEASE(x) do { \ 743170815Sariff mtx_assert((x)->lock, MA_OWNED); \ 744170815Sariff KASSERT((x)->flags & SD_F_BUSY, \ 745170815Sariff ("%s(%d): [PCM RELEASE] Releasing non-BUSY cv!", \ 746170815Sariff __func__, __LINE__)); \ 747170815Sariff (x)->flags &= ~SD_F_BUSY; \ 748170815Sariff if ((x)->cv.cv_waiters != 0) \ 749170815Sariff cv_broadcast(&(x)->cv); \ 750170815Sariff} while(0) 751170815Sariff 752170815Sariff/* Quick version, for shorter path. */ 753170815Sariff#define PCM_ACQUIRE_QUICK(x) do { \ 754170815Sariff mtx_assert((x)->lock, MA_NOTOWNED); \ 755170815Sariff pcm_lock(x); \ 756170815Sariff PCM_WAIT(x); \ 757170815Sariff PCM_ACQUIRE(x); \ 758170815Sariff pcm_unlock(x); \ 759170815Sariff} while(0) 760170815Sariff 761170815Sariff#define PCM_RELEASE_QUICK(x) do { \ 762170815Sariff mtx_assert((x)->lock, MA_NOTOWNED); \ 763170815Sariff pcm_lock(x); \ 764170815Sariff PCM_RELEASE(x); \ 765170815Sariff pcm_unlock(x); \ 766170815Sariff} while(0) 767170815Sariff 768170815Sariff#define PCM_BUSYASSERT(x) KASSERT(x != NULL && \ 769170815Sariff ((x)->flags & SD_F_BUSY), \ 770170815Sariff ("%s(%d): [PCM BUSYASSERT] " \ 771170815Sariff "Failed, snddev_info=%p", \ 772170815Sariff __func__, __LINE__, x)) 773170815Sariff 774170815Sariff#define PCM_GIANT_ENTER(x) do { \ 775170815Sariff int _pcm_giant = 0; \ 776170815Sariff mtx_assert((x)->lock, MA_NOTOWNED); \ 777170815Sariff if (!((x)->flags & SD_F_MPSAFE) && mtx_owned(&Giant) == 0) \ 778170815Sariff do { \ 779170815Sariff mtx_lock(&Giant); \ 780170815Sariff _pcm_giant = 1; \ 781170815Sariff } while(0) 782170815Sariff 783170815Sariff#define PCM_GIANT_EXIT(x) do { \ 784170815Sariff mtx_assert((x)->lock, MA_NOTOWNED); \ 785170815Sariff KASSERT(_pcm_giant == 0 || _pcm_giant == 1, \ 786170815Sariff ("%s(%d): [GIANT EXIT] _pcm_giant screwed!", \ 787170815Sariff __func__, __LINE__)); \ 788170815Sariff KASSERT(!((x)->flags & SD_F_MPSAFE) || \ 789170815Sariff (((x)->flags & SD_F_MPSAFE) && _pcm_giant == 0), \ 790170815Sariff ("%s(%d): [GIANT EXIT] MPSAFE Giant?", \ 791170815Sariff __func__, __LINE__)); \ 792170815Sariff if (_pcm_giant != 0) { \ 793170815Sariff mtx_assert(&Giant, MA_OWNED); \ 794170815Sariff _pcm_giant = 0; \ 795170815Sariff mtx_unlock(&Giant); \ 796170815Sariff } \ 797170815Sariff} while(0) 798170815Sariff#endif /* !SND_DIAGNOSTIC */ 799170815Sariff 800170815Sariff#define PCM_GIANT_LEAVE(x) \ 801170815Sariff PCM_GIANT_EXIT(x); \ 802170815Sariff} while(0) 803170815Sariff 804126695Smatk#ifdef KLD_MODULE 805126695Smatk#define PCM_KLDSTRING(a) ("kld " # a) 806126695Smatk#else 807126695Smatk#define PCM_KLDSTRING(a) "" 808126695Smatk#endif 809126695Smatk 81082180Scg#endif /* _KERNEL */ 81182180Scg 81282180Scg#endif /* _OS_H_ */ 813