Module Name: src Committed By: nia Date: Sun Apr 19 13:44:51 UTC 2020
Modified Files: src/lib/libossaudio: ossaudio.c src/sys/compat/ossaudio: ossaudio.c Log Message: ossaudio: Implement SNDCTL_DSP_(SET|GET)TRIGGER. To generate a diff of this commit: cvs rdiff -u -r1.42 -r1.43 src/lib/libossaudio/ossaudio.c cvs rdiff -u -r1.81 -r1.82 src/sys/compat/ossaudio/ossaudio.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libossaudio/ossaudio.c diff -u src/lib/libossaudio/ossaudio.c:1.42 src/lib/libossaudio/ossaudio.c:1.43 --- src/lib/libossaudio/ossaudio.c:1.42 Sun Apr 19 11:27:40 2020 +++ src/lib/libossaudio/ossaudio.c Sun Apr 19 13:44:50 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ossaudio.c,v 1.42 2020/04/19 11:27:40 nia Exp $ */ +/* $NetBSD: ossaudio.c,v 1.43 2020/04/19 13:44:50 nia Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: ossaudio.c,v 1.42 2020/04/19 11:27:40 nia Exp $"); +__RCSID("$NetBSD: ossaudio.c,v 1.43 2020/04/19 13:44:50 nia Exp $"); /* * This is an OSS (Linux) sound API emulator. @@ -501,43 +501,35 @@ audio_ioctl(int fd, unsigned long com, v retval = ioctl(fd, AUDIO_GETPROPS, &idata); if (retval < 0) return retval; - idat = DSP_CAP_TRIGGER; /* pretend we have trigger */ + idat = DSP_CAP_TRIGGER; if (idata & AUDIO_PROP_FULLDUPLEX) idat |= DSP_CAP_DUPLEX; if (idata & AUDIO_PROP_MMAP) idat |= DSP_CAP_MMAP; INTARG = idat; break; -#if 0 - case SNDCTL_DSP_GETTRIGGER: + case SNDCTL_DSP_SETTRIGGER: retval = ioctl(fd, AUDIO_GETBUFINFO, &tmpinfo); if (retval < 0) return retval; - idat = (tmpinfo.play.pause ? 0 : PCM_ENABLE_OUTPUT) | - (tmpinfo.record.pause ? 0 : PCM_ENABLE_INPUT); - retval = copyout(&idat, SCARG(uap, data), sizeof idat); - if (retval < 0) - return retval; - break; - case SNDCTL_DSP_SETTRIGGER: AUDIO_INITINFO(&tmpinfo); - retval = copyin(SCARG(uap, data), &idat, sizeof idat); - if (retval < 0) - return retval; - tmpinfo.play.pause = (idat & PCM_ENABLE_OUTPUT) == 0; - tmpinfo.record.pause = (idat & PCM_ENABLE_INPUT) == 0; - (void) ioctl(fd, AUDIO_SETINFO, &tmpinfo); - retval = copyout(&idat, SCARG(uap, data), sizeof idat); + if (tmpinfo.mode & AUMODE_PLAY) + tmpinfo.play.pause = (INTARG & PCM_ENABLE_OUTPUT) == 0; + if (tmpinfo.mode & AUMODE_RECORD) + tmpinfo.record.pause = (INTARG & PCM_ENABLE_INPUT) == 0; + (void)ioctl(fd, AUDIO_SETINFO, &tmpinfo); + /* FALLTHRU */ + case SNDCTL_DSP_GETTRIGGER: + retval = ioctl(fd, AUDIO_GETBUFINFO, &tmpinfo); if (retval < 0) return retval; + idat = 0; + if ((tmpinfo.mode & AUMODE_PLAY) && !tmpinfo.play.pause) + idat |= PCM_ENABLE_OUTPUT; + if ((tmpinfo.mode & AUMODE_RECORD) && !tmpinfo.record.pause) + idat |= PCM_ENABLE_INPUT; + INTARG = idat; break; -#else - case SNDCTL_DSP_GETTRIGGER: - case SNDCTL_DSP_SETTRIGGER: - /* XXX Do nothing for now. */ - INTARG = PCM_ENABLE_OUTPUT; - break; -#endif case SNDCTL_DSP_GETIPTR: retval = ioctl(fd, AUDIO_GETIOFFS, &tmpoffs); if (retval < 0) Index: src/sys/compat/ossaudio/ossaudio.c diff -u src/sys/compat/ossaudio/ossaudio.c:1.81 src/sys/compat/ossaudio/ossaudio.c:1.82 --- src/sys/compat/ossaudio/ossaudio.c:1.81 Wed Apr 15 16:39:06 2020 +++ src/sys/compat/ossaudio/ossaudio.c Sun Apr 19 13:44:51 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ossaudio.c,v 1.81 2020/04/15 16:39:06 nia Exp $ */ +/* $NetBSD: ossaudio.c,v 1.82 2020/04/19 13:44:51 nia Exp $ */ /*- * Copyright (c) 1997, 2008 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ossaudio.c,v 1.81 2020/04/15 16:39:06 nia Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ossaudio.c,v 1.82 2020/04/19 13:44:51 nia Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -715,7 +715,7 @@ oss_ioctl_audio(struct lwp *l, const str __func__, error)); goto out; } - idat = OSS_DSP_CAP_TRIGGER; /* pretend we have trigger */ + idat = OSS_DSP_CAP_TRIGGER; if (idata & AUDIO_PROP_FULLDUPLEX) idat |= OSS_DSP_CAP_DUPLEX; if (idata & AUDIO_PROP_MMAP) @@ -730,64 +730,45 @@ oss_ioctl_audio(struct lwp *l, const str goto out; } break; -#if 0 - case OSS_SNDCTL_DSP_GETTRIGGER: - error = ioctlf(fp, AUDIO_GETBUFINFO, &tmpinfo); - if (error) { - DPRINTF(("%s: AUDIO_GETBUFINFO %d\n", - __func__, error)); - goto out; - } - idat = (tmpinfo.play.pause ? 0 : OSS_PCM_ENABLE_OUTPUT) | - (tmpinfo.record.pause ? 0 : OSS_PCM_ENABLE_INPUT); - error = copyout(&idat, SCARG(uap, data), sizeof idat); - if (error) { - DPRINTF(("%s: SNDCTL_DSP_SETRIGGER %x = %d\n", - __func__, idat, error)); - goto out; - } - break; case OSS_SNDCTL_DSP_SETTRIGGER: - error = ioctlf(fp, AUDIO_GETBUFINFO, &tmpinfo, p); + error = copyin(SCARG(uap, data), &idat, sizeof idat); if (error) { - DPRINTF(("%s: AUDIO_GETBUFINFO %d\n", + DPRINTF(("%s: SNDCTL_DSP_SETTRIGGER: %d\n", __func__, error)); goto out; } - error = copyin(SCARG(uap, data), &idat, sizeof idat); + error = ioctlf(fp, AUDIO_GETBUFINFO, &tmpinfo); if (error) { DPRINTF(("%s: AUDIO_GETBUFINFO %d\n", __func__, error)); goto out; } - tmpinfo.play.pause = (idat & OSS_PCM_ENABLE_OUTPUT) == 0; - tmpinfo.record.pause = (idat & OSS_PCM_ENABLE_INPUT) == 0; - error = ioctlf(fp, AUDIO_SETINFO, &tmpinfo); + AUDIO_INITINFO(&tmpinfo); + if (tmpinfo.mode & AUMODE_PLAY) + tmpinfo.play.pause = (idat & OSS_PCM_ENABLE_OUTPUT) == 0; + if (tmpinfo.mode & AUMODE_RECORD) + tmpinfo.record.pause = (idat & OSS_PCM_ENABLE_INPUT) == 0; + (void)ioctlf(fp, AUDIO_SETINFO, &tmpinfo); + /* FALLTHRU */ + case OSS_SNDCTL_DSP_GETTRIGGER: + error = ioctlf(fp, AUDIO_GETBUFINFO, &tmpinfo); if (error) { - DPRINTF(("%s: AUDIO_SETINFO %d\n", + DPRINTF(("%s: AUDIO_GETBUFINFO %d\n", __func__, error)); goto out; } + idat = 0; + if ((tmpinfo.mode & AUMODE_PLAY) && !tmpinfo.play.pause) + idat |= OSS_PCM_ENABLE_OUTPUT; + if ((tmpinfo.mode & AUMODE_RECORD) && !tmpinfo.record.pause) + idat |= OSS_PCM_ENABLE_INPUT; error = copyout(&idat, SCARG(uap, data), sizeof idat); if (error) { - DPRINTF(("%s: SNDCTL_DSP_SETRIGGER %x = %d\n", - __func__, idat, error)); - goto out; - } - break; -#else - case OSS_SNDCTL_DSP_GETTRIGGER: - case OSS_SNDCTL_DSP_SETTRIGGER: - /* XXX Do nothing for now. */ - idat = OSS_PCM_ENABLE_OUTPUT; - error = copyout(&idat, SCARG(uap, data), sizeof idat); - if (error) { - DPRINTF(("%s: SNDCTL_DSP_{GET,SET}RIGGER %x = %d\n", + DPRINTF(("%s: SNDCTL_DSP_GETTRIGGER = %x = %d\n", __func__, idat, error)); goto out; } break; -#endif case OSS_SNDCTL_DSP_GETIPTR: error = ioctlf(fp, AUDIO_GETIOFFS, &tmpoffs); if (error) {