NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/54264: audio(4) API fails to detect a capture-only device
At Sun, 2 Jun 2019 13:35:00 +0000 (UTC),
nia%netbsd.org@localhost wrote:
> First I query the device with AUDIO_GETPROPS. It claims that the
> device has playback support. This is incorrect.
Please try this patch.
uaudio doesn't return correct property on unidirectional device.
current audio (isaki-audio2) requires that the hardware driver's
get_props() returns exact property.
nakayama@-san,
dev/audio/audio.c,v 1.5 and 1.7 look wrong. It assumes that the
hardware driver may return incorrect property. But this assumption
is not right (and not good). The condition
(unidirection && full duplex), or
(unidirection && the device can set play and rec independently)
are obviously strange and such hardware driver should be fixed.
Would you test this patch?
--- sys/dev/usb/uaudio.c
+++ sys/dev/usb/uaudio.c
@@ -2264,8 +2264,21 @@ uaudio_round_blocksize(void *addr, int blk,
Static int
uaudio_get_props(void *addr)
{
- return AUDIO_PROP_FULLDUPLEX | AUDIO_PROP_INDEPENDENT;
+ struct uaudio_softc *sc;
+ int props;
+
+ sc = addr;
+ props = 0;
+ if ((sc->sc_mode & AUMODE_PLAY))
+ props |= AUDIO_PROP_PLAYBACK;
+ if ((sc->sc_mode & AUMODE_RECORD))
+ props |= AUDIO_PROP_CAPTURE;
+
+ /* XXX I'm not sure all bidirectional devices support FULLDUP&INDEP */
+ if (props == (AUDIO_PROP_PLAYBACK | AUDIO_PROP_CAPTURE))
+ props |= AUDIO_PROP_FULLDUPLEX | AUDIO_PROP_INDEPENDENT;
+ return props;
}
Static void
Index: sys/dev/audio/audio.c
===================================================================
RCS file: /cvsroot/src/sys/dev/audio/audio.c,v
retrieving revision 1.5
retrieving revision 1.4
diff -u -r1.5 -r1.4
--- sys/dev/audio/audio.c 13 May 2019 04:11:04 -0000 1.5
+++ sys/dev/audio/audio.c 13 May 2019 04:09:35 -0000 1.4
@@ -6149,23 +6149,17 @@
"invalid mode = %x", mode);
if (is_indep) {
- int errorp = 0, errorr = 0;
-
/* On independent devices, probe separately. */
if ((mode & AUMODE_PLAY) != 0) {
- errorp = audio_hw_probe_fmt(sc, phwfmt, AUMODE_PLAY);
- if (errorp)
+ error = audio_hw_probe_fmt(sc, phwfmt, AUMODE_PLAY);
+ if (error)
mode &= ~AUMODE_PLAY;
}
if ((mode & AUMODE_RECORD) != 0) {
- errorr = audio_hw_probe_fmt(sc, rhwfmt, AUMODE_RECORD);
- if (errorr)
+ error = audio_hw_probe_fmt(sc, rhwfmt, AUMODE_RECORD);
+ if (error)
mode &= ~AUMODE_RECORD;
}
-
- /* Return error if both play and record probes failed. */
- if (errorp && errorr)
- error = errorp;
} else {
/* On non independent devices, probe simultaneously. */
error = audio_hw_probe_fmt(sc, &fmt, mode);
Index: sys/dev/audio/audio.c
===================================================================
RCS file: /cvsroot/src/sys/dev/audio/audio.c,v
retrieving revision 1.7
retrieving revision 1.6
diff -u -r1.7 -r1.6
--- sys/dev/audio/audio.c 13 May 2019 08:50:25 -0000 1.7
+++ sys/dev/audio/audio.c 13 May 2019 07:53:56 -0000 1.6
@@ -2046,17 +2046,12 @@
* hw_if->open() is always (FREAD | FWRITE)
* regardless of this open()'s flags.
* see also dev/isa/aria.c
- * but ckeck its playback or recording capability.
* On half duplex hardware, the flags passed to
* hw_if->open() is either FREAD or FWRITE.
* see also arch/evbarm/mini2440/audio_mini2440.c
*/
if (fullduplex) {
hwflags = FREAD | FWRITE;
- if (!audio_can_playback(sc))
- hwflags &= ~FWRITE;
- if (!audio_can_capture(sc))
- hwflags &= ~FREAD;
} else {
/* Construct hwflags from af->mode. */
hwflags = 0;
---
Tetsuya Isaki <isaki%pastel-flower.jp@localhost / isaki%NetBSD.org@localhost>
Home |
Main Index |
Thread Index |
Old Index