Allow recording on at least some USB audio devices.

PR:		75311
Submitted by:	Kazuhito HONDA <kazuhito at ph dot noda dot tus dot ac dot jp>
Obtained from:	NetBSD plus changes
MFC after:	2 weeks
This commit is contained in:
Julian Elischer 2004-12-25 08:51:47 +00:00
parent 2baaf9c206
commit 65046f8612
3 changed files with 73 additions and 2 deletions

View File

@ -3634,6 +3634,9 @@ uaudio_init_params(struct uaudio_softc *sc, struct chan *ch, int mode)
int i, j, enc;
int samples_per_frame, sample_size;
if ((sc->sc_playchan.pipe != NULL) || (sc->sc_recchan.pipe != NULL))
return (-1);
switch(ch->format & 0x0000FFFF) {
case AFMT_U8:
enc = AUDIO_ENCODING_ULINEAR_LE;
@ -3680,7 +3683,6 @@ uaudio_init_params(struct uaudio_softc *sc, struct chan *ch, int mode)
}
/* for (mode = ...... */
/*But this function is used for output only */
for (i = 0; i < sc->sc_nalts; i++) {
const struct usb_audio_streaming_type1_descriptor *a1d =
sc->sc_alts[i].asf1desc;
@ -3722,7 +3724,10 @@ uaudio_init_params(struct uaudio_softc *sc, struct chan *ch, int mode)
}
}
/* return (EINVAL); */
printf("uaudio: This device can't play in rate=%d.\n", ch->sample_rate);
if (mode == AUMODE_PLAY)
printf("uaudio: This device can't play in rate=%d.\n", ch->sample_rate);
else
printf("uaudio: This device can't record in rate=%d.\n", ch->sample_rate);
return (-1);
found:
@ -3952,6 +3957,65 @@ uaudio_halt_out_dma(device_t dev)
return (0);
}
int
uaudio_halt_in_dma(device_t dev)
{
struct uaudio_softc *sc;
sc = device_get_softc(dev);
if (sc->sc_dying)
return (EIO);
DPRINTF(("uaudio_halt_in_dma: enter\n"));
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);
}
int
uaudio_trigger_input(device_t dev)
{
struct uaudio_softc *sc;
struct chan *ch;
usbd_status err;
int i, s;
sc = device_get_softc(dev);
ch = &sc->sc_recchan;
if (sc->sc_dying)
return (EIO);
/* uaudio_chan_set_param(ch, start, end, blksize) */
if (uaudio_init_params(sc, ch, AUMODE_RECORD))
return (EIO);
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);
}
/* ch->intr = intr;
ch->arg = arg; */
s = splusb();
for (i = 0; i < UAUDIO_NCHANBUFS-1; i++) /* XXX -1 shouldn't be needed */
uaudio_chan_rtransfer(ch);
splx(s);
return (0);
}
int
uaudio_trigger_output(device_t dev)
{

View File

@ -25,7 +25,9 @@
* SUCH DAMAGE.
*/
#if 0
#define NO_RECORDING /* XXX: some routines missing from uaudio.c */
#endif
/* Defined in uaudio.c, used in uaudio_pcm,c */

View File

@ -73,6 +73,7 @@ ua_chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->parent = sc;
ch->channel = c;
ch->buffer = b;
ch->dir = dir;
pa_dev = device_get_parent(sc->sc_dev);
/* Create ua_playfmt[] & ua_recfmt[] */
@ -320,7 +321,11 @@ ua_attach(device_t dev)
snprintf(status, SND_STATUSLEN, "at addr ?");
#ifndef NO_RECORDING
if (pcm_register(dev, ua, 1, 1)) {
#else
if (pcm_register(dev, ua, 1, 0)) {
#endif
return(ENXIO);
}