Hi all,
I did a little exploration of this before too and though I would share my notes FWIW.
Some things we might be able to do right off the bat: 1. Move wIndex from each item into the control group:
struct snd_pioneer_djm_option_group { const char *name; const struct snd_pioneer_djm_option *options; const size_t count; const u16 default_value; const u16 windex; };
2. Generate labels based on wValue perhaps in the fashion of where each case is an enum or define (e.g. PHONO = 0x3):
static char *snd_pioneer_djm_get_label(u8 input_type) { switch (input_type) { case LINE: return "Control Tone LINE\0"; case CDLINE: return "Control Tone CD/LINE\0"; case PHONO: return "Control Tone PHONO\0"; case PFADER: return "Post Fader\0"; case XFADERA: return "Cross Fader A\0"; case XFADERB: return "Cross Fader B\0"; case MIC: return "Mic\0"; case RECOUT: return "Rec Out\0"; case AUX: return "Aux\0"; case NONE: return "None\0"; case PFADERCH1: return "Post Fader CH1\0"; case PFADERCH2: return "Post Fader CH2\0"; default: return "\0"; // 'EINVAL' };
}
This should get us 90% to where we need to be. I originally had lots of huge code snippets that I were going to send but I think this is more readable!
Other wildcard ideas I explored: 1. Bitmask of values stored in u32 private_data. This could work since it only takes up 12bits but it seems like an abuse of private_data's intended function and it feels like the unwrapping process would be somewhat length and messy.
I think this is similar to your idea Fabian.
---
Maybe these notes will help provide some inspiration or something. If I have the time I'll pick up from here tomorrow. Comments/input/ different ideas very welcome :).
Kindest regards, Olivia
On Mon, Feb 01, 2021 at 10:37:21PM +0100, Fabian Lesniak wrote:
Hi Franta,
I've just submitted mixer quirks for the 900NXS2, following the design of Olivia and you. Seems quite clean, but if anyone comes up with a clever idea on how to share code between the channel arrays, I'd highly appreciate that. My experiments so far turned out quite complex: I thought about adding flags like "DEVICE_HAS_DIGITAL", "DEVICE_HAS_AUX" etc. which are evaluated during control creation and usage. The code became unreadable and complex, so I ditched that idea. Creating the controls arrays dynamically would maybe help.
The 900NXS2 uses the same wValue/wIndex as your 250Mk2, just expanded to five channels. It does not allow to set playback channels via USB, that can only be done in hardware using the input source knob. I guess that is same for the DJM-700. The 900NXS2 allows querying the currently selected playback channel though, but I think this is of no great use so I did not implement it in this patch (although it was in my original draft from last year: https:// gist.github.com/flesniak/074ab23bbc833663b782f44174eae6a4). If you think it's worth it, I could have a look at that again.
Cheers Fabian
Am Montag, 1. Februar 2021, 16:34:29 CET schrieb František Kučera:
Dne 29. 01. 21 v 15:09 Fabian Lesniak napsal(a):
In general, I'm wondering whether it is a good way to implement more and more Pioneer devices in such a hard coded way. mixer_quirks.c already has
3k LOC, and the 900NXS2 support will add at least 100 more if written in
the same scheme. It may be good to either dynamically create controls depending on the model or move pioneer support to an extra file.
The original idea was to reduce complexity rather than lines of code and keep it straightforward without many IF branching and special cases.
Maybe more data/configuration (declared arrays) can be shared among multiple devices – like the capture_level.
Does not the DJM750 support also mapping of MIC, AUX and REC OUT or any playback mapping? If it would, more configuration might be shared. And is it DJM-750MK2 or DJM-750-K? At least the specification of DJM-750-K talks about a sound card with 4 stereo inputs and 4 stereo outputs.
Does anybody know/have other DJM hardware? Does it use the same codes (wValue/wIndex)?
Franta