1 /* $OpenBSD$ */ 2 /* 3 * Copyright (c) 2012 Alexandre Ratchov <alex@caoua.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 #ifndef DSP_H 18 #define DSP_H 19 20 #include <sys/types.h> 21 #include "defs.h" 22 23 /* 24 * Samples are numbers in the interval [-1, 1[, note that 1, the upper 25 * boundary is excluded. We represent them as signed fixed point numbers 26 * of ADATA_BITS. We also assume that 2^(ADATA_BITS - 1) fits in a int. 27 */ 28 #ifndef ADATA_BITS 29 #define ADATA_BITS 16 30 #endif 31 #define ADATA_LE (BYTE_ORDER == LITTLE_ENDIAN) 32 #define ADATA_UNIT (1 << (ADATA_BITS - 1)) 33 34 #if ADATA_BITS == 16 35 36 #define ADATA_MUL(x,y) (((int)(x) * (int)(y)) >> (ADATA_BITS - 1)) 37 #define ADATA_MULDIV(x,y,z) ((int)(x) * (int)(y) / (int)(z)) 38 39 typedef short adata_t; 40 41 #elif ADATA_BITS == 24 42 43 #define ADATA_MUL(x,y) \ 44 ((int)(((long long)(x) * (long long)(y)) >> (ADATA_BITS - 1))) 45 #define ADATA_MULDIV(x,y,z) \ 46 ((int)((long long)(x) * (long long)(y) / (long long)(z))) 47 48 typedef int adata_t; 49 50 #else 51 #error "only 16-bit and 24-bit precisions are supported" 52 #endif 53 54 /* 55 * The FIR is sampled and stored in a table of fixed-point numbers 56 * with 23 fractional bits. For convenience, we use the same fixed-point 57 * numbers to represent time and to walk through the table. 58 */ 59 #define RESAMP_BITS 23 60 #define RESAMP_UNIT (1 << RESAMP_BITS) 61 62 /* 63 * Filter window length (the time unit is RESAMP_UNIT) 64 */ 65 #define RESAMP_LENGTH (8 * RESAMP_UNIT) 66 67 /* 68 * Time between samples of the FIR (the time unit is RESAMP_UNIT) 69 */ 70 #define RESAMP_STEP_BITS (RESAMP_BITS - 6) 71 #define RESAMP_STEP (1 << RESAMP_STEP_BITS) 72 73 /* 74 * Maximum downsample/upsample ratio we support, must be a power of two. 75 * The ratio between the max and the min sample rates is 192kHz / 4kHz = 48, 76 * so we can use 64 77 */ 78 #define RESAMP_RATIO 64 79 80 /* 81 * Maximum size of the encording string (the longest possible 82 * encoding is ``s24le3msb''). 83 */ 84 #define ENCMAX 10 85 86 /* 87 * Default bytes per sample for the given bits per sample. 88 */ 89 #define APARAMS_BPS(bits) (((bits) <= 8) ? 1 : (((bits) <= 16) ? 2 : 4)) 90 91 struct aparams { 92 unsigned int bps; /* bytes per sample */ 93 unsigned int bits; /* actually used bits */ 94 unsigned int le; /* 1 if little endian, else be */ 95 unsigned int sig; /* 1 if signed, 0 if unsigned */ 96 unsigned int msb; /* 1 if msb justified, else lsb */ 97 }; 98 99 struct resamp { 100 #define RESAMP_NCTX (RESAMP_LENGTH / RESAMP_UNIT * RESAMP_RATIO) 101 unsigned int ctx_start; 102 adata_t ctx[NCHAN_MAX * RESAMP_NCTX]; 103 int filt_cutoff, filt_step; 104 unsigned int iblksz, oblksz; 105 int nch; 106 }; 107 108 struct conv { 109 int bfirst; /* bytes to skip at startup */ 110 unsigned int bps; /* bytes per sample */ 111 unsigned int shift; /* shift to get 32bit MSB */ 112 unsigned int bias; /* bias of unsigned samples */ 113 int bnext; /* to reach the next byte */ 114 int snext; /* to reach the next sample */ 115 int nch; 116 }; 117 118 struct cmap { 119 int istart; 120 int inext; 121 int onext; 122 int ostart; 123 int nch; 124 }; 125 126 #define MIDI_TO_ADATA(m) (aparams_ctltovol[m] << (ADATA_BITS - 16)) 127 extern const int aparams_ctltovol[128]; 128 129 void aparams_init(struct aparams *); 130 void aparams_log(struct aparams *); 131 int aparams_strtoenc(struct aparams *, char *); 132 int aparams_enctostr(struct aparams *, char *); 133 int aparams_native(struct aparams *); 134 135 void resamp_do(struct resamp *, adata_t *, adata_t *, int); 136 void resamp_init(struct resamp *, unsigned int, unsigned int, int); 137 void enc_do(struct conv *, unsigned char *, unsigned char *, int); 138 void enc_sil_do(struct conv *, unsigned char *, int); 139 void enc_init(struct conv *, struct aparams *, int); 140 void dec_do(struct conv *, unsigned char *, unsigned char *, int); 141 void dec_init(struct conv *, struct aparams *, int); 142 void cmap_add(struct cmap *, void *, void *, int, int); 143 void cmap_copy(struct cmap *, void *, void *, int, int); 144 void cmap_init(struct cmap *, int, int, int, int, int, int, int, int); 145 146 #endif /* !defined(DSP_H) */ 147