Greg Kroah-Hartman | b244131 | 2017-11-01 15:07:57 +0100 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
Detlef Urban | d2bb390a | 2017-02-20 09:47:59 +0100 | [diff] [blame] | 2 | #ifndef __USB_MIXER_US16X08_H |
| 3 | #define __USB_MIXER_US16X08_H |
| 4 | |
| 5 | #define SND_US16X08_MAX_CHANNELS 16 |
| 6 | |
| 7 | /* define some bias, cause some alsa-mixers wont work with |
| 8 | * negative ranges or if mixer-min != 0 |
| 9 | */ |
| 10 | #define SND_US16X08_NO_BIAS 0 |
| 11 | #define SND_US16X08_FADER_BIAS 127 |
| 12 | #define SND_US16X08_EQ_HIGHFREQ_BIAS 0x20 |
| 13 | #define SND_US16X08_COMP_THRESHOLD_BIAS 0x20 |
| 14 | #define SND_US16X08_COMP_ATTACK_BIAS 2 |
| 15 | #define SND_US16X08_COMP_RELEASE_BIAS 1 |
| 16 | |
| 17 | /* get macro for components of kcontrol private_value */ |
| 18 | #define SND_US16X08_KCBIAS(x) (((x)->private_value >> 24) & 0xff) |
| 19 | #define SND_US16X08_KCSTEP(x) (((x)->private_value >> 16) & 0xff) |
| 20 | #define SND_US16X08_KCMIN(x) (((x)->private_value >> 8) & 0xff) |
| 21 | #define SND_US16X08_KCMAX(x) (((x)->private_value >> 0) & 0xff) |
| 22 | /* set macro for kcontrol private_value */ |
| 23 | #define SND_US16X08_KCSET(bias, step, min, max) \ |
| 24 | (((bias) << 24) | ((step) << 16) | ((min) << 8) | (max)) |
| 25 | |
| 26 | /* the URB request/type to control Tascam mixers */ |
| 27 | #define SND_US16X08_URB_REQUEST 0x1D |
| 28 | #define SND_US16X08_URB_REQUESTTYPE 0x40 |
| 29 | |
| 30 | /* the URB params to retrieve meter ranges */ |
| 31 | #define SND_US16X08_URB_METER_REQUEST 0x1e |
| 32 | #define SND_US16X08_URB_METER_REQUESTTYPE 0xc0 |
| 33 | |
| 34 | #define MUA0(x, y) ((x)[(y) * 10 + 4]) |
| 35 | #define MUA1(x, y) ((x)[(y) * 10 + 5]) |
| 36 | #define MUA2(x, y) ((x)[(y) * 10 + 6]) |
| 37 | #define MUB0(x, y) ((x)[(y) * 10 + 7]) |
| 38 | #define MUB1(x, y) ((x)[(y) * 10 + 8]) |
| 39 | #define MUB2(x, y) ((x)[(y) * 10 + 9]) |
| 40 | #define MUC0(x, y) ((x)[(y) * 10 + 10]) |
| 41 | #define MUC1(x, y) ((x)[(y) * 10 + 11]) |
| 42 | #define MUC2(x, y) ((x)[(y) * 10 + 12]) |
| 43 | #define MUC3(x, y) ((x)[(y) * 10 + 13]) |
| 44 | |
| 45 | /* Common Channel control IDs */ |
| 46 | #define SND_US16X08_ID_BYPASS 0x45 |
| 47 | #define SND_US16X08_ID_BUSS_OUT 0x44 |
| 48 | #define SND_US16X08_ID_PHASE 0x85 |
| 49 | #define SND_US16X08_ID_MUTE 0x83 |
| 50 | #define SND_US16X08_ID_FADER 0x81 |
| 51 | #define SND_US16X08_ID_PAN 0x82 |
| 52 | #define SND_US16X08_ID_METER 0xB1 |
| 53 | |
| 54 | #define SND_US16X08_ID_EQ_BAND_COUNT 4 |
| 55 | #define SND_US16X08_ID_EQ_PARAM_COUNT 4 |
| 56 | |
| 57 | /* EQ level IDs */ |
| 58 | #define SND_US16X08_ID_EQLOWLEVEL 0x01 |
| 59 | #define SND_US16X08_ID_EQLOWMIDLEVEL 0x02 |
| 60 | #define SND_US16X08_ID_EQHIGHMIDLEVEL 0x03 |
| 61 | #define SND_US16X08_ID_EQHIGHLEVEL 0x04 |
| 62 | |
| 63 | /* EQ frequence IDs */ |
| 64 | #define SND_US16X08_ID_EQLOWFREQ 0x11 |
| 65 | #define SND_US16X08_ID_EQLOWMIDFREQ 0x12 |
| 66 | #define SND_US16X08_ID_EQHIGHMIDFREQ 0x13 |
| 67 | #define SND_US16X08_ID_EQHIGHFREQ 0x14 |
| 68 | |
| 69 | /* EQ width IDs */ |
| 70 | #define SND_US16X08_ID_EQLOWMIDWIDTH 0x22 |
| 71 | #define SND_US16X08_ID_EQHIGHMIDWIDTH 0x23 |
| 72 | |
| 73 | #define SND_US16X08_ID_EQENABLE 0x30 |
| 74 | |
| 75 | #define EQ_STORE_BAND_IDX(x) ((x) & 0xf) |
| 76 | #define EQ_STORE_PARAM_IDX(x) (((x) & 0xf0) >> 4) |
| 77 | |
| 78 | #define SND_US16X08_ID_ROUTE 0x00 |
| 79 | |
| 80 | /* Compressor Ids */ |
| 81 | #define SND_US16X08_ID_COMP_BASE 0x32 |
| 82 | #define SND_US16X08_ID_COMP_THRESHOLD SND_US16X08_ID_COMP_BASE |
| 83 | #define SND_US16X08_ID_COMP_RATIO (SND_US16X08_ID_COMP_BASE + 1) |
| 84 | #define SND_US16X08_ID_COMP_ATTACK (SND_US16X08_ID_COMP_BASE + 2) |
| 85 | #define SND_US16X08_ID_COMP_RELEASE (SND_US16X08_ID_COMP_BASE + 3) |
| 86 | #define SND_US16X08_ID_COMP_GAIN (SND_US16X08_ID_COMP_BASE + 4) |
| 87 | #define SND_US16X08_ID_COMP_SWITCH (SND_US16X08_ID_COMP_BASE + 5) |
| 88 | #define SND_US16X08_ID_COMP_COUNT 6 |
| 89 | |
| 90 | #define COMP_STORE_IDX(x) ((x) - SND_US16X08_ID_COMP_BASE) |
| 91 | |
| 92 | struct snd_us16x08_eq_store { |
| 93 | u8 val[SND_US16X08_ID_EQ_BAND_COUNT][SND_US16X08_ID_EQ_PARAM_COUNT] |
| 94 | [SND_US16X08_MAX_CHANNELS]; |
| 95 | }; |
| 96 | |
| 97 | struct snd_us16x08_comp_store { |
| 98 | u8 val[SND_US16X08_ID_COMP_COUNT][SND_US16X08_MAX_CHANNELS]; |
| 99 | }; |
| 100 | |
| 101 | struct snd_us16x08_meter_store { |
| 102 | int meter_level[SND_US16X08_MAX_CHANNELS]; |
| 103 | int master_level[2]; /* level of meter for master output */ |
| 104 | int comp_index; /* round trip channel selector */ |
| 105 | int comp_active_index; /* channel select from user space mixer */ |
| 106 | int comp_level[16]; /* compressor reduction level */ |
| 107 | struct snd_us16x08_comp_store *comp_store; |
| 108 | }; |
| 109 | |
| 110 | struct snd_us16x08_control_params { |
Takashi Iwai | 195727e | 2020-01-03 09:16:57 +0100 | [diff] [blame] | 111 | const struct snd_kcontrol_new *kcontrol_new; |
Detlef Urban | d2bb390a | 2017-02-20 09:47:59 +0100 | [diff] [blame] | 112 | int control_id; |
| 113 | int type; |
| 114 | int num_channels; |
| 115 | const char *name; |
Detlef Urban | d2bb390a | 2017-02-20 09:47:59 +0100 | [diff] [blame] | 116 | int default_val; |
| 117 | }; |
| 118 | |
| 119 | #define snd_us16x08_switch_info snd_ctl_boolean_mono_info |
| 120 | |
| 121 | int snd_us16x08_controls_create(struct usb_mixer_interface *mixer); |
| 122 | #endif /* __USB_MIXER_US16X08_H */ |