1 /* $OpenBSD: dsp.h,v 1.5 2016/06/08 04:36:48 ratchov Exp $ */ 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 #if defined(__i386__) && defined(__GNUC__) 44 45 static inline int 46 fp24_mul(int x, int a) 47 { 48 int res; 49 50 asm volatile ( 51 "imull %2\n\t" 52 "shrdl $23, %%edx, %%eax\n\t" 53 : "=a" (res) 54 : "a" (x), "r" (a) 55 : "%edx" 56 ); 57 return res; 58 } 59 60 static inline int 61 fp24_muldiv(int x, int a, int b) 62 { 63 int res; 64 65 asm volatile ( 66 "imull %2\n\t" 67 "idivl %3\n\t" 68 : "=a" (res) 69 : "a" (x), "d" (a), "r" (b) 70 ); 71 return res; 72 } 73 74 #define ADATA_MUL(x,y) fp24_mul(x, y) 75 #define ADATA_MULDIV(x,y,z) fp24_muldiv(x, y, z); 76 77 #elif defined(__amd64__) || defined(__sparc64__) 78 79 #define ADATA_MUL(x,y) \ 80 ((int)(((long long)(x) * (long long)(y)) >> (ADATA_BITS - 1))) 81 #define ADATA_MULDIV(x,y,z) \ 82 ((int)((long long)(x) * (long long)(y) / (long long)(z))) 83 84 #else 85 #error "no 24-bit code for this architecture" 86 #endif 87 88 typedef int adata_t; 89 90 #else 91 #error "only 16-bit and 24-bit precisions are supported" 92 #endif 93 94 /* 95 * Maximum size of the encording string (the longest possible 96 * encoding is ``s24le3msb''). 97 */ 98 #define ENCMAX 10 99 100 /* 101 * Default bytes per sample for the given bits per sample. 102 */ 103 #define APARAMS_BPS(bits) (((bits) <= 8) ? 1 : (((bits) <= 16) ? 2 : 4)) 104 105 struct aparams { 106 unsigned int bps; /* bytes per sample */ 107 unsigned int bits; /* actually used bits */ 108 unsigned int le; /* 1 if little endian, 0 if big endian */ 109 unsigned int sig; /* 1 if signed, 0 if unsigned */ 110 unsigned int msb; /* 1 if msb justified, 0 if lsb justified */ 111 }; 112 113 struct resamp { 114 #define RESAMP_NCTX 2 115 unsigned int ctx_start; 116 adata_t ctx[NCHAN_MAX * RESAMP_NCTX]; 117 unsigned int iblksz, oblksz; 118 int diff; 119 int nch; 120 }; 121 122 struct conv { 123 int bfirst; /* bytes to skip at startup */ 124 unsigned int bps; /* bytes per sample */ 125 unsigned int shift; /* shift to get 32bit MSB */ 126 unsigned int bias; /* bias of unsigned samples */ 127 int bnext; /* to reach the next byte */ 128 int snext; /* to reach the next sample */ 129 int nch; 130 }; 131 132 struct cmap { 133 int istart; 134 int inext; 135 int onext; 136 int ostart; 137 int nch; 138 }; 139 140 #define MIDI_TO_ADATA(m) (aparams_ctltovol[m] << (ADATA_BITS - 16)) 141 extern int aparams_ctltovol[128]; 142 143 void aparams_init(struct aparams *); 144 void aparams_log(struct aparams *); 145 int aparams_strtoenc(struct aparams *, char *); 146 int aparams_enctostr(struct aparams *, char *); 147 int aparams_native(struct aparams *); 148 149 void resamp_getcnt(struct resamp *, int *, int *); 150 void resamp_do(struct resamp *, adata_t *, adata_t *, int, int); 151 void resamp_init(struct resamp *, unsigned int, unsigned int, int); 152 void enc_do(struct conv *, unsigned char *, unsigned char *, int); 153 void enc_sil_do(struct conv *, unsigned char *, int); 154 void enc_init(struct conv *, struct aparams *, int); 155 void dec_do(struct conv *, unsigned char *, unsigned char *, int); 156 void dec_do_float(struct conv *, unsigned char *, unsigned char *, int); 157 void dec_do_ulaw(struct conv *, unsigned char *, unsigned char *, int, int); 158 void dec_init(struct conv *, struct aparams *, int); 159 void cmap_add(struct cmap *, void *, void *, int, int); 160 void cmap_copy(struct cmap *, void *, void *, int, int); 161 void cmap_init(struct cmap *, int, int, int, int, int, int, int, int); 162 163 #endif /* !defined(DSP_H) */ 164