-/* $OpenBSD: audio.c,v 1.195 2022/02/16 06:21:18 anton Exp $ */
+/* $OpenBSD: audio.c,v 1.196 2022/02/16 06:23:42 anton Exp $ */
/*
* Copyright (c) 2015 Alexandre Ratchov <alex@caoua.org>
*
#define WSKBD_MUTE_DISABLE 2
#define WSKBD_MUTE_ENABLE 3
};
+
+int wskbd_set_mixervolume_unit(int, long, long);
#endif
/*
};
int i;
- if (sc->dev.dv_unit != 0) {
- DPRINTF("%s: not configuring wskbd keys\n", DEVNAME(sc));
- return;
- }
for (i = 0; i < sizeof(spkr_names) / sizeof(spkr_names[0]); i++) {
if (wskbd_initvol(sc, &sc->spkr,
spkr_names[i].cn, spkr_names[i].dn))
return 0;
}
+/*
+ * Adjust the volume of the audio device associated with the given cookie.
+ * Otherwise, fallback to audio0.
+ */
+int
+wskbd_set_mixervolume_dev(void *cookie, long dir, long out)
+{
+ int unit = 0;
+ int i;
+
+ for (i = 0; i < audio_cd.cd_ndevs; i++) {
+ struct audio_softc *sc;
+
+ sc = (struct audio_softc *)device_lookup(&audio_cd, i);
+ if (sc == NULL)
+ continue;
+ if (sc->cookie != cookie) {
+ device_unref(&sc->dev);
+ continue;
+ }
+
+ device_unref(&sc->dev);
+ unit = i;
+ break;
+ }
+
+ return wskbd_set_mixervolume_unit(unit, dir, out);
+}
+
int
wskbd_set_mixervolume(long dir, long out)
+{
+ return wskbd_set_mixervolume_unit(0, dir, out);
+}
+
+int
+wskbd_set_mixervolume_unit(int unit, long dir, long out)
{
struct audio_softc *sc;
struct wskbd_vol *vol;
- sc = (struct audio_softc *)device_lookup(&audio_cd, 0);
+ sc = (struct audio_softc *)device_lookup(&audio_cd, unit);
if (sc == NULL)
return ENODEV;
vol = out ? &sc->spkr : &sc->mic;
-/* $OpenBSD: uaudio.c,v 1.166 2022/02/16 06:21:19 anton Exp $ */
+/* $OpenBSD: uaudio.c,v 1.167 2022/02/16 06:23:42 anton Exp $ */
/*
* Copyright (c) 2018 Alexandre Ratchov <alex@caoua.org>
*
/* print a nice uaudio attach line */
uaudio_print(sc);
- audio_attach_mi(&uaudio_hw_if, sc, NULL, &sc->dev);
+ audio_attach_mi(&uaudio_hw_if, sc, arg->cookie, &sc->dev);
}
int
-/* $OpenBSD: ucc.c,v 1.29 2022/01/09 05:43:00 jsg Exp $ */
+/* $OpenBSD: ucc.c,v 1.30 2022/02/16 06:23:42 anton Exp $ */
/*
* Copyright (c) 2021 Anton Lindqvist <anton@openbsd.org>
int ucc_detach(struct device *, int);
void ucc_intr(struct uhidev *, void *, u_int);
-void ucc_attach_wskbd(struct ucc_softc *);
+void ucc_attach_wskbd(struct ucc_softc *, void *);
int ucc_enable(void *, int);
void ucc_set_leds(void *, int);
int ucc_ioctl(void *, u_long, caddr_t, int, struct proc *);
/* Cannot load an empty map. */
if (sc->sc_maplen > 0)
- ucc_attach_wskbd(sc);
+ ucc_attach_wskbd(sc, uha->uaa->cookie);
}
int
}
void
-ucc_attach_wskbd(struct ucc_softc *sc)
+ucc_attach_wskbd(struct ucc_softc *sc, void *cookie)
{
static const struct wskbd_accessops accessops = {
.enable = ucc_enable,
.keymap = &sc->sc_keymap,
.accessops = &accessops,
.accesscookie = sc,
+ .audiocookie = cookie,
};
sc->sc_keydesc[0].name = KB_US;
-/* $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 $ */
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;
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"));
-/* $OpenBSD: usbdi.h,v 1.71 2021/02/01 09:21:51 mglocker Exp $ */
+/* $OpenBSD: usbdi.h,v 1.72 2022/02/16 06:23:42 anton Exp $ */
/* $NetBSD: usbdi.h,v 1.62 2002/07/11 21:14:35 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usbdi.h,v 1.18 1999/11/17 22:33:49 n_hibma Exp $ */
int usegeneric;
struct usbd_interface **ifaces;/* all interfaces */
int nifaces; /* number of interfaces */
+ void *cookie;
};
/* Match codes. */
-/* $OpenBSD: wskbd.c,v 1.110 2021/12/30 06:55:11 anton Exp $ */
+/* $OpenBSD: wskbd.c,v 1.111 2022/02/16 06:23:42 anton Exp $ */
/* $NetBSD: wskbd.c,v 1.80 2005/05/04 01:52:16 augustss Exp $ */
/*
int sc_refcnt;
u_char sc_dying; /* device is being detached */
+
+#if NAUDIO > 0
+ void *sc_audiocookie;
+#endif
};
#define MOD_SHIFT_L (1 << 0)
void wskbd_update_layout(struct wskbd_internal *, kbd_t);
#if NAUDIO > 0
-extern int wskbd_set_mixervolume(long, long);
+extern int wskbd_set_mixervolume_dev(void *, long, long);
#endif
void
timeout_set(&sc->sc_repeat_ch, wskbd_repeat, sc);
#endif
+#if NAUDIO > 0
+ sc->sc_audiocookie = ap->audiocookie;
+#endif
+
sc->id->t_sc = sc;
sc->sc_accessops = ap->accessops;
switch (ksym) {
#if NAUDIO > 0
case KS_AudioMute:
- wskbd_set_mixervolume(0, 1);
+ wskbd_set_mixervolume_dev(sc->sc_audiocookie, 0, 1);
return (0);
case KS_AudioLower:
- wskbd_set_mixervolume(-1, 1);
+ wskbd_set_mixervolume_dev(sc->sc_audiocookie, -1, 1);
return (0);
case KS_AudioRaise:
- wskbd_set_mixervolume(1, 1);
+ wskbd_set_mixervolume_dev(sc->sc_audiocookie, 1, 1);
return (0);
#endif
default:
-/* $OpenBSD: wskbdvar.h,v 1.3 2017/05/12 09:16:55 mpi Exp $ */
+/* $OpenBSD: wskbdvar.h,v 1.4 2022/02/16 06:23:42 anton Exp $ */
/* $NetBSD: wskbdvar.h,v 1.8 1999/12/01 23:22:59 augustss Exp $ */
/*
const struct wskbd_accessops *accessops; /* access ops */
void *accesscookie; /* access cookie */
+
+ void *audiocookie;
};
#define WSKBDDEVCF_CONSOLE 0