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

Raymond Yau superquad.vortex2 at gmail.com
Sun Oct 21 09:24:56 CEST 2012


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

> 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