Message ID | 20220912072945.760949-1-yunjunlee@chromium.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v1] ALSA: dummy: Add customizable volume min/max. | expand |
On Mon, 12 Sep 2022 09:29:45 +0200, YJ Lee wrote: > > Add module parameters to support customized min/max volume leveling, > which will be useful to test devices with different volume granularity. > > Signed-off-by: YJ Lee <yunjunlee@chromium.org> > --- > sound/drivers/dummy.c | 34 ++++++++++++++++++++++++---------- > 1 file changed, 24 insertions(+), 10 deletions(-) > > diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c > index 2a7fc49c1a7c5..64fb2778f1e9a 100644 > --- a/sound/drivers/dummy.c > +++ b/sound/drivers/dummy.c > @@ -42,6 +42,8 @@ MODULE_LICENSE("GPL"); > #define USE_CHANNELS_MAX 2 > #define USE_PERIODS_MIN 1 > #define USE_PERIODS_MAX 1024 > +#define USE_MIXER_VOLUME_LEVEL_MIN -50 > +#define USE_MIXER_VOLUME_LEVEL_MAX 100 > > static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ > static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ > @@ -50,6 +52,8 @@ static char *model[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = NULL}; > static int pcm_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1}; > static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8}; > //static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2}; > +static int mixer_volume_level_min = USE_MIXER_VOLUME_LEVEL_MIN; > +static int mixer_volume_level_max = USE_MIXER_VOLUME_LEVEL_MAX; > #ifdef CONFIG_HIGH_RES_TIMERS > static bool hrtimer = 1; > #endif > @@ -69,6 +73,10 @@ module_param_array(pcm_substreams, int, NULL, 0444); > MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-128) for dummy driver."); > //module_param_array(midi_devs, int, NULL, 0444); > //MODULE_PARM_DESC(midi_devs, "MIDI devices # (0-2) for dummy driver."); > +module_param(mixer_volume_level_min, int, 0444); I can imagine that the permission could be 0644, so that the parameters can be changed dynamically via sysfs, too. But it may skip the sanity check at probe, hence more code would be needed, OTOH. So I applied the patch as is now. thanks, Takashi
On Mon, Sep 12, 2022 at 3:52 PM Takashi Iwai <tiwai@suse.de> wrote: > > On Mon, 12 Sep 2022 09:29:45 +0200, > YJ Lee wrote: > > > > Add module parameters to support customized min/max volume leveling, > > which will be useful to test devices with different volume granularity. > > > > Signed-off-by: YJ Lee <yunjunlee@chromium.org> > > --- > > sound/drivers/dummy.c | 34 ++++++++++++++++++++++++---------- > > 1 file changed, 24 insertions(+), 10 deletions(-) > > > > diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c > > index 2a7fc49c1a7c5..64fb2778f1e9a 100644 > > --- a/sound/drivers/dummy.c > > +++ b/sound/drivers/dummy.c > > @@ -42,6 +42,8 @@ MODULE_LICENSE("GPL"); > > #define USE_CHANNELS_MAX 2 > > #define USE_PERIODS_MIN 1 > > #define USE_PERIODS_MAX 1024 > > +#define USE_MIXER_VOLUME_LEVEL_MIN -50 > > +#define USE_MIXER_VOLUME_LEVEL_MAX 100 > > > > static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ > > static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ > > @@ -50,6 +52,8 @@ static char *model[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = NULL}; > > static int pcm_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1}; > > static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8}; > > //static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2}; > > +static int mixer_volume_level_min = USE_MIXER_VOLUME_LEVEL_MIN; > > +static int mixer_volume_level_max = USE_MIXER_VOLUME_LEVEL_MAX; > > #ifdef CONFIG_HIGH_RES_TIMERS > > static bool hrtimer = 1; > > #endif > > @@ -69,6 +73,10 @@ module_param_array(pcm_substreams, int, NULL, 0444); > > MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-128) for dummy driver."); > > //module_param_array(midi_devs, int, NULL, 0444); > > //MODULE_PARM_DESC(midi_devs, "MIDI devices # (0-2) for dummy driver."); > > +module_param(mixer_volume_level_min, int, 0444); > > I can imagine that the permission could be 0644, so that the > parameters can be changed dynamically via sysfs, too. But it may skip > the sanity check at probe, hence more code would be needed, OTOH. > > So I applied the patch as is now. > > > thanks, > > Takashi Thanks for the insight! Learned a lot from your kind explanation and constant help. Appreciated, YJ
diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c index 2a7fc49c1a7c5..64fb2778f1e9a 100644 --- a/sound/drivers/dummy.c +++ b/sound/drivers/dummy.c @@ -42,6 +42,8 @@ MODULE_LICENSE("GPL"); #define USE_CHANNELS_MAX 2 #define USE_PERIODS_MIN 1 #define USE_PERIODS_MAX 1024 +#define USE_MIXER_VOLUME_LEVEL_MIN -50 +#define USE_MIXER_VOLUME_LEVEL_MAX 100 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ @@ -50,6 +52,8 @@ static char *model[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = NULL}; static int pcm_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1}; static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8}; //static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2}; +static int mixer_volume_level_min = USE_MIXER_VOLUME_LEVEL_MIN; +static int mixer_volume_level_max = USE_MIXER_VOLUME_LEVEL_MAX; #ifdef CONFIG_HIGH_RES_TIMERS static bool hrtimer = 1; #endif @@ -69,6 +73,10 @@ module_param_array(pcm_substreams, int, NULL, 0444); MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-128) for dummy driver."); //module_param_array(midi_devs, int, NULL, 0444); //MODULE_PARM_DESC(midi_devs, "MIDI devices # (0-2) for dummy driver."); +module_param(mixer_volume_level_min, int, 0444); +MODULE_PARM_DESC(mixer_volume_level_min, "Minimum mixer volume level for dummy driver. Default: -50"); +module_param(mixer_volume_level_max, int, 0444); +MODULE_PARM_DESC(mixer_volume_level_max, "Maximum mixer volume level for dummy driver. Default: 100"); module_param(fake_buffer, bool, 0444); MODULE_PARM_DESC(fake_buffer, "Fake buffer allocations."); #ifdef CONFIG_HIGH_RES_TIMERS @@ -713,8 +721,8 @@ static int snd_dummy_volume_info(struct snd_kcontrol *kcontrol, { uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; uinfo->count = 2; - uinfo->value.integer.min = -50; - uinfo->value.integer.max = 100; + uinfo->value.integer.min = mixer_volume_level_min; + uinfo->value.integer.max = mixer_volume_level_max; return 0; } @@ -739,15 +747,15 @@ static int snd_dummy_volume_put(struct snd_kcontrol *kcontrol, int left, right; left = ucontrol->value.integer.value[0]; - if (left < -50) - left = -50; - if (left > 100) - left = 100; + if (left < mixer_volume_level_min) + left = mixer_volume_level_min; + if (left > mixer_volume_level_max) + left = mixer_volume_level_max; right = ucontrol->value.integer.value[1]; - if (right < -50) - right = -50; - if (right > 100) - right = 100; + if (right < mixer_volume_level_min) + right = mixer_volume_level_min; + if (right > mixer_volume_level_max) + right = mixer_volume_level_max; spin_lock_irq(&dummy->mixer_lock); change = dummy->mixer_volume[addr][0] != left || dummy->mixer_volume[addr][1] != right; @@ -1076,6 +1084,12 @@ static int snd_dummy_probe(struct platform_device *devptr) dummy->pcm_hw.channels_max = m->channels_max; } + if (mixer_volume_level_min > mixer_volume_level_max) { + pr_warn("snd-dummy: Invalid mixer volume level: min=%d, max=%d. Fall back to default value.\n", + mixer_volume_level_min, mixer_volume_level_max); + mixer_volume_level_min = USE_MIXER_VOLUME_LEVEL_MIN; + mixer_volume_level_max = USE_MIXER_VOLUME_LEVEL_MAX; + } err = snd_card_dummy_new_mixer(dummy); if (err < 0) return err;
Add module parameters to support customized min/max volume leveling, which will be useful to test devices with different volume granularity. Signed-off-by: YJ Lee <yunjunlee@chromium.org> --- sound/drivers/dummy.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-)