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