Blame view

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