[alsa-devel] [PATCH v7 3/7] ALSA: jack: extend snd_jack_new to support phantom jack

Jie, Yang yang.jie at intel.com
Wed Apr 22 04:06:38 CEST 2015


> -----Original Message-----
> From: Takashi Iwai [mailto:tiwai at suse.de]
> Sent: Tuesday, April 21, 2015 5:57 PM
> To: Jie, Yang
> Cc: broonie at kernel.org; alsa-devel at alsa-project.org; Girdwood, Liam R
> Subject: Re: [PATCH v7 3/7] ALSA: jack: extend snd_jack_new to support
> phantom jack
> 
> At Tue, 21 Apr 2015 16:05:41 +0800,
> Jie Yang wrote:
> >
> > For phantom jack, we won't create real jack device, but jack kctl may
> > be needed.
> >
> > Here, we extend snd_jack_new() to support phantom jack creating:
> > pass in a bool param for [non-]phantom flag, and a non-Null param
> > (struct snd_jack_kctl **) to indicate that we need create kctl at this
> > jack creating stage.
> >
> > We can also add kctl to a jack after the jack is created.
> >
> > This make the integrating the existing HDA jack kctl and soc jack kctl
> > possible.
> >
> > Signed-off-by: Jie Yang <yang.jie at intel.com>
> > ---
> >  include/sound/jack.h            |  4 +--
> >  sound/core/jack.c               | 56 +++++++++++++++++++++++++--------------
> --
> >  sound/pci/hda/hda_jack.c        |  2 +-
> >  sound/pci/oxygen/xonar_wm87x6.c |  2 +-
> >  sound/soc/soc-jack.c            |  2 +-
> >  5 files changed, 39 insertions(+), 27 deletions(-)
> >
> > diff --git a/include/sound/jack.h b/include/sound/jack.h index
> > 9781e75..34b6849 100644
> > --- a/include/sound/jack.h
> > +++ b/include/sound/jack.h
> > @@ -93,7 +93,7 @@ struct snd_jack_kctl {  #ifdef CONFIG_SND_JACK
> >
> >  int snd_jack_new(struct snd_card *card, const char *id, int type,
> > -		 struct snd_jack **jack);
> > +		 struct snd_jack **jack, bool phantom_jack, struct
> snd_jack_kctl
> > +**jjack_kctl);
> >  int snd_jack_add_new_kctl(struct snd_jack *jack, const char * name,
> > int mask);  void snd_jack_set_parent(struct snd_jack *jack, struct
> > device *parent);  int snd_jack_set_key(struct snd_jack *jack, enum
> > snd_jack_types type, @@ -103,7 +103,7 @@ void snd_jack_report(struct
> > snd_jack *jack, int status);
> >
> >  #else
> >  static inline int snd_jack_new(struct snd_card *card, const char *id, int
> type,
> > -			       struct snd_jack **jack)
> > +			       struct snd_jack **jack, bool phantom_jack, struct
> > +snd_jack_kctl **jjack_kctl)
> >  {
> >  	return 0;
> >  }
> > diff --git a/sound/core/jack.c b/sound/core/jack.c index
> > b13d0b1..edd55c8 100644
> > --- a/sound/core/jack.c
> > +++ b/sound/core/jack.c
> > @@ -198,6 +198,10 @@ EXPORT_SYMBOL(snd_jack_add_new_kctl);
> >   * @type:  a bitmask of enum snd_jack_type values that can be detected
> by
> >   *         this jack
> >   * @jjack: Used to provide the allocated jack object to the caller.
> > + * @phantom_jack: for phantom jack, only create needed kctl, won't
> create
> > + *         real jackdevice
> > + * @jjack_kctl: create kctl if non-NULL pointer passed in, and provide it to
> > + *         the caller. also add it to the non-phantom jack kctl list
> >   *
> >   * Creates a new jack object.
> >   *
> > @@ -205,7 +209,7 @@ EXPORT_SYMBOL(snd_jack_add_new_kctl);
> >   * On success @jjack will be initialised.
> >   */
> >  int snd_jack_new(struct snd_card *card, const char *id, int type,
> > -		 struct snd_jack **jjack)
> > +		 struct snd_jack **jjack, bool phantom_jack, struct
> snd_jack_kctl
> > +**jjack_kctl)
> 
> The caller doesn't need to get struct snd_jack_kctl.  Instead, it's better to get
> struct snd_kcontrol.  In that way, you can move the definition of struct
> snd_jack_kctl locally into jack.c.  It's merely an internal object only for jack
> after all.
 
That's good. Will change it.

> 
> >  {
> >  	struct snd_jack *jack;
> >  	int err;
> > @@ -216,35 +220,43 @@ int snd_jack_new(struct snd_card *card, const
> char *id, int type,
> >  		.dev_disconnect = snd_jack_dev_disconnect,
> >  	};
> >
> > -	jack = kzalloc(sizeof(struct snd_jack), GFP_KERNEL);
> > -	if (jack == NULL)
> > -		return -ENOMEM;
> > +	if (jjack_kctl)
> > +		*jjack_kctl = snd_jack_kctl_new(card, id, type);
> >
> > -	jack->id = kstrdup(id, GFP_KERNEL);
> > +	/* don't creat real jack device for phantom jack */
> > +	if (!phantom_jack) {
> > +		jack = kzalloc(sizeof(struct snd_jack), GFP_KERNEL);
> 
> We need to create a jack object even for a phantom jack.  It's the place
> managing the list of kctls.  Otherwise we can't track these kctls.
> 
> Just skip creating jack->input_dev for phantom jacks.
 
Sounds good, if the extra jack devices have no side effect.

> 
> 
> Takashi


More information about the Alsa-devel mailing list