[alsa-devel] [GIT PULL] dummy: allow disabling mixer controls

Raymond Yau superquad.vortex2 at gmail.com
Wed Oct 24 05:45:01 CEST 2012


2012-10-21 下午4:22 於 "Takashi Iwai" <tiwai at suse.de> 寫道:
>
> At Sun, 21 Oct 2012 15:24:56 +0800,
> Raymond Yau wrote:
> >
> > 2012-10-21 上午6:11 於 "Clemens Ladisch" <clemens at ladisch.de> 寫道:
> > >
> > > The following changes since commit
> > a0d271cbfed1dd50278c6b06bead3d00ba0a88f9:
> > >
> > >   Linux 3.6 (2012-09-30 16:47:46 -0700)
> > >
> > > are available in the git repository at:
> > >   git://git.alsa-project.org/alsa-kprivate.git dummy-ctl-inactive
> > >
> > > ----------------------------------------------------------------
> > > Quite a few mixer applications do not handle deactivated controls
> > > correctly.  This patch adds such controls to snd-dummy to make
> > > crash^H^H^H^H^Htesting these apps easier.
> > > ----------------------------------------------------------------
> >
> > what is the meaning of deactivated control ?
> >
> > amixer still can change the value of the deactivated cd volume control
if
> > write access is no disabled
>
> If so, that should be checked rather in the core code...

the other problem is that the simple mixer api does not  provide any
function to know whether the cd playback volume control or the  cd playback
switch control is active or inactive so alsamixer disable both controls

>
>
> Takashi
>
> > > Clemens Ladisch (1):
> > >       ALSA: dummy: allow disabling mixer controls
> > >
> > >  sound/drivers/dummy.c |   73
> > +++++++++++++++++++++++++++++++++++++++++++++++-
> > >  1 files changed, 71 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c
> > > index 54bb664..4f522cf 100644
> > > --- a/sound/drivers/dummy.c
> > > +++ b/sound/drivers/dummy.c
> > > @@ -134,6 +134,9 @@ struct snd_dummy {
> > >         spinlock_t mixer_lock;
> > >         int mixer_volume[MIXER_ADDR_LAST+1][2];
> > >         int capture_source[MIXER_ADDR_LAST+1][2];
> > > +       int iobox;
> > > +       struct snd_kcontrol *cd_volume_ctl;
> > > +       struct snd_kcontrol *cd_switch_ctl;
> > >         const struct dummy_timer_ops *timer_ops;
> > >  };
> > >
> > > @@ -817,6 +820,57 @@ static int snd_dummy_capsrc_put(struct
snd_kcontrol
> > *kcontrol, struct snd_ctl_el
> > >         return change;
> > >  }
> > >
> > > +static int snd_dummy_iobox_info(struct snd_kcontrol *kcontrol,
> > > +                               struct snd_ctl_elem_info *info)
> > > +{
> > > +       const char *const names[] = { "None", "CD Player" };
> > > +
> > > +       return snd_ctl_enum_info(info, 1, 2, names);
> > > +}
> > > +
> > > +static int snd_dummy_iobox_get(struct snd_kcontrol *kcontrol,
> > > +                              struct snd_ctl_elem_value *value)
> > > +{
> > > +       struct snd_dummy *dummy = snd_kcontrol_chip(kcontrol);
> > > +
> > > +       value->value.enumerated.item[0] = dummy->iobox;
> > > +       return 0;
> > > +}
> > > +
> > > +static int snd_dummy_iobox_put(struct snd_kcontrol *kcontrol,
> > > +                              struct snd_ctl_elem_value *value)
> > > +{
> > > +       struct snd_dummy *dummy = snd_kcontrol_chip(kcontrol);
> > > +       int changed;
> > > +
> > > +       if (value->value.enumerated.item[0] > 1)
> > > +               return -EINVAL;
> > > +
> > > +       changed = value->value.enumerated.item[0] != dummy->iobox;
> > > +       if (changed) {
> > > +               dummy->iobox = value->value.enumerated.item[0];
> > > +
> > > +               if (dummy->iobox) {
> > > +                       dummy->cd_volume_ctl->vd[0].access &=
> > > +                               ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
> > > +                       dummy->cd_switch_ctl->vd[0].access &=
> > > +                               ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
> > > +               } else {
> > > +                       dummy->cd_volume_ctl->vd[0].access |=
> > > +                               SNDRV_CTL_ELEM_ACCESS_INACTIVE;
> > > +                       dummy->cd_switch_ctl->vd[0].access |=
> > > +                               SNDRV_CTL_ELEM_ACCESS_INACTIVE;
> > > +               }
> > > +
> > > +               snd_ctl_notify(dummy->card, SNDRV_CTL_EVENT_MASK_INFO,
> > > +                              &dummy->cd_volume_ctl->id);
> > > +               snd_ctl_notify(dummy->card, SNDRV_CTL_EVENT_MASK_INFO,
> > > +                              &dummy->cd_switch_ctl->id);
> > > +       }
> > > +
> > > +       return changed;
> > > +}
> > > +
> > >  static struct snd_kcontrol_new snd_dummy_controls[] = {
> > >  DUMMY_VOLUME("Master Volume", 0, MIXER_ADDR_MASTER),
> > >  DUMMY_CAPSRC("Master Capture Switch", 0, MIXER_ADDR_MASTER),
> > > @@ -827,22 +881,37 @@ DUMMY_CAPSRC("Line Capture Switch", 0,
> > MIXER_ADDR_LINE),
> > >  DUMMY_VOLUME("Mic Volume", 0, MIXER_ADDR_MIC),
> > >  DUMMY_CAPSRC("Mic Capture Switch", 0, MIXER_ADDR_MIC),
> > >  DUMMY_VOLUME("CD Volume", 0, MIXER_ADDR_CD),
> > > -DUMMY_CAPSRC("CD Capture Switch", 0, MIXER_ADDR_CD)
> > > +DUMMY_CAPSRC("CD Capture Switch", 0, MIXER_ADDR_CD),
> > > +{
> > > +       .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
> > > +       .name  = "External I/O Box",
> > > +       .info  = snd_dummy_iobox_info,
> > > +       .get   = snd_dummy_iobox_get,
> > > +       .put   = snd_dummy_iobox_put,
> > > +},
> > >  };
> > >
> > >  static int __devinit snd_card_dummy_new_mixer(struct snd_dummy
*dummy)
> > >  {
> > >         struct snd_card *card = dummy->card;
> > > +       struct snd_kcontrol *kcontrol;
> > >         unsigned int idx;
> > >         int err;
> > >
> > >         spin_lock_init(&dummy->mixer_lock);
> > >         strcpy(card->mixername, "Dummy Mixer");
> > > +       dummy->iobox = 1;
> > >
> > >         for (idx = 0; idx < ARRAY_SIZE(snd_dummy_controls); idx++) {
> > > -               err = snd_ctl_add(card,
> > snd_ctl_new1(&snd_dummy_controls[idx], dummy));
> > > +               kcontrol = snd_ctl_new1(&snd_dummy_controls[idx],
dummy);
> > > +               err = snd_ctl_add(card, kcontrol);
> > >                 if (err < 0)
> > >                         return err;
> > > +               if (!strcmp(kcontrol->id.name, "CD Volume"))
> > > +                       dummy->cd_volume_ctl = kcontrol;
> > > +               else if (!strcmp(kcontrol->id.name, "CD Capture
Switch"))
> > > +                       dummy->cd_switch_ctl = kcontrol;
> > > +
> > >         }
> > >         return 0;
> > >  }


More information about the Alsa-devel mailing list