xref: /OK3568_Linux_fs/kernel/sound/usb/mixer_us16x08.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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