diff --git a/sys/dev/audio/audio.c b/sys/dev/audio/audio.c
index cda5d25d6b04..13bba8cc603d 100644
--- a/sys/dev/audio/audio.c
+++ b/sys/dev/audio/audio.c
@@ -2348,10 +2348,20 @@ audio_open(dev_t dev, struct audio_softc *sc, int flags, int ifmt,
 	af = kmem_zalloc(sizeof(audio_file_t), KM_SLEEP);
 	af->sc = sc;
 	af->dev = dev;
-	if ((flags & FWRITE) != 0 && audio_can_playback(sc))
+	if (flags & FWRITE) {
+		if (!audio_can_playback(sc)) {
+			error = ENXIO;
+			goto bad;
+		}
 		af->mode |= AUMODE_PLAY | AUMODE_PLAY_ALL;
-	if ((flags & FREAD) != 0 && audio_can_capture(sc))
+	}
+	if (flags & FREAD) {
+		if (!audio_can_capture(sc)) {
+			error = ENXIO;
+			goto bad;
+		}
 		af->mode |= AUMODE_RECORD;
+	}
 	if (af->mode == 0) {
 		error = ENXIO;
 		goto bad;
@@ -2909,7 +2919,8 @@ audio_write(struct audio_softc *sc, struct uio *uio, int ioflag,
 	int error;
 
 	track = file->ptrack;
-	KASSERT(track);
+	if (track == NULL)
+		return EPERM;
 
 	/* I think it's better than EINVAL. */
 	if (track->mmapped)