linux/sound/usb/mixer_us16x08.h
<<
>>
Prefs
   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
  92struct 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
  97struct snd_us16x08_comp_store {
  98        u8 val[SND_US16X08_ID_COMP_COUNT][SND_US16X08_MAX_CHANNELS];
  99};
 100
 101struct 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
 110struct snd_us16x08_control_params {
 111        const 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
 121int snd_us16x08_controls_create(struct usb_mixer_interface *mixer);
 122#endif /* __USB_MIXER_US16X08_H */
 123