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