Annotation of src/usr.bin/aucat/aparams.h, Revision 1.11
1.11 ! ratchov 1: /* $OpenBSD: aparams.h,v 1.10 2010/11/05 15:23:18 ratchov Exp $ */
1.1 ratchov 2: /*
3: * Copyright (c) 2008 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 APARAMS_H
18: #define APARAMS_H
19:
20: #include <sys/param.h>
21:
1.2 ratchov 22: #define NCHAN_MAX 16 /* max channel in a stream */
23: #define RATE_MIN 4000 /* min sample rate */
24: #define RATE_MAX 192000 /* max sample rate */
25: #define BITS_MIN 1 /* min bits per sample */
1.1 ratchov 26: #define BITS_MAX 32 /* max bits per sample */
27:
1.2 ratchov 28: /*
1.6 ratchov 29: * Maximum size of the encording string (the longest possible
30: * encoding is ``s24le3msb'').
1.2 ratchov 31: */
32: #define ENCMAX 10
33:
1.1 ratchov 34: /*
1.6 ratchov 35: * Default bytes per sample for the given bits per sample.
1.2 ratchov 36: */
37: #define APARAMS_BPS(bits) (((bits) <= 8) ? 1 : (((bits) <= 16) ? 2 : 4))
38:
39: /*
1.6 ratchov 40: * Encoding specification.
1.1 ratchov 41: */
42: struct aparams {
43: unsigned bps; /* bytes per sample */
44: unsigned bits; /* actually used bits */
45: unsigned le; /* 1 if little endian, 0 if big endian */
46: unsigned sig; /* 1 if signed, 0 if unsigned */
47: unsigned msb; /* 1 if msb justified, 0 if lsb justified */
48: unsigned cmin, cmax; /* provided/consumed channels */
49: unsigned rate; /* frames per second */
50: };
51:
52: /*
53: * Samples are numbers in the interval [-1, 1[, note that 1, the upper
1.10 ratchov 54: * boundary is excluded. We represent them as signed fixed point numbers
55: * of ADATA_BITS. We also assume that 2^(ADATA_BITS - 1) fits in a int.
1.1 ratchov 56: */
1.11 ! ratchov 57: #ifndef ADATA_BITS
1.10 ratchov 58: #define ADATA_BITS 16
1.11 ! ratchov 59: #endif
1.10 ratchov 60: #define ADATA_LE (BYTE_ORDER == LITTLE_ENDIAN)
61: #define ADATA_UNIT (1 << (ADATA_BITS - 1))
62:
1.11 ! ratchov 63: #if ADATA_BITS == 16
! 64:
1.9 ratchov 65: typedef short adata_t;
1.10 ratchov 66:
1.9 ratchov 67: #define ADATA_MUL(x,y) (((int)(x) * (int)(y)) >> (ADATA_BITS - 1))
68: #define ADATA_MULDIV(x,y,z) ((int)(x) * (int)(y) / (int)(z))
1.11 ! ratchov 69:
! 70: #elif ADATA_BITS == 24
! 71:
! 72: typedef int adata_t;
! 73:
! 74: #if defined(__i386__) && defined(__GNUC__)
! 75:
! 76: static inline int
! 77: fp24_mul(int x, int a)
! 78: {
! 79: int res;
! 80:
! 81: asm volatile (
! 82: "imull %2\n\t"
! 83: "shrdl $23, %%edx, %%eax\n\t"
! 84: : "=a" (res)
! 85: : "a" (x), "r" (a)
! 86: : "%edx"
! 87: );
! 88: return res;
! 89: }
! 90:
! 91: static inline int
! 92: fp24_muldiv(int x, int a, int b)
! 93: {
! 94: int res;
! 95:
! 96: asm volatile (
! 97: "imull %2\n\t"
! 98: "idivl %3\n\t"
! 99: : "=a" (res)
! 100: : "a" (x), "d" (a), "r" (b)
! 101: );
! 102: return res;
! 103: }
! 104:
! 105: #define ADATA_MUL(x,y) fp24_mul(x, y)
! 106: #define ADATA_MULDIV(x,y,z) fp24_muldiv(x, y, z);
! 107:
! 108: #elif defined(__amd64__) || defined(__sparc64__)
! 109:
! 110: #define ADATA_MUL(x,y) \
! 111: ((int)(((long long)(x) * (long long)(y)) >> (ADATA_BITS - 1)))
! 112: #define ADATA_MULDIV(x,y,z) \
! 113: ((int)((long long)(x) * (long long)(y) / (long long)(z)))
! 114:
! 115: #else
! 116: #error "no 24-bit code for this architecture"
! 117: #endif
! 118:
! 119: #else
! 120: #error "only 16-bit and 24-bit precisions are supported"
! 121: #endif
1.4 ratchov 122:
123: #define MIDI_MAXCTL 127
1.9 ratchov 124: #define MIDI_TO_ADATA(m) (aparams_ctltovol[m] << (ADATA_BITS - 16))
1.4 ratchov 125:
126: extern int aparams_ctltovol[128];
1.7 ratchov 127: extern struct aparams aparams_none;
1.1 ratchov 128:
129: void aparams_init(struct aparams *, unsigned, unsigned, unsigned);
1.8 ratchov 130: void aparams_dbg(struct aparams *);
1.3 ratchov 131: int aparams_eqrate(struct aparams *, struct aparams *);
132: int aparams_eqenc(struct aparams *, struct aparams *);
1.1 ratchov 133: int aparams_eq(struct aparams *, struct aparams *);
1.3 ratchov 134: int aparams_subset(struct aparams *, struct aparams *);
1.5 ratchov 135: void aparams_grow(struct aparams *, struct aparams *);
1.1 ratchov 136: unsigned aparams_bpf(struct aparams *);
1.2 ratchov 137: int aparams_strtoenc(struct aparams *, char *);
138: int aparams_enctostr(struct aparams *, char *);
139: void aparams_copyenc(struct aparams *, struct aparams *);
1.1 ratchov 140:
141: #endif /* !defined(APARAMS_H) */