Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F102025708
D43545.id136898.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D43545.id136898.diff
View Options
diff --git a/share/man/man4/snd_uaudio.4 b/share/man/man4/snd_uaudio.4
--- a/share/man/man4/snd_uaudio.4
+++ b/share/man/man4/snd_uaudio.4
@@ -27,7 +27,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd January 29, 2024
+.Dd March 26, 2024
.Dt SND_UAUDIO 4
.Os
.Sh NAME
@@ -156,15 +156,6 @@
by
.An Hiten Pandya Aq Mt hmp@FreeBSD.org .
.Sh BUGS
-The PCM framework in
-.Fx
-only supports synchronous device detach.
-That means all mixer and DSP character devices belonging to a given
-USB audio device must be closed when receiving an error on a DSP read,
-a DSP write or a DSP IOCTL request.
-Else the USB audio driver will wait for this to happen, preventing
-enumeration of new devices on the parenting USB controller.
-.Pp
Some USB audio devices might refuse to work properly unless the sample
rate is configured the same for both recording and playback, even if
only simplex is used.
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -274,7 +274,7 @@
d = priv->sc;
/* At this point pcm_unregister() will destroy all channels anyway. */
- if (!PCM_REGISTERED(d))
+ if (PCM_DETACHING(d))
goto skip;
PCM_GIANT_ENTER(d);
diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c
--- a/sys/dev/sound/pcm/mixer.c
+++ b/sys/dev/sound/pcm/mixer.c
@@ -817,17 +817,6 @@
KASSERT(m->type == MIXER_TYPE_PRIMARY,
("%s(): illegal mixer type=%d", __func__, m->type));
- snd_mtxlock(m->lock);
-
- if (m->busy) {
- snd_mtxunlock(m->lock);
- return EBUSY;
- }
-
- /* destroy dev can sleep --hps */
-
- snd_mtxunlock(m->lock);
-
pdev->si_drv1 = NULL;
destroy_dev(pdev);
diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c
--- a/sys/dev/sound/pcm/sound.c
+++ b/sys/dev/sound/pcm/sound.c
@@ -1001,26 +1001,22 @@
CHN_FOREACH(ch, d, channels.pcm) {
CHN_LOCK(ch);
- if (ch->refcount > 0) {
- device_printf(dev,
- "unregister: channel %s busy (pid %d)\n",
- ch->name, ch->pid);
- CHN_UNLOCK(ch);
- PCM_RELEASE_QUICK(d);
- return (EBUSY);
+ if (ch->flags & CHN_F_SLEEPING) {
+ /*
+ * We are detaching, so do not wait for the timeout in
+ * chn_read()/chn_write(). Wake up the thread and kill
+ * the channel immediately.
+ */
+ CHN_BROADCAST(&ch->intr_cv);
+ ch->flags |= CHN_F_DEAD;
}
+ chn_abort(ch);
CHN_UNLOCK(ch);
}
dsp_destroy_dev(dev);
- if (mixer_uninit(dev) == EBUSY) {
- device_printf(dev, "unregister: mixer busy\n");
- PCM_LOCK(d);
- PCM_RELEASE(d);
- PCM_UNLOCK(d);
- return (EBUSY);
- }
+ (void)mixer_uninit(dev);
/* remove /dev/sndstat entry first */
sndstat_unregister(dev);
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -1255,20 +1255,13 @@
unsigned i = uaudio_get_child_index_by_dev(sc, dev);
int error = 0;
-repeat:
if (sc->sc_child[i].pcm_registered) {
error = pcm_unregister(dev);
- } else {
- if (sc->sc_child[i].mixer_init)
- error = mixer_uninit(dev);
+ } else if (sc->sc_child[i].mixer_init) {
+ error = mixer_uninit(dev);
}
- if (error) {
- device_printf(dev, "Waiting for sound application to exit!\n");
- usb_pause_mtx(NULL, 2 * hz);
- goto repeat; /* try again */
- }
- return (0); /* success */
+ return (error);
}
static int
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Nov 7, 4:43 PM (3 h, 52 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14508908
Default Alt Text
D43545.id136898.diff (3 KB)
Attached To
Mode
D43545: sound: Implement asynchronous device detach
Attached
Detach File
Event Timeline
Log In to Comment