diff options
author | Anton Lindqvist <anton@cvs.openbsd.org> | 2022-02-16 06:23:43 +0000 |
---|---|---|
committer | Anton Lindqvist <anton@cvs.openbsd.org> | 2022-02-16 06:23:43 +0000 |
commit | ba93eed72096645fb3ff4322eee1d427d53bc95f (patch) | |
tree | 734f1af6f0086e85180574935b8ae68f8b3be50e /sys/dev/usb/usb_subr.c | |
parent | 6b5ed4ea8ca4b14dafdb7ce15afc72a6d756202a (diff) |
Currently, wskbd_set_mixervolume() only adjusts the volume of the first
attached audio device, i.e. audio0. This approach does not work well
while using additional audio devices equipped with physical volume keys
since those would only affect the volume of audio0.
Instead, correlate audio and ucc devices attached over USB in order to
adjust the volume of the correct audio device. This is done by passing a
cookie from the common point of attachment which is later used to
correlate the audio and wskbd device.
The same approach could be adopted for audio and wskbd devices attaching
on a different bus. Keep in mind that it's of importance to make use of
and increment the same global cookie identifier to avoid collisions.
Makes the volume keys on my Logitech G435 Headset do the right thing.
ok ratchov@
Diffstat (limited to 'sys/dev/usb/usb_subr.c')
-rw-r--r-- | sys/dev/usb/usb_subr.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/dev/usb/usb_subr.c b/sys/dev/usb/usb_subr.c index 7d8480f0f01..9cbbf7f0368 100644 --- a/sys/dev/usb/usb_subr.c +++ b/sys/dev/usb/usb_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: usb_subr.c,v 1.157 2022/01/09 05:43:02 jsg Exp $ */ +/* $OpenBSD: usb_subr.c,v 1.158 2022/02/16 06:23:42 anton Exp $ */ /* $NetBSD: usb_subr.c,v 1.103 2003/01/10 11:19:13 augustss Exp $ */ /* $FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $ */ @@ -839,6 +839,11 @@ usbd_status usbd_probe_and_attach(struct device *parent, struct usbd_device *dev, int port, int addr) { + /* + * Used to correlate audio and wskbd devices as this is the common point + * of attachment between the two. + */ + static char *cookie = 0; struct usb_attach_arg uaa; usb_device_descriptor_t *dd = &dev->ddesc; int i, confi, nifaces; @@ -860,6 +865,7 @@ usbd_probe_and_attach(struct device *parent, struct usbd_device *dev, int port, uaa.vendor = UGETW(dd->idVendor); uaa.product = UGETW(dd->idProduct); uaa.release = UGETW(dd->bcdDevice); + uaa.cookie = ++cookie; /* First try with device specific drivers. */ DPRINTF(("usbd_probe_and_attach trying device specific drivers\n")); |