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:
parent
2baaf9c206
commit
65046f8612
@ -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)
|
||||
{
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user