Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: usb-audio: Add Pioneer DJ/AlphaTheta DJM-A9 Mixer

This also includes a change to the capture level as they differ with
this device, as well as additional values for prefader channels.

Acked-by: Olivia Mackintosh <livvy@base.nu>
Signed-off-by: Sarah Grant <s@srd.tw>
Link: https://patch.msgid.link/20241025163927.12662-1-s@srd.tw
Signed-off-by: Takashi Iwai <tiwai@suse.de>

authored by

Sarah Grant and committed by
Takashi Iwai
5289d006 71535013

+121 -4
+64 -4
sound/usb/mixer_quirks.c
··· 3498 3498 } 3499 3499 3500 3500 /* 3501 - * Pioneer DJ DJM Mixers 3501 + * Pioneer DJ / AlphaTheta DJM Mixers 3502 3502 * 3503 3503 * These devices generally have options for soft-switching the playback and 3504 3504 * capture sources in addition to the recording level. Although different ··· 3515 3515 #define SND_DJM_CAP_CDLINE 0x01 3516 3516 #define SND_DJM_CAP_DIGITAL 0x02 3517 3517 #define SND_DJM_CAP_PHONO 0x03 3518 + #define SND_DJM_CAP_PREFADER 0x05 3518 3519 #define SND_DJM_CAP_PFADER 0x06 3519 3520 #define SND_DJM_CAP_XFADERA 0x07 3520 3521 #define SND_DJM_CAP_XFADERB 0x08 3521 3522 #define SND_DJM_CAP_MIC 0x09 3522 3523 #define SND_DJM_CAP_AUX 0x0d 3523 3524 #define SND_DJM_CAP_RECOUT 0x0a 3525 + #define SND_DJM_CAP_RECOUT_NOMIC 0x0e 3524 3526 #define SND_DJM_CAP_NONE 0x0f 3525 3527 #define SND_DJM_CAP_CH1PFADER 0x11 3526 3528 #define SND_DJM_CAP_CH2PFADER 0x12 3527 3529 #define SND_DJM_CAP_CH3PFADER 0x13 3528 3530 #define SND_DJM_CAP_CH4PFADER 0x14 3531 + #define SND_DJM_CAP_CH1PREFADER 0x31 3532 + #define SND_DJM_CAP_CH2PREFADER 0x32 3533 + #define SND_DJM_CAP_CH3PREFADER 0x33 3534 + #define SND_DJM_CAP_CH4PREFADER 0x34 3529 3535 3530 3536 // Playback types 3531 3537 #define SND_DJM_PB_CH1 0x00 ··· 3557 3551 #define SND_DJM_900NXS2_IDX 0x3 3558 3552 #define SND_DJM_750MK2_IDX 0x4 3559 3553 #define SND_DJM_450_IDX 0x5 3554 + #define SND_DJM_A9_IDX 0x6 3560 3555 3561 3556 3562 3557 #define SND_DJM_CTL(_name, suffix, _default_value, _windex) { \ ··· 3586 3579 u16 wIndex; 3587 3580 }; 3588 3581 3589 - static const char *snd_djm_get_label_caplevel(u16 wvalue) 3582 + static const char *snd_djm_get_label_caplevel_common(u16 wvalue) 3590 3583 { 3591 3584 switch (wvalue) { 3592 3585 case 0x0000: return "-19dB"; 3593 3586 case 0x0100: return "-15dB"; 3594 3587 case 0x0200: return "-10dB"; 3595 3588 case 0x0300: return "-5dB"; 3589 + default: return NULL; 3590 + } 3591 + }; 3592 + 3593 + // The DJM-A9 has different capture levels than other, older models 3594 + static const char *snd_djm_get_label_caplevel_a9(u16 wvalue) 3595 + { 3596 + switch (wvalue) { 3597 + case 0x0000: return "+15dB"; 3598 + case 0x0100: return "+12dB"; 3599 + case 0x0200: return "+9dB"; 3600 + case 0x0300: return "+6dB"; 3601 + case 0x0400: return "+3dB"; 3602 + case 0x0500: return "0dB"; 3596 3603 default: return NULL; 3597 3604 } 3598 3605 }; ··· 3623 3602 case SND_DJM_CAP_XFADERB: return "Cross Fader B"; 3624 3603 case SND_DJM_CAP_MIC: return "Mic"; 3625 3604 case SND_DJM_CAP_RECOUT: return "Rec Out"; 3605 + case SND_DJM_CAP_RECOUT_NOMIC: return "Rec Out without Mic"; 3626 3606 case SND_DJM_CAP_AUX: return "Aux"; 3627 3607 case SND_DJM_CAP_NONE: return "None"; 3608 + case SND_DJM_CAP_CH1PREFADER: return "Pre Fader Ch1"; 3609 + case SND_DJM_CAP_CH2PREFADER: return "Pre Fader Ch2"; 3610 + case SND_DJM_CAP_CH3PREFADER: return "Pre Fader Ch3"; 3611 + case SND_DJM_CAP_CH4PREFADER: return "Pre Fader Ch4"; 3628 3612 case SND_DJM_CAP_CH1PFADER: return "Post Fader Ch1"; 3629 3613 case SND_DJM_CAP_CH2PFADER: return "Post Fader Ch2"; 3630 3614 case SND_DJM_CAP_CH3PFADER: return "Post Fader Ch3"; ··· 3646 3620 case 0x00: return "Control Tone CD/LINE"; 3647 3621 case 0x01: return "Control Tone LINE"; 3648 3622 default: return snd_djm_get_label_cap_common(wvalue); 3623 + } 3624 + }; 3625 + 3626 + static const char *snd_djm_get_label_caplevel(u8 device_idx, u16 wvalue) 3627 + { 3628 + switch (device_idx) { 3629 + case SND_DJM_A9_IDX: return snd_djm_get_label_caplevel_a9(wvalue); 3630 + default: return snd_djm_get_label_caplevel_common(wvalue); 3649 3631 } 3650 3632 }; 3651 3633 ··· 3678 3644 static const char *snd_djm_get_label(u8 device_idx, u16 wvalue, u16 windex) 3679 3645 { 3680 3646 switch (windex) { 3681 - case SND_DJM_WINDEX_CAPLVL: return snd_djm_get_label_caplevel(wvalue); 3647 + case SND_DJM_WINDEX_CAPLVL: return snd_djm_get_label_caplevel(device_idx, wvalue); 3682 3648 case SND_DJM_WINDEX_CAP: return snd_djm_get_label_cap(device_idx, wvalue); 3683 3649 case SND_DJM_WINDEX_PB: return snd_djm_get_label_pb(wvalue); 3684 3650 default: return NULL; ··· 3687 3653 3688 3654 // common DJM capture level option values 3689 3655 static const u16 snd_djm_opts_cap_level[] = { 3690 - 0x0000, 0x0100, 0x0200, 0x0300 }; 3656 + 0x0000, 0x0100, 0x0200, 0x0300, 0x400, 0x500 }; 3691 3657 3692 3658 3693 3659 // DJM-250MK2 ··· 3829 3795 }; 3830 3796 3831 3797 3798 + // DJM-A9 3799 + static const u16 snd_djm_opts_a9_cap1[] = { 3800 + 0x0107, 0x0108, 0x0109, 0x010a, 0x010e, 3801 + 0x111, 0x112, 0x113, 0x114, 0x0131, 0x132, 0x133, 0x134 }; 3802 + static const u16 snd_djm_opts_a9_cap2[] = { 3803 + 0x0201, 0x0202, 0x0203, 0x0205, 0x0206, 0x0207, 0x0208, 0x0209, 0x020a, 0x020e }; 3804 + static const u16 snd_djm_opts_a9_cap3[] = { 3805 + 0x0301, 0x0302, 0x0303, 0x0305, 0x0306, 0x0307, 0x0308, 0x0309, 0x030a, 0x030e }; 3806 + static const u16 snd_djm_opts_a9_cap4[] = { 3807 + 0x0401, 0x0402, 0x0403, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040e }; 3808 + static const u16 snd_djm_opts_a9_cap5[] = { 3809 + 0x0501, 0x0502, 0x0503, 0x0505, 0x0506, 0x0507, 0x0508, 0x0509, 0x050a, 0x050e }; 3810 + 3811 + static const struct snd_djm_ctl snd_djm_ctls_a9[] = { 3812 + SND_DJM_CTL("Capture Level", cap_level, 0, SND_DJM_WINDEX_CAPLVL), 3813 + SND_DJM_CTL("Master Input", a9_cap1, 3, SND_DJM_WINDEX_CAP), 3814 + SND_DJM_CTL("Ch1 Input", a9_cap2, 2, SND_DJM_WINDEX_CAP), 3815 + SND_DJM_CTL("Ch2 Input", a9_cap3, 2, SND_DJM_WINDEX_CAP), 3816 + SND_DJM_CTL("Ch3 Input", a9_cap4, 2, SND_DJM_WINDEX_CAP), 3817 + SND_DJM_CTL("Ch4 Input", a9_cap5, 2, SND_DJM_WINDEX_CAP) 3818 + }; 3819 + 3832 3820 static const struct snd_djm_device snd_djm_devices[] = { 3833 3821 [SND_DJM_250MK2_IDX] = SND_DJM_DEVICE(250mk2), 3834 3822 [SND_DJM_750_IDX] = SND_DJM_DEVICE(750), ··· 3858 3802 [SND_DJM_900NXS2_IDX] = SND_DJM_DEVICE(900nxs2), 3859 3803 [SND_DJM_750MK2_IDX] = SND_DJM_DEVICE(750mk2), 3860 3804 [SND_DJM_450_IDX] = SND_DJM_DEVICE(450), 3805 + [SND_DJM_A9_IDX] = SND_DJM_DEVICE(a9), 3861 3806 }; 3862 3807 3863 3808 ··· 4132 4075 break; 4133 4076 case USB_ID(0x2b73, 0x000a): /* Pioneer DJ DJM-900NXS2 */ 4134 4077 err = snd_djm_controls_create(mixer, SND_DJM_900NXS2_IDX); 4078 + break; 4079 + case USB_ID(0x2b73, 0x003c): /* Pioneer DJ / AlphaTheta DJM-A9 */ 4080 + err = snd_djm_controls_create(mixer, SND_DJM_A9_IDX); 4135 4081 break; 4136 4082 } 4137 4083
+57
sound/usb/quirks-table.h
··· 3119 3119 } 3120 3120 }, 3121 3121 3122 + { 3123 + /* 3124 + * Pioneer DJ / AlphaTheta DJM-A9 3125 + * 10 channels playback & 12 channels capture @ 44.1/48/96kHz S24LE 3126 + */ 3127 + USB_DEVICE_VENDOR_SPEC(0x2b73, 0x003c), 3128 + QUIRK_DRIVER_INFO { 3129 + QUIRK_DATA_COMPOSITE { 3130 + { 3131 + QUIRK_DATA_AUDIOFORMAT(0) { 3132 + .formats = SNDRV_PCM_FMTBIT_S24_3LE, 3133 + .channels = 10, 3134 + .iface = 0, 3135 + .altsetting = 1, 3136 + .altset_idx = 1, 3137 + .endpoint = 0x01, 3138 + .ep_attr = USB_ENDPOINT_XFER_ISOC| 3139 + USB_ENDPOINT_SYNC_ASYNC, 3140 + .rates = SNDRV_PCM_RATE_44100| 3141 + SNDRV_PCM_RATE_48000| 3142 + SNDRV_PCM_RATE_96000, 3143 + .rate_min = 44100, 3144 + .rate_max = 96000, 3145 + .nr_rates = 3, 3146 + .rate_table = (unsigned int[]) { 3147 + 44100, 48000, 96000 3148 + } 3149 + } 3150 + }, 3151 + { 3152 + QUIRK_DATA_AUDIOFORMAT(0) { 3153 + .formats = SNDRV_PCM_FMTBIT_S24_3LE, 3154 + .channels = 12, 3155 + .iface = 0, 3156 + .altsetting = 1, 3157 + .altset_idx = 1, 3158 + .endpoint = 0x82, 3159 + .ep_idx = 1, 3160 + .ep_attr = USB_ENDPOINT_XFER_ISOC| 3161 + USB_ENDPOINT_SYNC_ASYNC| 3162 + USB_ENDPOINT_USAGE_IMPLICIT_FB, 3163 + .rates = SNDRV_PCM_RATE_44100| 3164 + SNDRV_PCM_RATE_48000| 3165 + SNDRV_PCM_RATE_96000, 3166 + .rate_min = 44100, 3167 + .rate_max = 96000, 3168 + .nr_rates = 3, 3169 + .rate_table = (unsigned int[]) { 3170 + 44100, 48000, 96000 3171 + } 3172 + } 3173 + }, 3174 + QUIRK_COMPOSITE_END 3175 + } 3176 + } 3177 + }, 3178 + 3122 3179 /* 3123 3180 * MacroSilicon MS2100/MS2106 based AV capture cards 3124 3181 *