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$ 27 */ 28 29 struct pcm_feederdesc { 30 u_int32_t type; 31 u_int32_t in, out; 32 u_int32_t flags; 33 int idx; 34 }; 35 36 struct feeder_class { 37 KOBJ_CLASS_FIELDS; 38 int align; 39 struct pcm_feederdesc *desc; 40 void *data; 41 }; 42 43 struct pcm_feeder { 44 KOBJ_FIELDS; 45 int align; 46 struct pcm_feederdesc *desc, desc_static; 47 void *data; 48 struct feeder_class *class; 49 struct pcm_feeder *source, *parent; 50 51 }; 52 53 void feeder_register(void *p); 54 struct feeder_class *feeder_getclass(struct pcm_feederdesc *desc); 55 56 u_int32_t chn_fmtscore(u_int32_t fmt); 57 u_int32_t chn_fmtbestbit(u_int32_t fmt, u_int32_t *fmts); 58 u_int32_t chn_fmtbeststereo(u_int32_t fmt, u_int32_t *fmts); 59 u_int32_t chn_fmtbest(u_int32_t fmt, u_int32_t *fmts); 60 u_int32_t chn_fmtchain(struct pcm_channel *c, u_int32_t *to); 61 int chn_addfeeder(struct pcm_channel *c, struct feeder_class *fc, struct pcm_feederdesc *desc); 62 int chn_removefeeder(struct pcm_channel *c); 63 struct pcm_feeder *chn_findfeeder(struct pcm_channel *c, u_int32_t type); 64 void feeder_printchain(struct pcm_feeder *head); 65 66 #define FEEDER_DECLARE(feeder, palign, pdata) \ 67 static struct feeder_class feeder ## _class = { \ 68 .name = #feeder, \ 69 .methods = feeder ## _methods, \ 70 .size = sizeof(struct pcm_feeder), \ 71 .align = palign, \ 72 .desc = feeder ## _desc, \ 73 .data = pdata, \ 74 }; \ 75 SYSINIT(feeder, SI_SUB_DRIVERS, SI_ORDER_ANY, feeder_register, &feeder ## _class); 76 77 #define FEEDER_ROOT 0 78 #define FEEDER_FMT 1 79 #define FEEDER_MIXER 2 80 #define FEEDER_RATE 3 81 #define FEEDER_FILTER 4 82 #define FEEDER_VOLUME 5 83 #define FEEDER_SWAPLR 6 84 #define FEEDER_LAST 32 85 86 #define FEEDRATE_SRC 1 87 #define FEEDRATE_DST 2 88 89 #define FEEDRATE_RATEMIN 1 90 #define FEEDRATE_RATEMAX 2016000 /* 48000 * 42 */ 91 92 #define FEEDRATE_MIN 1 93 #define FEEDRATE_MAX 0x7fffff /* sign 24bit ~ 8ghz ! */ 94 95 #define FEEDRATE_ROUNDHZ 25 96 #define FEEDRATE_ROUNDHZ_MIN 0 97 #define FEEDRATE_ROUNDHZ_MAX 500 98 99 /* 100 * Default buffer size for feeder processing. 101 * 102 * Big = less sndbuf_feed(), more memory usage. 103 * Small = aggresive sndbuf_feed() (perhaps too much), less memory usage. 104 */ 105 #define FEEDBUFSZ 16384 106 #define FEEDBUFSZ_MIN 2048 107 #define FEEDBUFSZ_MAX 131072 108 109 extern int feeder_rate_min; 110 extern int feeder_rate_max; 111 extern int feeder_rate_round; 112 extern int feeder_buffersize; 113