| xj | b04a402 | 2021-11-25 15:01:52 +0800 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | 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 { | 
|  | 111 | struct snd_kcontrol_new *kcontrol_new; | 
|  | 112 | int control_id; | 
|  | 113 | int type; | 
|  | 114 | int num_channels; | 
|  | 115 | const char *name; | 
|  | 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 */ |