Index: uaudio.c =================================================================== RCS file: /home/ncvs/src/sys/dev/sound/usb/uaudio.c,v retrieving revision 1.7 diff -u -d -p -r1.7 uaudio.c --- uaudio.c 25 Aug 2002 01:32:22 -0000 1.7 +++ uaudio.c 15 Jun 2004 07:45:00 -0000 @@ -1395,10 +1395,9 @@ uaudio_identify_as(struct uaudio_softc * return (USBD_INVAL); } -#ifndef NO_RECORDING if (sc->sc_chan.dir == (AUMODE_PLAY | AUMODE_RECORD)) sc->sc_props |= AUDIO_PROP_FULLDUPLEX; -#endif + return (USBD_NORMAL_COMPLETION); } @@ -2813,23 +2812,41 @@ uaudio_chan_set_param_format(device_t de } int -uaudio_halt_out_dma(device_t dev) +uaudio_trigger_output(device_t dev) { struct uaudio_softc *sc; + struct chan *ch; + usbd_status err; + int i, s; sc = device_get_softc(dev); + ch = &sc->sc_chan; - DPRINTF(("uaudio_halt_out_dma: enter\n")); - if (sc->sc_chan.pipe != NULL) { - uaudio_chan_close(sc, &sc->sc_chan); - sc->sc_chan.pipe = 0; - uaudio_chan_free_buffers(sc, &sc->sc_chan); + if (sc->sc_dying) + return (EIO); + + uaudio_init_params(sc, ch); + + err = uaudio_chan_alloc_buffers(sc, ch); + if (err) + return (EIO); + + err = uaudio_chan_open(sc, ch); + if (err) { + uaudio_chan_free_buffers(sc, ch); + return (EIO); } + + s = splusb(); + for (i = 0; i < UAUDIO_NCHANBUFS-1; i++) /* XXX */ + uaudio_chan_ptransfer(ch); + splx(s); + return (0); } - + int -uaudio_trigger_output(device_t dev) +uaudio_trigger_input(device_t dev) { struct uaudio_softc *sc; struct chan *ch; @@ -2855,12 +2872,44 @@ uaudio_trigger_output(device_t dev) } s = splusb(); - for (i = 0; i < UAUDIO_NCHANBUFS-1; i++) /* XXX */ - uaudio_chan_ptransfer(ch); + for (i = 0; i < UAUDIO_NCHANBUFS-1; i++) /* XXX -1 shouldn't be needed */ + uaudio_chan_rtransfer(ch); splx(s); return (0); } + +int +uaudio_halt_in_dma(device_t dev) +{ + struct uaudio_softc *sc; + + sc = device_get_softc(dev); + + DPRINTF(("uaudio_halt_in_dma: enter\n")); + if (sc->sc_chan.pipe != NULL) { + uaudio_chan_close(sc, &sc->sc_chan); + sc->sc_chan.pipe = 0; + uaudio_chan_free_buffers(sc, &sc->sc_chan); + } + return (0); +} + +int +uaudio_halt_out_dma(device_t dev) +{ + struct uaudio_softc *sc; + + sc = device_get_softc(dev); + + DPRINTF(("uaudio_halt_out_dma: enter\n")); + if (sc->sc_chan.pipe != NULL) { + uaudio_chan_close(sc, &sc->sc_chan); + sc->sc_chan.pipe = 0; + uaudio_chan_free_buffers(sc, &sc->sc_chan); + } + return (0); +} u_int32_t uaudio_query_mix_info(device_t dev) Index: uaudio.h =================================================================== RCS file: /home/ncvs/src/sys/dev/sound/usb/uaudio.h,v retrieving revision 1.1 diff -u -d -p -r1.1 uaudio.h --- uaudio.h 21 Jul 2002 17:28:50 -0000 1.1 +++ uaudio.h 15 Jun 2004 07:39:48 -0000 @@ -1,4 +1,4 @@ -/* $FreeBSD$ */ +/* $FreeBSD: src/sys/dev/sound/usb/uaudio.h,v 1.1 2002/07/21 17:28:50 nsayer Exp $ */ /* * Copyright (c) 2000-2002 Hiroyuki Aizu @@ -25,18 +25,14 @@ * SUCH DAMAGE. */ -#define NO_RECORDING /* XXX: some routines missing from uaudio.c */ - /* Defined in uaudio.c, used in uaudio_pcm,c */ void uaudio_chan_set_param_pcm_dma_buff(device_t dev, u_char *start, u_char *end, struct pcm_channel *pc); int uaudio_trigger_output(device_t dev); -int uaudio_halt_out_dma(device_t dev); -#ifndef NO_RECORDING int uaudio_trigger_input(device_t dev); int uaudio_halt_in_dma(device_t dev); -#endif +int uaudio_halt_out_dma(device_t dev); void uaudio_chan_set_param(device_t, u_char *, u_char *); void uaudio_chan_set_param_blocksize(device_t dev, u_int32_t blocksize); void uaudio_chan_set_param_speed(device_t dev, u_int32_t speed); Index: uaudio_pcm.c =================================================================== RCS file: /home/ncvs/src/sys/dev/sound/usb/uaudio_pcm.c,v retrieving revision 1.4 diff -u -d -p -r1.4 uaudio_pcm.c --- uaudio_pcm.c 31 May 2004 11:38:46 -0000 1.4 +++ uaudio_pcm.c 15 Jun 2004 07:41:12 -0000 @@ -92,13 +92,9 @@ ua_chan_init(kobj_t obj, void *devinfo, uaudio_chan_set_param_pcm_dma_buff(pa_dev, buf, end, ch->channel); ch->dir = dir; -#ifndef NO_RECORDING ch->hwch = 1; if (dir == PCMDIR_PLAY) ch->hwch = 2; -#else - ch->hwch = 2; -#endif return ch; } @@ -177,12 +173,10 @@ ua_chan_trigger(kobj_t obj, void *data, uaudio_halt_out_dma(pa_dev); } } else { -#ifndef NO_RECORDING if (go == PCMTRIG_START) uaudio_trigger_input(pa_dev); else uaudio_halt_in_dma(pa_dev); -#endif } return 0; @@ -325,9 +319,7 @@ ua_attach(device_t dev) } pcm_addchan(dev, PCMDIR_PLAY, &ua_chan_class, ua); -#ifndef NO_RECORDING pcm_addchan(dev, PCMDIR_REC, &ua_chan_class, ua); -#endif pcm_setstatus(dev, status); return 0;