[RFC PATCH v2 5/5] ASoC: apple: Add macaudio machine driver

Martin Povišer povik+lin at cutebit.org
Thu Jun 9 15:42:09 CEST 2022


> On 9. 6. 2022, at 15:16, Mark Brown <broonie at kernel.org> wrote:
> 
> On Mon, Jun 06, 2022 at 09:19:10PM +0200, Martin Povišer wrote:
> 
>> + *  ┌──────────┐       ┌───────────────► ┌─────┐     ┌──────────┐
>> + *  │ Primary  ├───────┤                 │ Mux │ ──► │ Speakers │
>> + *  └──────────┘       │    ┌──────────► └─────┘     └──────────┘
>> + *                ┌─── │ ───┘             ▲
>> + *  ┌──────────┐  │    │                  │
>> + *  │Secondary ├──┘    │     ┌────────────┴┐
>> + *  └──────────┘       ├────►│Plug-in Demux│
>> + *                     │     └────────────┬┘
>> + *                     │                  │
>> + *                     │                  ▼
>> + *                     │                 ┌─────┐     ┌──────────┐
>> + *                     └───────────────► │ Mux │ ──► │Headphones│
>> + *                                       └─────┘     └──────────┘
> 
> As far as I can tell this demux is entirely software based - why not
> just expose the routing control to userspace and let it handle
> switching (which I suspect may be more featureful than what's
> implemented here)?

Well, userspace should have the other two muxes at its disposal to
implement any routing/switching it wishes -- but in addition we are
also offering letting kernel take care of the switching, by pointing
the muxes to the demux.

I assume (but I don’t know the extent of what’s possible with UCM files),
that this will be of some value to users running plain ALSA with no
sound server.

>> +static int macaudio_jack_event(struct notifier_block *nb, unsigned long event,
>> +                               void *data)
>> +{
>> +       struct snd_soc_jack *jack = data;
>> +       struct macaudio_snd_data *ma = snd_soc_card_get_drvdata(jack->card);
>> +
>> +       ma->jack_plugin_state = !!event;
>> +
>> +       if (!ma->plugin_demux_kcontrol)
>> +               return 0;
>> +
>> +       snd_soc_dapm_mux_update_power(&ma->card.dapm, ma->plugin_demux_kcontrol,
>> +                                     ma->jack_plugin_state,
>> +                                     (struct soc_enum *) &macaudio_plugin_demux_enum, NULL);
>> +
>> +       return 0;
>> +}
> 
> This should be integrated with the core jack detection stuff in
> soc-jack.c and/or the core stuff that's wrapping - that way you'll
> ensure that events are generated and status readable via all the
> interfaces userspace might be looking for.  The ASoC stuff also has some
> DAPM integration for turning on/off outputs which might DTRT for you if
> you do need it in kernel.

Aren’t all the right events to userspace generated already by the
codec calling snd_soc_jack_report?

I looked at the existing DAPM integration but I couldn’t figure out
how to switch the demux with it.



More information about the Alsa-devel mailing list