[alsa-devel] [PATCH RFC V2] ALSA: usb-audio: Scarlett Gen 2 mixer interface

Takashi Iwai tiwai at suse.de
Mon Apr 29 16:49:26 CEST 2019


On Mon, 29 Apr 2019 15:56:02 +0200,
Geoffrey D. Bennett wrote:
> 
> Add mixer quirk for the Focusrite Scarlett 18i8 and 18i20 Gen 2 audio
> interfaces. Although the interfaces are USB compliant, additional
> input/output level controls and hardware routing/mixing functionality
> are available using proprietary USB requests.
> 
> Signed-off-by: Geoffrey D. Bennett <g at b4.vu>
> ---
> Hi all,
> 
> This patch adds the following controls for the Scarlett 18i8 and 18i20
> Gen 2:
> - Master volume knob indicator (18i20 only)
> - Volume controls for the analogue HW outputs
> - HW/SW volume switches for the 10 analogue HW outputs (18i20 only)
> - Output mux (where the sound for the HW outputs comes from; defaults
>   to PCM outputs)
> - Capture mux (where the sound for PCM recording comes from; defaults
>   to HW inputs)
> - Matrix mux (where the sound going into the mixer comes from; 18
>   inputs default off)
> - Mixer matrix (18 inputs * 10 outputs = 180 controls)
> - Mute and dim indicators (18i20 only)
> - Line Level/Instrument Level and Pad controls (18i8 only)
> - Level meters
> 
> Changes since v1:
> - Add support for the Scarlett 18i8 Gen 2
> - Save configuration parameters to NVRAM
> - Implemented feedback from Takashi's email 24/Apr/2019
> - Moved private field from struct snd_usb_audio to struct
>   usb_mixer_interface
> - Added timer and buffer fields to struct usb_mixer_interface
> - Other small code fixes/cleanups/improvements
> 
> Outstanding issues/questions:
> 
> - Adding fields to struct usb_mixer_interface seemed a better place
>   than struct snd_usb_audio as in version 1 of this patch (I think
>   these new fields are used in the same sort of context as the "Sound
>   Blaster remote control stuff" fields, and I am reusing rc_urb and
>   rc_setup_packet). I wasn't sure of the naming; should they be named
>   generically ("timer", "private") or specifically
>   ("scarlett2_buffer")? Should the Sound Blaster RC fields that I'm
>   reusing be renamed to have generic names?

The best would be completely without it, but it's a better place,
indeed.  However, the addition should be only one pointer field
private_data and one function pointer private_free.  Put the all
device specific stuff to private_data and release via the own
private_free callback instead.

> - There are software controllable pads on the 18i8 line-inputs. I
>   called the controls "Line In %d Pad Capture Switch". They work
>   correctly in alsamixer (shown in the capture view as e.g. "Line In 1
>   Pad") but the "on" state is displayed as "L R CAPTURE" which looks
>   unusual. I could use an Enum with Off/On values, but I thought this
>   is what "Switch" is for (as per control-names.rst). Should I leave
>   this as-is, or is there a better name that will make this show up as
>   a regular on/off switch?
> 
>   amixer contents shows:
> 
>   numid=15,iface=MIXER,name='Line In 1 Pad Capture Switch'
>     ; type=BOOLEAN,access=rw------,values=1
>     : values=off
> 
>   amixer scontents shows:
> 
>   Simple mixer control 'Line In 1 Pad',0
>     Capabilities: cswitch cswitch-joined
>     Capture channels: Mono
>     Mono: Capture [off]

It's possible to override per device-specific stuff via a
shared-object plugin in alsa-lib, but this is far too complex.
Rather leave it as is.  alsamixer isn't the best tool for a
complicated mixer UI, after all.

About the other changes:
a timer is no suitable choice for such a purpose.  The easier option
would be the delayed work.  Then you can use GFP_KERNEL instead of
GFP_ATOMIC.

Also, the delayed work needs to be canceled or flushed at PM suspend
callback as well as disconnecting.


thanks,

Takashi


More information about the Alsa-devel mailing list