[alsa-devel] [RFC PATCH] ASoC: codec: hdac_hdmi: no checking monitor in hw_params
Takashi Iwai
tiwai at suse.de
Mon May 6 11:31:20 CEST 2019
On Mon, 06 May 2019 11:25:16 +0200,
Yang, Libin wrote:
>
> Hi Jaroslav,
>
> >-----Original Message-----
> >From: Jaroslav Kysela [mailto:perex at perex.cz]
> >Sent: Monday, May 6, 2019 5:04 PM
> >To: Yang, Libin <libin.yang at intel.com>; alsa-devel at alsa-project.org
> >Cc: tiwai at suse.de; pierre-louis.bossart at linux.intel.com; broonie at kernel.org;
> >Hui Wang <hui.wang at canonical.com>; Lin, Mengdong
> ><mengdong.lin at intel.com>; Wang, Rander <rander.wang at intel.com>
> >Subject: Re: [alsa-devel] [RFC PATCH] ASoC: codec: hdac_hdmi: no checking
> >monitor in hw_params
> >
> >Dne 06. 05. 19 v 10:46 Yang, Libin napsal(a):
> >> Add Mengdong, Hui, Rander
> >>
> >> Hi Jaroslav,
> >>
> >>> -----Original Message-----
> >>> From: Jaroslav Kysela [mailto:perex at perex.cz]
> >>> Sent: Monday, May 6, 2019 4:20 PM
> >>> To: Yang, Libin <libin.yang at intel.com>; alsa-devel at alsa-project.org
> >>> Cc: tiwai at suse.de; pierre-louis.bossart at linux.intel.com;
> >>> broonie at kernel.org; subhransu.s.prusty at intel.com;
> >>> samreen.nilofer at intel.com
> >>> Subject: Re: [alsa-devel] [RFC PATCH] ASoC: codec: hdac_hdmi: no
> >>> checking monitor in hw_params
> >>>
> >>> Dne 06. 05. 19 v 8:59 libin.yang at intel.com napsal(a):
> >>>> From: Libin Yang <libin.yang at intel.com>
> >>>>
> >>>> This patch move the check of monitor from hw_params to trigger callback.
> >>>>
> >>>> The original code will check the monitor presence in hw_params. If
> >>>> the monitor doesn't exist, hw_params will return -ENODEV. Mostly this is
> >OK.
> >>>>
> >>>> However, pulseaudio will check the pcm devices when kernel is booting
> >up.
> >>>> It will try to open, set hw_params, prepare such pcm devices. We
> >>>> can't guarantee that the monitor will be connected when kernel is booting
> >up.
> >>>> Especially, hdac_hdmi will export 3 pcms at most. It's hard to say
> >>>> users will connect 3 monitors to the HDMI/DP ports. This will cause
> >>>> pulseaudio fail in parsing the pcm devices because the driver will
> >>>> return -ENODEV in hw_params.
> >>>>
> >>>> This patch tries to move the check of monitor presence into trigger
> >>>> callback. This can "trick" the pulseaudio the pcm is ready.
> >>>>
> >>>> This bug is found when we try to enable HDMI detection in
> >>>> gnome-sound-setting for ASoC hdac_hdmi. After we enable the hdmi in
> >>>> UCM, pulseaudio will try to parse the hdmi pcm devices. It will
> >>>> cause failure if there are no monitors connected.
> >>>
> >>> I don't like this solution much. PA should use the Jack control to
> >>> add the devices dynamically and avoid probing when the Jack control is
> >false.
> >>
> >> Before we decided to use UCM, we did some investigation on Jack controls.
> >> And we found we need do much more changes in driver to support Jack
> >> Controls.
> >
> >How do you handle the dynamic monitor configuration (like when user
> >disconnects the monitor on-the-fly) then? The control interface can notify the
> >state change through the Jack controls. The PCM interface does not handle
> >this.
>
> We may still need Jack control for this case. This is my second plan to enable
> Jack control. But even we enable Jack control, it seems it is still easy to use UCM.
> This is because ASoC control names don't follow legacy HDA rule. This means
> we may need to change other controls name besides HDMI in the driver or we
> may need to add more configures in pulseaudio/alsa-mixer/paths.
Ah, I overlooked that hdac_hdmi chose the own jack control names.
That's basically useless, yeah.
> Hi Mengdong & Hui,
>
> Do you have more comments for Jack control or UCM?
I guess a UCM profile would handle the jack detection as well, by
specifying the right kcontrol names, right?
thanks,
Takashi
>
> Regards,
> Libin
>
> >
> > Jaroslav
> >
> >>
> >> Regards,
> >> Libin
> >>
> >>>
> >>> Jaroslav
> >>>
> >>>>
> >>>> Signed-off-by: Libin Yang <libin.yang at intel.com>
> >>>> ---
> >>>> sound/soc/codecs/hdac_hdmi.c | 44
> >>>> +++++++++++++++++++++++++++++++-------------
> >>>> 1 file changed, 31 insertions(+), 13 deletions(-)
> >>>>
> >>>> diff --git a/sound/soc/codecs/hdac_hdmi.c
> >>>> b/sound/soc/codecs/hdac_hdmi.c index 4de1fbf..f482e09 100644
> >>>> --- a/sound/soc/codecs/hdac_hdmi.c
> >>>> +++ b/sound/soc/codecs/hdac_hdmi.c
> >>>> @@ -455,24 +455,11 @@ static int hdac_hdmi_set_hw_params(struct
> >>> snd_pcm_substream *substream,
> >>>> struct snd_pcm_hw_params *hparams, struct snd_soc_dai *dai) {
> >>>> struct hdac_hdmi_priv *hdmi = snd_soc_dai_get_drvdata(dai);
> >>>> - struct hdac_device *hdev = hdmi->hdev;
> >>>> struct hdac_hdmi_dai_port_map *dai_map;
> >>>> - struct hdac_hdmi_port *port;
> >>>> struct hdac_hdmi_pcm *pcm;
> >>>> int format;
> >>>>
> >>>> dai_map = &hdmi->dai_map[dai->id];
> >>>> - port = dai_map->port;
> >>>> -
> >>>> - if (!port)
> >>>> - return -ENODEV;
> >>>> -
> >>>> - if ((!port->eld.monitor_present) || (!port->eld.eld_valid)) {
> >>>> - dev_err(&hdev->dev,
> >>>> - "device is not configured for this pin:port%d:%d\n",
> >>>> - port->pin->nid, port->id);
> >>>> - return -ENODEV;
> >>>> - }
> >>>>
> >>>> format = snd_hdac_calc_stream_format(params_rate(hparams),
> >>>> params_channels(hparams),
> >>> params_format(hparams), @@ -630,6
> >>>> +617,36 @@ static void hdac_hdmi_pcm_close(struct
> >snd_pcm_substream
> >>> *substream,
> >>>> dai_map->port = NULL;
> >>>> }
> >>>>
> >>>> +static int hdac_hdmi_pcm_trigger(struct snd_pcm_substream
> >>>> +*substream,
> >>> int cmd,
> >>>> + struct snd_soc_dai *dai)
> >>>> +{
> >>>> + struct hdac_hdmi_port *port;
> >>>> + struct hdac_hdmi_dai_port_map *dai_map;
> >>>> + struct hdac_hdmi_priv *hdmi = snd_soc_dai_get_drvdata(dai);
> >>>> + struct hdac_device *hdev = hdmi->hdev;
> >>>> +
> >>>> + /*
> >>>> + * When start, if there is no monitor,
> >>>> + * It should not start audio.
> >>>> + */
> >>>> + if (cmd == SNDRV_PCM_TRIGGER_START) {
> >>>> + dai_map = &hdmi->dai_map[dai->id];
> >>>> + port = dai_map->port;
> >>>> +
> >>>> + if (!port)
> >>>> + return -ENODEV;
> >>>> +
> >>>> + if ((!port->eld.monitor_present) || (!port->eld.eld_valid)) {
> >>>> + dev_err(&hdev->dev,
> >>>> + "device is not configured for this
> >>> pin:port%d:%d\n",
> >>>> + port->pin->nid, port->id);
> >>>> + return -ENODEV;
> >>>> + }
> >>>> + }
> >>>> +
> >>>> + return 0;
> >>>> +}
> >>>> +
> >>>> static int
> >>>> hdac_hdmi_query_cvt_params(struct hdac_device *hdev, struct
> >>>> hdac_hdmi_cvt *cvt) { @@ -1389,6 +1406,7 @@ static const struct
> >>>> snd_soc_dai_ops hdmi_dai_ops = {
> >>>> .startup = hdac_hdmi_pcm_open,
> >>>> .shutdown = hdac_hdmi_pcm_close,
> >>>> .hw_params = hdac_hdmi_set_hw_params,
> >>>> + .trigger = hdac_hdmi_pcm_trigger,
> >>>> .set_tdm_slot = hdac_hdmi_set_tdm_slot, };
> >>>>
> >>>>
> >>>
> >>>
> >>> --
> >>> Jaroslav Kysela <perex at perex.cz>
> >>> Linux Sound Maintainer; ALSA Project; Red Hat, Inc.
> >
> >
> >--
> >Jaroslav Kysela <perex at perex.cz>
> >Linux Sound Maintainer; ALSA Project; Red Hat, Inc.
More information about the Alsa-devel
mailing list