1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __USB_MIXER_US16X08_H
3 #define __USB_MIXER_US16X08_H
5 #define SND_US16X08_MAX_CHANNELS 16
7 /* define some bias, cause some alsa-mixers wont work with
8 * negative ranges or if mixer-min != 0
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
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))
26 /* the URB request/type to control Tascam mixers */
27 #define SND_US16X08_URB_REQUEST 0x1D
28 #define SND_US16X08_URB_REQUESTTYPE 0x40
30 /* the URB params to retrieve meter ranges */
31 #define SND_US16X08_URB_METER_REQUEST 0x1e
32 #define SND_US16X08_URB_METER_REQUESTTYPE 0xc0
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])
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
54 #define SND_US16X08_ID_EQ_BAND_COUNT 4
55 #define SND_US16X08_ID_EQ_PARAM_COUNT 4
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
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
70 #define SND_US16X08_ID_EQLOWMIDWIDTH 0x22
71 #define SND_US16X08_ID_EQHIGHMIDWIDTH 0x23
73 #define SND_US16X08_ID_EQENABLE 0x30
75 #define EQ_STORE_BAND_IDX(x) ((x) & 0xf)
76 #define EQ_STORE_PARAM_IDX(x) (((x) & 0xf0) >> 4)
78 #define SND_US16X08_ID_ROUTE 0x00
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
90 #define COMP_STORE_IDX(x) ((x) - SND_US16X08_ID_COMP_BASE)
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
];
97 struct snd_us16x08_comp_store
{
98 u8 val
[SND_US16X08_ID_COMP_COUNT
][SND_US16X08_MAX_CHANNELS
];
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
;
110 struct snd_us16x08_control_params
{
111 const struct snd_kcontrol_new
*kcontrol_new
;
119 #define snd_us16x08_switch_info snd_ctl_boolean_mono_info
121 int snd_us16x08_controls_create(struct usb_mixer_interface
*mixer
);
122 #endif /* __USB_MIXER_US16X08_H */