huge mixers

Takashi Sakamoto o-takashi at sakamocchi.jp
Thu Aug 19 04:10:18 CEST 2021


Hi,

I'm a maintainer of ALSA firewire stack, which supports drivers for
audio and music units in IEEE 1394 bus, including some recording
equipments such as RME Fireface series.

On Wed, Aug 18, 2021 at 04:59:50PM +0200, Philippe Bekaert wrote:
> Dear all,
> 
> I am working on a new driver for the RME HDSPe cards, which eventually
> could replace the hdspm driver. 
> 
> These cards have a hardware mixer / matrox router, freely mixing tens
> of hardware inputs and software playbacks into tens of outputs (8192
> mixer controls on the HDSPe MADI).
> 
> Right now, mixer state (cached by the driver) can be read efficiently
> in one ad-hoc ioctl call, and individual channels modified through a
> HWDEP ALSA control element with 3 parameters (input/playback index,
> output index, gain value).
> 
> I understand there is a desire to get rid of ad hoc ioctls and am
> therefore looking for a more generic way to read and write huge mixer
> state. 
> 
> Has anyone been facing similar issues? How have you been solving it?
> Is there any “common practice” or “habits” in this community concerning
> this topic? Would it make sense to define a kind of generic huge mixer
> interface? Then, has anyone an idea or preference how it should look
> like?
> 
> Looking forward to your feedback.
> 
> Best regards and thanks in advance,
> 
> Philippe.

I think the total number, 8192, comes from 64 physical inputs, 64 system
inputs and 64 physical outputs ((64 + 64) * 64 = 8192). Were I you, I'd
use control element set to code the control elements.

In design of ALSA control interface, several control elements can be
aggregated into one instance of 'struct snd_kcontrol'. I call it as
'control element set'. Inner the set, each element can be indicated by
numeric index value of 'struct snd_ctl_elem_id' from userspace
applications. As of release candidate of Linux kernel v5.14, the maximum
number of elements per set is limited by 1028 ('MAX_CONTROL_COUNT' macro
in 'sound/core/control.c').

One control element have limitation about the size of array for values
depending on the type of value. In your case, I assume to use
'SNDRV_CTL_ELEM_TYPE_INTEGER'. In the case, one control element can
handle 128 integer values.

When expressing the 8192 mixer coefficients, I would do:
 - Adding 1 element set including 64 elements so that each element
   corresponds to each physical output.
 - Each element handles 128 values so that each value corresponds to
   gain of 64 physical inputs and 64 system inputs per each.

Or when splitting physical inputs and system inputs:
 - Adding two element sets including 64 elements per each. The elements
   in first set are 'from physical inputs to physical outputs' and the
   elements in second set are 'from system inputs to physical outputs'.
 - Each element handles 64 values so that each value corresponds to
   gain of 64 physical inputs or 64 system inputs per each.

In a point of kernel memory consumption, the first way is less than the
second way. In any cases, ALSA control application can access total 8192
values in 128 control elements.


For the usage of ALSA HwDep interface, an advanced topic stands in my
opinion; how to handle packet from 'RME Advanced Remote Control USB
(ARC USB)'. Depending on scenario, the ioctl implementation might not be
worse since it allows userspace application to control hardware directly.
But it's advanced topic, so let me avoid discussion about it unless
you are interested in it.


Regards

Takashi Sakamoto


More information about the Alsa-devel mailing list