On Fri, 21 Sep 2018 00:07:19 +0200, Jussi Laako wrote: > > This patch accessing vendor specific registers of RME Class Compliant > devices works otherwise fine, but there is still one small problem. It is > supposed to be a polled from the hardware, since the values indicate > device status and are subject to change at all times. Behavior is correct > if I keep running "amixer" all the time to retrieve values - sampling rate > changes are visible and values get updated. However, when I poll the > values from an application without reopening the mixer, they are being > cached somewhere and the changes are not reflected. This problem doesn't > exist for example with PCIe based RME HDSPe AIO and application gets > updated values, but in this USB based device case they don't get updated. > I have flagged all the mixer controls as read-only and volatile, but the > volatile flag is not honored in this (assuming I've understood it correctly). > > Any guidance on how to fix the caching problem is welcome! The caching is currently enabled for all elements, but changing it should be trivial. The patch below adds is_volatile flag to the element, and you can set it to true in the quirk somehow for uncached controls. thanks, Takashi --- --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -449,8 +449,10 @@ int snd_usb_get_cur_mix_value(struct usb_mixer_elem_info *cval, cval->control, channel, err); return err; } - cval->cached |= 1 << channel; - cval->cache_val[index] = *value; + if (!cval->is_volatile) { + cval->cached |= 1 << channel; + cval->cache_val[index] = *value; + } return 0; } @@ -540,8 +542,10 @@ int snd_usb_set_cur_mix_value(struct usb_mixer_elem_info *cval, int channel, value); if (err < 0) return err; - cval->cached |= 1 << channel; - cval->cache_val[index] = value; + if (!cval->is_volatile) { + cval->cached |= 1 << channel; + cval->cache_val[index] = value; + } return 0; } diff --git a/sound/usb/mixer.h b/sound/usb/mixer.h index 3d12af8bf191..cfbc274ce89f 100644 --- a/sound/usb/mixer.h +++ b/sound/usb/mixer.h @@ -70,6 +70,7 @@ struct usb_mixer_elem_info { int val_type; int min, max, res; int dBmin, dBmax; + bool is_volatile; int cached; int cache_val[MAX_CHANNELS]; u8 initialized; _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel