From 76ba572aab2d004e2b7f1599c7af30846e313dcd Mon Sep 17 00:00:00 2001 From: netchild Date: Sun, 18 Sep 2005 15:13:06 +0000 Subject: Merge NetBSD fixes (except for 1.97 there should be no functional change): 1.94: ansify and KNF (NetBSD KNF). 1.95: Fix DPRINTF (bug from change in 1.94). 1.96: NetBSD specific. 1.97: Fix memory leak reported by Ted Unangst as bug #3 on tech-kern. Obtained from: NetBSD --- sys/dev/sound/usb/uaudio.c | 422 +++++++++++++++++++++++++-------------------- 1 file changed, 237 insertions(+), 185 deletions(-) diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c index e12ce71..cc39334 100644 --- a/sys/dev/sound/usb/uaudio.c +++ b/sys/dev/sound/usb/uaudio.c @@ -49,6 +49,14 @@ __KERNEL_RCSID(0, "$NetBSD: uaudio.c,v 1.91 2004/11/05 17:46:14 kent Exp $"); #endif +/* + * Also merged: + * $NetBSD: uaudio.c,v 1.94 2005/01/15 15:19:53 kent Exp $ + * $NetBSD: uaudio.c,v 1.95 2005/01/16 06:02:19 dsainty Exp $ + * $NetBSD: uaudio.c,v 1.96 2005/01/16 12:46:00 kent Exp $ + * $NetBSD: uaudio.c,v 1.97 2005/02/24 08:19:38 martin Exp $ + */ + #include #include #include @@ -129,10 +137,10 @@ SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, debug, CTLFLAG_RW, #define MIX_MAX_CHAN 8 struct mixerctl { - u_int16_t wValue[MIX_MAX_CHAN]; /* using nchan */ - u_int16_t wIndex; - u_int8_t nchan; - u_int8_t type; + uint16_t wValue[MIX_MAX_CHAN]; /* using nchan */ + uint16_t wIndex; + uint8_t nchan; + uint8_t type; #define MIX_ON_OFF 1 #define MIX_SIGNED_16 2 #define MIX_UNSIGNED_16 3 @@ -146,9 +154,9 @@ struct mixerctl { #if defined(__FreeBSD__) /* XXXXX */ unsigned ctl; #define MAX_SELECTOR_INPUT_PIN 256 - u_int8_t slctrtype[MAX_SELECTOR_INPUT_PIN]; + uint8_t slctrtype[MAX_SELECTOR_INPUT_PIN]; #endif - u_int8_t class; + uint8_t class; #if !defined(__FreeBSD__) char ctlname[MAX_AUDIO_DEV_LEN]; char *ctlunit; @@ -157,9 +165,9 @@ struct mixerctl { #define MAKE(h,l) (((h) << 8) | (l)) struct as_info { - u_int8_t alt; - u_int8_t encoding; - u_int8_t attributes; /* Copy of bmAttributes of + uint8_t alt; + uint8_t encoding; + uint8_t attributes; /* Copy of bmAttributes of * usb_audio_streaming_endpoint_descriptor */ usbd_interface_handle ifaceh; @@ -489,7 +497,7 @@ USB_MATCH(uaudio) usb_interface_descriptor_t *id; if (uaa->iface == NULL) - return (UMATCH_NONE); + return UMATCH_NONE; id = usbd_get_interface_descriptor(uaa->iface); /* Trigger on the control interface. */ @@ -497,9 +505,9 @@ USB_MATCH(uaudio) id->bInterfaceClass != UICLASS_AUDIO || id->bInterfaceSubClass != UISUBCLASS_AUDIOCONTROL || (usbd_get_quirks(uaa->device)->uq_flags & UQ_BAD_AUDIO)) - return (UMATCH_NONE); + return UMATCH_NONE; - return (UMATCH_IFACECLASS_IFACESUBCLASS); + return UMATCH_IFACECLASS_IFACESUBCLASS; } USB_ATTACH(uaudio) @@ -516,9 +524,6 @@ USB_ATTACH(uaudio) USB_ATTACH_SETUP; #else usbd_devinfo(uaa->device, 0, devinfo, sizeof(devinfo)); -#endif - -#if !defined(__FreeBSD__) printf(": %s\n", devinfo); #endif @@ -607,13 +612,14 @@ USB_ATTACH(uaudio) int uaudio_activate(device_ptr_t self, enum devact act) { - struct uaudio_softc *sc = (struct uaudio_softc *)self; - int rv = 0; + struct uaudio_softc *sc; + int rv; + sc = (struct uaudio_softc *)self; + rv = 0; switch (act) { case DVACT_ACTIVATE: - return (EOPNOTSUPP); - break; + return EOPNOTSUPP; case DVACT_DEACTIVATE: if (sc->sc_audiodev != NULL) @@ -621,7 +627,7 @@ uaudio_activate(device_ptr_t self, enum devact act) sc->sc_dying = 1; break; } - return (rv); + return rv; } #endif @@ -629,9 +635,11 @@ uaudio_activate(device_ptr_t self, enum devact act) int uaudio_detach(device_ptr_t self, int flags) { - struct uaudio_softc *sc = (struct uaudio_softc *)self; - int rv = 0; + struct uaudio_softc *sc; + int rv; + sc = (struct uaudio_softc *)self; + rv = 0; /* Wait for outstanding requests to complete. */ usbd_delay_ms(sc->sc_udev, UAUDIO_NCHANBUFS * UAUDIO_NFRAMES); @@ -641,7 +649,7 @@ uaudio_detach(device_ptr_t self, int flags) usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, USBDEV(sc->sc_dev)); - return (rv); + return rv; } #elif defined(__FreeBSD__) @@ -668,15 +676,17 @@ USB_DETACH(uaudio) Static int uaudio_query_encoding(void *addr, struct audio_encoding *fp) { - struct uaudio_softc *sc = addr; - int flags = sc->sc_altflags; + struct uaudio_softc *sc; + int flags; int idx; + sc = addr; + flags = sc->sc_altflags; if (sc->sc_dying) - return (EIO); + return EIO; if (sc->sc_nalts == 0 || flags == 0) - return (ENXIO); + return ENXIO; idx = fp->index; switch (idx) { @@ -745,9 +755,9 @@ uaudio_find_iface(const char *buf, int size, int *offsp, int subtype) if (d->bDescriptorType == UDESC_INTERFACE && d->bInterfaceClass == UICLASS_AUDIO && d->bInterfaceSubClass == subtype) - return (d); + return d; } - return (NULL); + return NULL; } Static void @@ -839,8 +849,9 @@ Static char * uaudio_id_name(struct uaudio_softc *sc, const struct io_terminal *iot, int id) { static char buf[32]; + snprintf(buf, sizeof(buf), "i%d", id); - return (buf); + return buf; } #endif @@ -887,14 +898,14 @@ uaudio_get_cluster(int id, const struct io_terminal *iot) r.bNrChannels = iot[id].d.it->bNrChannels; USETW(r.wChannelConfig, UGETW(iot[id].d.it->wChannelConfig)); r.iChannelNames = iot[id].d.it->iChannelNames; - return (r); + return r; case UDESCSUB_AC_OUTPUT: id = iot[id].d.ot->bSourceId; break; case UDESCSUB_AC_MIXER: r = *(const struct usb_audio_cluster *) &iot[id].d.mu->baSourceId[iot[id].d.mu->bNrInPins]; - return (r); + return r; case UDESCSUB_AC_SELECTOR: /* XXX This is not really right */ id = iot[id].d.su->baSourceId[0]; @@ -905,11 +916,11 @@ uaudio_get_cluster(int id, const struct io_terminal *iot) case UDESCSUB_AC_PROCESSING: r = *(const struct usb_audio_cluster *) &iot[id].d.pu->baSourceId[iot[id].d.pu->bNrInPins]; - return (r); + return r; case UDESCSUB_AC_EXTENSION: r = *(const struct usb_audio_cluster *) &iot[id].d.eu->baSourceId[iot[id].d.eu->bNrInPins]; - return (r); + return r; default: goto bad; } @@ -917,7 +928,7 @@ uaudio_get_cluster(int id, const struct io_terminal *iot) bad: printf("uaudio_get_cluster: bad data\n"); memset(&r, 0, sizeof r); - return (r); + return r; } @@ -940,8 +951,9 @@ Static void uaudio_add_output(struct uaudio_softc *sc, const struct io_terminal *iot, int id) { #ifdef USB_DEBUG - const struct usb_audio_output_terminal *d = iot[id].d.ot; + const struct usb_audio_output_terminal *d; + d = iot[id].d.ot; DPRINTFN(2,("uaudio_add_output: bTerminalId=%d wTerminalType=0x%04x " "bAssocTerminal=%d bSourceId=%d iTerminal=%d\n", d->bTerminalId, UGETW(d->wTerminalType), d->bAssocTerminal, @@ -1021,7 +1033,7 @@ uaudio_add_mixer(struct uaudio_softc *sc, const struct io_terminal *iot, int id) Static void uaudio_add_selector(struct uaudio_softc *sc, const struct io_terminal *iot, int id) { - const struct usb_audio_selector_unit *d = iot[id].d.su; + const struct usb_audio_selector_unit *d; struct mixerctl mix; #if !defined(__FreeBSD__) int i, wp; @@ -1030,6 +1042,7 @@ uaudio_add_selector(struct uaudio_softc *sc, const struct io_terminal *iot, int struct mixerctl dummy; #endif + d = iot[id].d.su; DPRINTFN(2,("uaudio_add_selector: bUnitId=%d bNrInPins=%d\n", d->bUnitId, d->bNrInPins)); mix.wIndex = MAKE(d->bUnitId, sc->sc_ac_iface); @@ -1399,10 +1412,10 @@ uaudio_feature_name(const struct io_terminal *iot, struct mixerctl *mix) Static void uaudio_add_feature(struct uaudio_softc *sc, const struct io_terminal *iot, int id) { - const struct usb_audio_feature_unit *d = iot[id].d.fu; - uByte *ctls = d->bmaControls; - int ctlsize = d->bControlSize; - int nchan = (d->bLength - 7) / ctlsize; + const struct usb_audio_feature_unit *d; + const uByte *ctls; + int ctlsize; + int nchan; u_int fumask, mmask, cmask; struct mixerctl mix; int chan, ctl, i, unit; @@ -1414,7 +1427,10 @@ uaudio_add_feature(struct uaudio_softc *sc, const struct io_terminal *iot, int i #define GET(i) (ctls[(i)*ctlsize] | \ (ctlsize > 1 ? ctls[(i)*ctlsize+1] << 8 : 0)) - + d = iot[id].d.fu; + ctls = d->bmaControls; + ctlsize = d->bControlSize; + nchan = (d->bLength - 7) / ctlsize; mmask = GET(0); /* Figure out what we can control */ for (cmask = 0, chan = 1; chan < nchan; chan++) { @@ -1560,15 +1576,17 @@ Static void uaudio_add_processing_updown(struct uaudio_softc *sc, const struct io_terminal *iot, int id) { - const struct usb_audio_processing_unit *d = iot[id].d.pu; - const struct usb_audio_processing_unit_1 *d1 = - (const struct usb_audio_processing_unit_1 *)&d->baSourceId[d->bNrInPins]; - const struct usb_audio_processing_unit_updown *ud = - (const struct usb_audio_processing_unit_updown *) - &d1->bmControls[d1->bControlSize]; + const struct usb_audio_processing_unit *d; + const struct usb_audio_processing_unit_1 *d1; + const struct usb_audio_processing_unit_updown *ud; struct mixerctl mix; int i; + d = iot[id].d.pu; + d1 = (const struct usb_audio_processing_unit_1 *) + &d->baSourceId[d->bNrInPins]; + ud = (const struct usb_audio_processing_unit_updown *) + &d1->bmControls[d1->bControlSize]; DPRINTFN(2,("uaudio_add_processing_updown: bUnitId=%d bNrModes=%d\n", d->bUnitId, ud->bNrModes)); @@ -1598,12 +1616,15 @@ uaudio_add_processing_updown(struct uaudio_softc *sc, Static void uaudio_add_processing(struct uaudio_softc *sc, const struct io_terminal *iot, int id) { - const struct usb_audio_processing_unit *d = iot[id].d.pu; - const struct usb_audio_processing_unit_1 *d1 = - (const struct usb_audio_processing_unit_1 *)&d->baSourceId[d->bNrInPins]; - int ptype = UGETW(d->wProcessType); + const struct usb_audio_processing_unit *d; + const struct usb_audio_processing_unit_1 *d1; + int ptype; struct mixerctl mix; + d = iot[id].d.pu; + d1 = (const struct usb_audio_processing_unit_1 *) + &d->baSourceId[d->bNrInPins]; + ptype = UGETW(d->wProcessType); DPRINTFN(2,("uaudio_add_processing: wProcessType=%d bUnitId=%d " "bNrInPins=%d\n", ptype, d->bUnitId, d->bNrInPins)); @@ -1642,11 +1663,13 @@ uaudio_add_processing(struct uaudio_softc *sc, const struct io_terminal *iot, in Static void uaudio_add_extension(struct uaudio_softc *sc, const struct io_terminal *iot, int id) { - const struct usb_audio_extension_unit *d = iot[id].d.eu; - const struct usb_audio_extension_unit_1 *d1 = - (const struct usb_audio_extension_unit_1 *)&d->baSourceId[d->bNrInPins]; + const struct usb_audio_extension_unit *d; + const struct usb_audio_extension_unit_1 *d1; struct mixerctl mix; + d = iot[id].d.eu; + d1 = (const struct usb_audio_extension_unit_1 *) + &d->baSourceId[d->bNrInPins]; DPRINTFN(2,("uaudio_add_extension: bUnitId=%d bNrInPins=%d\n", d->bUnitId, d->bNrInPins)); @@ -1861,8 +1884,8 @@ uaudio_identify(struct uaudio_softc *sc, const usb_config_descriptor_t *cdesc) err = uaudio_identify_ac(sc, cdesc); if (err) - return (err); - return (uaudio_identify_as(sc, cdesc)); + return err; + return uaudio_identify_as(sc, cdesc); } Static void @@ -1907,30 +1930,30 @@ uaudio_process_as(struct uaudio_softc *sc, const char *buf, int *offsp, if (asid->bDescriptorType != UDESC_CS_INTERFACE || asid->bDescriptorSubtype != AS_GENERAL) - return (USBD_INVAL); + return USBD_INVAL; DPRINTF(("uaudio_process_as: asid: bTerminakLink=%d wFormatTag=%d\n", asid->bTerminalLink, UGETW(asid->wFormatTag))); offs += asid->bLength; if (offs > size) - return (USBD_INVAL); + return USBD_INVAL; asf1d = (const void *)(buf + offs); if (asf1d->bDescriptorType != UDESC_CS_INTERFACE || asf1d->bDescriptorSubtype != FORMAT_TYPE) - return (USBD_INVAL); + return USBD_INVAL; offs += asf1d->bLength; if (offs > size) - return (USBD_INVAL); + return USBD_INVAL; if (asf1d->bFormatType != FORMAT_TYPE_I) { printf("%s: ignored setting with type %d format\n", USBDEVNAME(sc->sc_dev), UGETW(asid->wFormatTag)); - return (USBD_NORMAL_COMPLETION); + return USBD_NORMAL_COMPLETION; } ed = (const void *)(buf + offs); if (ed->bDescriptorType != UDESC_ENDPOINT) - return (USBD_INVAL); + return USBD_INVAL; DPRINTF(("uaudio_process_as: endpoint[0] bLength=%d bDescriptorType=%d " "bEndpointAddress=%d bmAttributes=0x%x wMaxPacketSize=%d " "bInterval=%d bRefresh=%d bSynchAddress=%d\n", @@ -1939,9 +1962,9 @@ uaudio_process_as(struct uaudio_softc *sc, const char *buf, int *offsp, ed->bInterval, ed->bRefresh, ed->bSynchAddress)); offs += ed->bLength; if (offs > size) - return (USBD_INVAL); + return USBD_INVAL; if (UE_GET_XFERTYPE(ed->bmAttributes) != UE_ISOCHRONOUS) - return (USBD_INVAL); + return USBD_INVAL; dir = UE_GET_DIR(ed->bEndpointAddress); type = UE_GET_ISO_TYPE(ed->bmAttributes); @@ -1956,7 +1979,7 @@ uaudio_process_as(struct uaudio_softc *sc, const char *buf, int *offsp, #ifndef UAUDIO_MULTIPLE_ENDPOINTS printf("%s: ignored input endpoint of type adaptive\n", USBDEVNAME(sc->sc_dev)); - return (USBD_NORMAL_COMPLETION); + return USBD_NORMAL_COMPLETION; #endif } if (dir != UE_DIR_IN && type == UE_ISO_ASYNC) { @@ -1964,18 +1987,18 @@ uaudio_process_as(struct uaudio_softc *sc, const char *buf, int *offsp, #ifndef UAUDIO_MULTIPLE_ENDPOINTS printf("%s: ignored output endpoint of type async\n", USBDEVNAME(sc->sc_dev)); - return (USBD_NORMAL_COMPLETION); + return USBD_NORMAL_COMPLETION; #endif } sed = (const void *)(buf + offs); if (sed->bDescriptorType != UDESC_CS_ENDPOINT || sed->bDescriptorSubtype != AS_GENERAL) - return (USBD_INVAL); + return USBD_INVAL; DPRINTF((" streadming_endpoint: offset=%d bLength=%d\n", offs, sed->bLength)); offs += sed->bLength; if (offs > size) - return (USBD_INVAL); + return USBD_INVAL; if (sync && id->bNumEndpoints <= 1) { printf("%s: a sync-pipe endpoint but no other endpoint\n", @@ -2030,7 +2053,7 @@ uaudio_process_as(struct uaudio_softc *sc, const char *buf, int *offsp, if (prec != 8 && prec != 16 && prec != 24) { printf("%s: ignored setting with precision %d\n", USBDEVNAME(sc->sc_dev), prec); - return (USBD_NORMAL_COMPLETION); + return USBD_NORMAL_COMPLETION; } switch (format) { case UA_FMT_PCM: @@ -2063,7 +2086,7 @@ uaudio_process_as(struct uaudio_softc *sc, const char *buf, int *offsp, default: printf("%s: ignored setting with format %d\n", USBDEVNAME(sc->sc_dev), format); - return (USBD_NORMAL_COMPLETION); + return USBD_NORMAL_COMPLETION; } #ifdef USB_DEBUG printf("%s: %s: %dch, %d/%dbit, %s,", USBDEVNAME(sc->sc_dev), @@ -2118,7 +2141,7 @@ uaudio_process_as(struct uaudio_softc *sc, const char *buf, int *offsp, #endif sc->sc_mode |= (dir == UE_DIR_OUT) ? AUMODE_PLAY : AUMODE_RECORD; - return (USBD_NORMAL_COMPLETION); + return USBD_NORMAL_COMPLETION; } #undef offs @@ -2137,7 +2160,7 @@ uaudio_identify_as(struct uaudio_softc *sc, offs = 0; id = uaudio_find_iface(buf, size, &offs, UISUBCLASS_AUDIOSTREAM); if (id == NULL) - return (USBD_INVAL); + return USBD_INVAL; #if defined(__FreeBSD__) sc->uaudio_sndstat_flag = 0; @@ -2174,16 +2197,16 @@ uaudio_identify_as(struct uaudio_softc *sc, sbuf_finish(&(sc->uaudio_sndstat)); #endif if (offs > size) - return (USBD_INVAL); + return USBD_INVAL; DPRINTF(("uaudio_identify_as: %d alts available\n", sc->sc_nalts)); if (sc->sc_mode == 0) { printf("%s: no usable endpoint found\n", USBDEVNAME(sc->sc_dev)); - return (USBD_INVAL); + return USBD_INVAL; } - return (USBD_NORMAL_COMPLETION); + return USBD_NORMAL_COMPLETION; } Static usbd_status @@ -2205,9 +2228,9 @@ uaudio_identify_ac(struct uaudio_softc *sc, const usb_config_descriptor_t *cdesc offs = 0; id = uaudio_find_iface(buf, size, &offs, UISUBCLASS_AUDIOCONTROL); if (id == NULL) - return (USBD_INVAL); + return USBD_INVAL; if (offs + sizeof *acdp > size) - return (USBD_INVAL); + return USBD_INVAL; sc->sc_ac_iface = id->bInterfaceNumber; DPRINTFN(2,("uaudio_identify_ac: AC interface is %d\n", sc->sc_ac_iface)); @@ -2216,14 +2239,14 @@ uaudio_identify_ac(struct uaudio_softc *sc, const usb_config_descriptor_t *cdesc acdp = (const struct usb_audio_control_descriptor *)ibuf; if (acdp->bDescriptorType != UDESC_CS_INTERFACE || acdp->bDescriptorSubtype != UDESCSUB_AC_HEADER) - return (USBD_INVAL); + return USBD_INVAL; aclen = UGETW(acdp->wTotalLength); if (offs + aclen > size) - return (USBD_INVAL); + return USBD_INVAL; if (!(usbd_get_quirks(sc->sc_udev)->uq_flags & UQ_BAD_ADC) && UGETW(acdp->bcdADC) != UAUDIO_VERSION) - return (USBD_INVAL); + return USBD_INVAL; sc->sc_audio_rev = UGETW(acdp->bcdADC); DPRINTFN(2,("uaudio_identify_ac: found AC header, vers=%03x, len=%d\n", @@ -2245,8 +2268,10 @@ uaudio_identify_ac(struct uaudio_softc *sc, const usb_config_descriptor_t *cdesc if (ibuf >= ibufend) break; dp = (const usb_descriptor_t *)ibuf; - if (ibuf + dp->bLength > ibufend) - return (USBD_INVAL); + if (ibuf + dp->bLength > ibufend) { + free(iot, M_TEMP); + return USBD_INVAL; + } if (dp->bDescriptorType != UDESC_CS_INTERFACE) { printf("uaudio_identify_ac: skip desc type=0x%02x\n", dp->bDescriptorType); @@ -2409,20 +2434,21 @@ uaudio_identify_ac(struct uaudio_softc *sc, const usb_config_descriptor_t *cdesc } free(iot, M_TEMP); - return (USBD_NORMAL_COMPLETION); + return USBD_NORMAL_COMPLETION; } #if defined(__NetBSD__) || defined(__OpenBSD__) Static int uaudio_query_devinfo(void *addr, mixer_devinfo_t *mi) { - struct uaudio_softc *sc = addr; + struct uaudio_softc *sc; struct mixerctl *mc; int n, nctls, i; + sc = addr; DPRINTFN(2,("uaudio_query_devinfo: index=%d\n", mi->index)); if (sc->sc_dying) - return (EIO); + return EIO; n = mi->index; nctls = sc->sc_nctls; @@ -2433,20 +2459,20 @@ uaudio_query_devinfo(void *addr, mixer_devinfo_t *mi) mi->mixer_class = UAC_OUTPUT; mi->next = mi->prev = AUDIO_MIXER_LAST; strlcpy(mi->label.name, AudioCoutputs, sizeof(mi->label.name)); - return (0); + return 0; case UAC_INPUT: mi->type = AUDIO_MIXER_CLASS; mi->mixer_class = UAC_INPUT; mi->next = mi->prev = AUDIO_MIXER_LAST; strlcpy(mi->label.name, AudioCinputs, sizeof(mi->label.name)); - return (0); + return 0; case UAC_EQUAL: mi->type = AUDIO_MIXER_CLASS; mi->mixer_class = UAC_EQUAL; mi->next = mi->prev = AUDIO_MIXER_LAST; strlcpy(mi->label.name, AudioCequalization, sizeof(mi->label.name)); - return (0); + return 0; case UAC_RECORD: mi->type = AUDIO_MIXER_CLASS; mi->mixer_class = UAC_RECORD; @@ -2459,7 +2485,7 @@ uaudio_query_devinfo(void *addr, mixer_devinfo_t *mi) n -= UAC_NCLASSES; if (n < 0 || n >= nctls) - return (ENXIO); + return ENXIO; mc = &sc->sc_ctls[n]; strlcpy(mi->label.name, mc->ctlname, sizeof(mi->label.name)); @@ -2493,24 +2519,25 @@ uaudio_query_devinfo(void *addr, mixer_devinfo_t *mi) mi->un.v.delta = mc->delta; break; } - return (0); + return 0; } Static int uaudio_open(void *addr, int flags) { - struct uaudio_softc *sc = addr; + struct uaudio_softc *sc; + sc = addr; DPRINTF(("uaudio_open: sc=%p\n", sc)); if (sc->sc_dying) - return (EIO); + return EIO; if ((flags & FWRITE) && !(sc->sc_mode & AUMODE_PLAY)) - return (EACCES); + return EACCES; if ((flags & FREAD) && !(sc->sc_mode & AUMODE_RECORD)) - return (EACCES); + return EACCES; - return (0); + return 0; } /* @@ -2524,20 +2551,22 @@ uaudio_close(void *addr) Static int uaudio_drain(void *addr) { - struct uaudio_softc *sc = addr; + struct uaudio_softc *sc; + sc = addr; usbd_delay_ms(sc->sc_udev, UAUDIO_NCHANBUFS * UAUDIO_NFRAMES); - return (0); + return 0; } Static int uaudio_halt_out_dma(void *addr) { - struct uaudio_softc *sc = addr; + struct uaudio_softc *sc; + sc = addr; if (sc->sc_dying) - return (EIO); + return EIO; DPRINTF(("uaudio_halt_out_dma: enter\n")); if (sc->sc_playchan.pipe != NULL) { @@ -2546,35 +2575,37 @@ uaudio_halt_out_dma(void *addr) uaudio_chan_free_buffers(sc, &sc->sc_playchan); sc->sc_playchan.intr = NULL; } - return (0); + return 0; } Static int uaudio_halt_in_dma(void *addr) { - struct uaudio_softc *sc = addr; + struct uaudio_softc *sc; DPRINTF(("uaudio_halt_in_dma: enter\n")); + sc = addr; if (sc->sc_recchan.pipe != NULL) { uaudio_chan_close(sc, &sc->sc_recchan); sc->sc_recchan.pipe = NULL; uaudio_chan_free_buffers(sc, &sc->sc_recchan); sc->sc_recchan.intr = NULL; } - return (0); + return 0; } Static int uaudio_getdev(void *addr, struct audio_device *retp) { - struct uaudio_softc *sc = addr; + struct uaudio_softc *sc; DPRINTF(("uaudio_mixer_getdev:\n")); + sc = addr; if (sc->sc_dying) - return (EIO); + return EIO; *retp = uaudio_device; - return (0); + return 0; } /* @@ -2583,26 +2614,36 @@ uaudio_getdev(void *addr, struct audio_device *retp) Static int uaudio_round_blocksize(void *addr, int blk) { - struct uaudio_softc *sc = addr; - int bpf; - - DPRINTF(("uaudio_round_blocksize: p.bpf=%d r.bpf=%d\n", - sc->sc_playchan.bytes_per_frame, - sc->sc_recchan.bytes_per_frame)); - if (sc->sc_playchan.bytes_per_frame > sc->sc_recchan.bytes_per_frame) { - bpf = sc->sc_playchan.bytes_per_frame - + sc->sc_playchan.sample_size; + struct uaudio_softc *sc; + int b; + + sc = addr; + DPRINTF(("uaudio_round_blocksize: blk=%d mode=%s\n", blk, + mode == AUMODE_PLAY ? "AUMODE_PLAY" : "AUMODE_RECORD")); + + /* chan.bytes_per_frame can be 0. */ + if (mode == AUMODE_PLAY || sc->sc_recchan.bytes_per_frame <= 0) { + b = param->sample_rate * UAUDIO_NFRAMES * UAUDIO_NCHANBUFS; + + /* + * This does not make accurate value in the case + * of b % USB_FRAMES_PER_SECOND != 0 + */ + b /= USB_FRAMES_PER_SECOND; + + b *= param->precision / 8 * param->channels; } else { - bpf = sc->sc_recchan.bytes_per_frame - + sc->sc_recchan.sample_size; + /* + * use wMaxPacketSize in bytes_per_frame. + * See uaudio_set_params() and uaudio_chan_init() + */ + b = sc->sc_recchan.bytes_per_frame + * UAUDIO_NFRAMES * UAUDIO_NCHANBUFS; } - /* XXX */ - bpf *= UAUDIO_NFRAMES * UAUDIO_NCHANBUFS; - - bpf = (bpf + 15) &~ 15; - if (blk < bpf) - blk = bpf; + if (b <= 0) + b = 1; + blk = blk <= b ? b : blk / b * b; #ifdef DIAGNOSTIC if (blk <= 0) { @@ -2611,14 +2652,14 @@ uaudio_round_blocksize(void *addr, int blk) } #endif - DPRINTFN(1,("uaudio_round_blocksize: blk=%d\n", blk)); - return (blk); + DPRINTF(("uaudio_round_blocksize: resultant blk=%d\n", blk)); + return blk; } Static int uaudio_get_props(void *addr) { - return (AUDIO_PROP_FULLDUPLEX | AUDIO_PROP_INDEPENDENT); + return AUDIO_PROP_FULLDUPLEX | AUDIO_PROP_INDEPENDENT; } #endif /* NetBSD or OpenBSD */ @@ -2628,17 +2669,17 @@ uaudio_get(struct uaudio_softc *sc, int which, int type, int wValue, int wIndex, int len) { usb_device_request_t req; - u_int8_t data[4]; + uint8_t data[4]; usbd_status err; int val; #if defined(__FreeBSD__) if (sc->sc_dying) - return (EIO); + return EIO; #endif if (wValue == -1) - return (0); + return 0; req.bmRequestType = type; req.bRequest = which; @@ -2651,7 +2692,7 @@ uaudio_get(struct uaudio_softc *sc, int which, int type, int wValue, err = usbd_do_request(sc->sc_udev, &req, data); if (err) { DPRINTF(("uaudio_get: err=%s\n", usbd_errstr(err))); - return (-1); + return -1; } switch (len) { case 1: @@ -2662,10 +2703,10 @@ uaudio_get(struct uaudio_softc *sc, int which, int type, int wValue, break; default: DPRINTF(("uaudio_get: bad length=%d\n", len)); - return (-1); + return -1; } DPRINTFN(2,("uaudio_get: val=%d\n", val)); - return (val); + return val; } Static void @@ -2673,7 +2714,7 @@ uaudio_set(struct uaudio_softc *sc, int which, int type, int wValue, int wIndex, int len, int val) { usb_device_request_t req; - u_int8_t data[4]; + uint8_t data[4]; usbd_status err; #if defined(__FreeBSD__) @@ -2719,7 +2760,7 @@ uaudio_signext(int type, int val) else val = (int8_t)val; } - return (val); + return val; } #if defined(__NetBSD__) || defined(__OpenBSD__) @@ -2737,7 +2778,7 @@ uaudio_value2bsd(struct mixerctl *mc, int val) val = ((uaudio_signext(mc->type, val) - mc->minval) * 255 + mc->mul/2) / mc->mul; DPRINTFN(5, ("val'=%d\n", val)); - return (val); + return val; } #endif @@ -2754,7 +2795,7 @@ uaudio_bsd2value(struct mixerctl *mc, int val) } else val = (val + mc->delta/2) * mc->mul / 255 + mc->minval; DPRINTFN(5, ("val'=%d\n", val)); - return (val); + return val; } #if defined(__NetBSD__) || defined(__OpenBSD__) @@ -2767,7 +2808,7 @@ uaudio_ctl_get(struct uaudio_softc *sc, int which, struct mixerctl *mc, DPRINTFN(5,("uaudio_ctl_get: which=%d chan=%d\n", which, chan)); val = uaudio_get(sc, which, UT_READ_CLASS_INTERFACE, mc->wValue[chan], mc->wIndex, MIX_SIZE(mc->type)); - return (uaudio_value2bsd(mc, val)); + return uaudio_value2bsd(mc, val); } #endif @@ -2784,34 +2825,34 @@ uaudio_ctl_set(struct uaudio_softc *sc, int which, struct mixerctl *mc, Static int uaudio_mixer_get_port(void *addr, mixer_ctrl_t *cp) { - struct uaudio_softc *sc = addr; + struct uaudio_softc *sc; struct mixerctl *mc; int i, n, vals[MIX_MAX_CHAN], val; DPRINTFN(2,("uaudio_mixer_get_port: index=%d\n", cp->dev)); - + sc = addr; if (sc->sc_dying) - return (EIO); + return EIO; n = cp->dev - UAC_NCLASSES; if (n < 0 || n >= sc->sc_nctls) - return (ENXIO); + return ENXIO; mc = &sc->sc_ctls[n]; if (mc->type == MIX_ON_OFF) { if (cp->type != AUDIO_MIXER_ENUM) - return (EINVAL); + return EINVAL; cp->un.ord = uaudio_ctl_get(sc, GET_CUR, mc, 0); } else if (mc->type == MIX_SELECTOR) { if (cp->type != AUDIO_MIXER_ENUM) - return (EINVAL); + return EINVAL; cp->un.ord = uaudio_ctl_get(sc, GET_CUR, mc, 0); } else { if (cp->type != AUDIO_MIXER_VALUE) return (EINVAL); if (cp->un.value.num_channels != 1 && cp->un.value.num_channels != mc->nchan) - return (EINVAL); + return EINVAL; for (i = 0; i < mc->nchan; i++) vals[i] = uaudio_ctl_get(sc, GET_CUR, mc, i); if (cp->un.value.num_channels == 1 && mc->nchan != 1) { @@ -2823,36 +2864,37 @@ uaudio_mixer_get_port(void *addr, mixer_ctrl_t *cp) cp->un.value.level[i] = vals[i]; } - return (0); + return 0; } Static int uaudio_mixer_set_port(void *addr, mixer_ctrl_t *cp) { - struct uaudio_softc *sc = addr; + struct uaudio_softc *sc; struct mixerctl *mc; int i, n, vals[MIX_MAX_CHAN]; DPRINTFN(2,("uaudio_mixer_set_port: index = %d\n", cp->dev)); + sc = addr; if (sc->sc_dying) - return (EIO); + return EIO; n = cp->dev - UAC_NCLASSES; if (n < 0 || n >= sc->sc_nctls) - return (ENXIO); + return ENXIO; mc = &sc->sc_ctls[n]; if (mc->type == MIX_ON_OFF) { if (cp->type != AUDIO_MIXER_ENUM) - return (EINVAL); + return EINVAL; uaudio_ctl_set(sc, SET_CUR, mc, 0, cp->un.ord); } else if (mc->type == MIX_SELECTOR) { if (cp->type != AUDIO_MIXER_ENUM) - return (EINVAL); + return EINVAL; uaudio_ctl_set(sc, SET_CUR, mc, 0, cp->un.ord); } else { if (cp->type != AUDIO_MIXER_VALUE) - return (EINVAL); + return EINVAL; if (cp->un.value.num_channels == 1) for (i = 0; i < mc->nchan; i++) vals[i] = cp->un.value.level[0]; @@ -2860,11 +2902,11 @@ uaudio_mixer_set_port(void *addr, mixer_ctrl_t *cp) for (i = 0; i < mc->nchan; i++) vals[i] = cp->un.value.level[i]; else - return (EINVAL); + return EINVAL; for (i = 0; i < mc->nchan; i++) uaudio_ctl_set(sc, SET_CUR, mc, i, vals[i]); } - return (0); + return 0; } Static int @@ -2872,17 +2914,18 @@ uaudio_trigger_input(void *addr, void *start, void *end, int blksize, void (*intr)(void *), void *arg, struct audio_params *param) { - struct uaudio_softc *sc = addr; - struct chan *ch = &sc->sc_recchan; + struct uaudio_softc *sc; + struct chan *ch; usbd_status err; int i, s; + sc = addr; if (sc->sc_dying) - return (EIO); + return EIO; DPRINTFN(3,("uaudio_trigger_input: sc=%p start=%p end=%p " "blksize=%d\n", sc, start, end, blksize)); - + ch = &sc->sc_recchan; uaudio_chan_set_param(ch, start, end, blksize); DPRINTFN(3,("uaudio_trigger_input: sample_size=%d bytes/frame=%d " "fraction=0.%03d\n", ch->sample_size, ch->bytes_per_frame, @@ -2890,12 +2933,12 @@ uaudio_trigger_input(void *addr, void *start, void *end, int blksize, err = uaudio_chan_alloc_buffers(sc, ch); if (err) - return (EIO); + return EIO; err = uaudio_chan_open(sc, ch); if (err) { uaudio_chan_free_buffers(sc, ch); - return (EIO); + return EIO; } ch->intr = intr; @@ -2906,7 +2949,7 @@ uaudio_trigger_input(void *addr, void *start, void *end, int blksize, uaudio_chan_rtransfer(ch); splx(s); - return (0); + return 0; } Static int @@ -2914,17 +2957,18 @@ uaudio_trigger_output(void *addr, void *start, void *end, int blksize, void (*intr)(void *), void *arg, struct audio_params *param) { - struct uaudio_softc *sc = addr; - struct chan *ch = &sc->sc_playchan; + struct uaudio_softc *sc; + struct chan *ch; usbd_status err; int i, s; + sc = addr; if (sc->sc_dying) - return (EIO); + return EIO; DPRINTFN(3,("uaudio_trigger_output: sc=%p start=%p end=%p " "blksize=%d\n", sc, start, end, blksize)); - + ch = &sc->sc_playchan; uaudio_chan_set_param(ch, start, end, blksize); DPRINTFN(3,("uaudio_trigger_output: sample_size=%d bytes/frame=%d " "fraction=0.%03d\n", ch->sample_size, ch->bytes_per_frame, @@ -2932,12 +2976,12 @@ uaudio_trigger_output(void *addr, void *start, void *end, int blksize, err = uaudio_chan_alloc_buffers(sc, ch); if (err) - return (EIO); + return EIO; err = uaudio_chan_open(sc, ch); if (err) { uaudio_chan_free_buffers(sc, ch); - return (EIO); + return EIO; } ch->intr = intr; @@ -2948,7 +2992,7 @@ uaudio_trigger_output(void *addr, void *start, void *end, int blksize, uaudio_chan_ptransfer(ch); splx(s); - return (0); + return 0; } #endif /* NetBSD or OpenBSD */ @@ -2956,22 +3000,24 @@ uaudio_trigger_output(void *addr, void *start, void *end, int blksize, Static usbd_status uaudio_chan_open(struct uaudio_softc *sc, struct chan *ch) { - struct as_info *as = &sc->sc_alts[ch->altidx]; - int endpt = as->edesc->bEndpointAddress; + struct as_info *as; + int endpt; usbd_status err; #if defined(__FreeBSD__) if (sc->sc_dying) - return (EIO); + return EIO; #endif + as = &sc->sc_alts[ch->altidx]; + endpt = as->edesc->bEndpointAddress; DPRINTF(("uaudio_chan_open: endpt=0x%02x, speed=%d, alt=%d\n", endpt, ch->sample_rate, as->alt)); /* Set alternate interface corresponding to the mode. */ err = usbd_set_interface(as->ifaceh, as->alt); if (err) - return (err); + return err; /* * If just one sampling rate is supported, @@ -3002,13 +3048,14 @@ uaudio_chan_open(struct uaudio_softc *sc, struct chan *ch) Static void uaudio_chan_close(struct uaudio_softc *sc, struct chan *ch) { - struct as_info *as = &sc->sc_alts[ch->altidx]; + struct as_info *as; #if defined(__FreeBSD__) if (sc->sc_dying) return ; #endif + as = &sc->sc_alts[ch->altidx]; as->sc_busy = 0; if (sc->sc_nullalt >= 0) { DPRINTF(("uaudio_chan_close: set null alt=%d\n", @@ -3047,13 +3094,13 @@ uaudio_chan_alloc_buffers(struct uaudio_softc *sc, struct chan *ch) ch->chanbufs[i].chan = ch; } - return (USBD_NORMAL_COMPLETION); + return USBD_NORMAL_COMPLETION; bad: while (--i >= 0) /* implicit buffer free */ usbd_free_xfer(ch->chanbufs[i].xfer); - return (USBD_NOMEM); + return USBD_NOMEM; } Static void @@ -3135,11 +3182,13 @@ Static void uaudio_chan_pintr(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) { - struct chanbuf *cb = priv; - struct chan *ch = cb->chan; + struct chanbuf *cb; + struct chan *ch; u_int32_t count; int s; + cb = priv; + ch = cb->chan; /* Return if we are aborting. */ if (status == USBD_CANCELLED) return; @@ -3316,7 +3365,6 @@ uaudio_chan_set_param(struct chan *ch, u_char *start, u_char *end, int blksize) ch->cur = start; ch->blksize = blksize; ch->transferred = 0; - ch->curchanbuf = 0; } @@ -3473,21 +3521,25 @@ Static int uaudio_set_params(void *addr, int setmode, int usemode, struct audio_params *play, struct audio_params *rec) { - struct uaudio_softc *sc = addr; - int flags = sc->sc_altflags; + struct uaudio_softc *sc; + int flags; int factor; int enc, i; - int paltidx=-1, raltidx=-1; + int paltidx, raltidx; void (*swcode)(void *, u_char *buf, int cnt); struct audio_params *p; int mode; + sc = addr; + flags = sc->sc_altflags; + paltidx = -1; + raltidx = -1; if (sc->sc_dying) - return (EIO); + return EIO; if (((usemode & AUMODE_PLAY) && sc->sc_playchan.pipe != NULL) || ((usemode & AUMODE_RECORD) && sc->sc_recchan.pipe != NULL)) - return (EBUSY); + return EBUSY; if ((usemode & AUMODE_PLAY) && sc->sc_playchan.altidx != -1) sc->sc_alts[sc->sc_playchan.altidx].sc_busy = 0; @@ -3655,7 +3707,7 @@ uaudio_set_params(void *addr, int setmode, int usemode, ? sc->sc_alts[sc->sc_recchan.altidx].idesc->bAlternateSetting : -1)); - return (0); + return 0; } #endif /* NetBSD or OpenBSD */ @@ -3663,7 +3715,7 @@ Static usbd_status uaudio_set_speed(struct uaudio_softc *sc, int endpt, u_int speed) { usb_device_request_t req; - u_int8_t data[3]; + uint8_t data[3]; DPRINTFN(5,("uaudio_set_speed: endpt=%d speed=%u\n", endpt, speed)); req.bmRequestType = UT_WRITE_CLASS_ENDPOINT; @@ -3675,7 +3727,7 @@ uaudio_set_speed(struct uaudio_softc *sc, int endpt, u_int speed) data[1] = speed >> 8; data[2] = speed >> 16; - return (usbd_do_request(sc->sc_udev, &req, data)); + return usbd_do_request(sc->sc_udev, &req, data); } -- cgit v1.1