Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/libossaudio libossaudio: Various OSSv4 fixes to allow re...
details: https://anonhg.NetBSD.org/src/rev/3ecd20e5dbf4
branches: trunk
changeset: 379085:3ecd20e5dbf4
user: nia <nia%NetBSD.org@localhost>
date: Sun May 09 11:28:25 2021 +0000
description:
libossaudio: Various OSSv4 fixes to allow reference programs to compile
- Define various new AFMT_*. These are not returned as supported
formats by SNDCTL_DSP_GETFMTS, because it would be very silly to
have Vorbis in the kernel.
- Implement PLAYTGT and RECSRC. For each NetBSD audio device
we only return one playback and recording source, "primary".
- Return preferred channel configuration in capabilities.
Either DSP_CH_STEREO, DSP_CH_MONO, or DSP_CH_MULTI
depending on the current hardware format.
- SNDCTL_DSP_HALT_* simply flushes the audio device.
diffstat:
lib/libossaudio/ossaudio.c | 60 ++++++++++++++++++++++++++++++++++++--------
lib/libossaudio/soundcard.h | 41 +++++++++++++++++++++++++++---
2 files changed, 86 insertions(+), 15 deletions(-)
diffs (229 lines):
diff -r 27c5c1b37fa1 -r 3ecd20e5dbf4 lib/libossaudio/ossaudio.c
--- a/lib/libossaudio/ossaudio.c Sun May 09 11:06:20 2021 +0000
+++ b/lib/libossaudio/ossaudio.c Sun May 09 11:28:25 2021 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: ossaudio.c,v 1.66 2021/03/15 10:58:05 nia Exp $ */
+/* $NetBSD: ossaudio.c,v 1.67 2021/05/09 11:28:25 nia Exp $ */
/*-
- * Copyright (c) 1997, 2020 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997-2021 The NetBSD Foundation, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: ossaudio.c,v 1.66 2021/03/15 10:58:05 nia Exp $");
+__RCSID("$NetBSD: ossaudio.c,v 1.67 2021/05/09 11:28:25 nia Exp $");
/*
* This is an Open Sound System compatibility layer, which provides
@@ -127,6 +127,7 @@ audio_ioctl(int fd, unsigned long com, v
int perrors, rerrors;
static int totalperrors = 0;
static int totalrerrors = 0;
+ oss_mixer_enuminfo *ei;
oss_count_t osscount;
int idat;
int retval;
@@ -134,6 +135,8 @@ audio_ioctl(int fd, unsigned long com, v
idat = 0;
switch (com) {
+ case SNDCTL_DSP_HALT_INPUT:
+ case SNDCTL_DSP_HALT_OUTPUT:
case SNDCTL_DSP_RESET:
retval = ioctl(fd, AUDIO_FLUSH, 0);
if (retval < 0)
@@ -293,6 +296,7 @@ audio_ioctl(int fd, unsigned long com, v
* the 24-bit formats should be handled properly instead
* of falling back to 32 bits.
*/
+ case AFMT_S24_PACKED:
case AFMT_S24_LE:
case AFMT_S32_LE:
tmpinfo.play.precision =
@@ -434,10 +438,6 @@ audio_ioctl(int fd, unsigned long com, v
case SNDCTL_DSP_SETFRAGMENT:
AUDIO_INITINFO(&tmpinfo);
idat = INTARG;
- if ((idat & 0xffff) < 4 || (idat & 0xffff) > 17) {
- errno = EINVAL;
- return -1;
- }
tmpinfo.blocksize = 1 << (idat & 0xffff);
tmpinfo.hiwat = ((unsigned)idat >> 16) & 0x7fff;
if (tmpinfo.hiwat == 0) /* 0 means set to max */
@@ -662,6 +662,21 @@ audio_ioctl(int fd, unsigned long com, v
case SNDCTL_DSP_SETSYNCRO:
errno = EINVAL;
return -1; /* XXX unimplemented */
+ case SNDCTL_DSP_GET_PLAYTGT_NAMES:
+ case SNDCTL_DSP_GET_RECSRC_NAMES:
+ ei = (oss_mixer_enuminfo *)argp;
+ ei->nvalues = 1;
+ ei->version = 0;
+ ei->strindex[0] = 0;
+ strlcpy(ei->strings, "primary", OSS_ENUM_STRINGSIZE);
+ break;
+ case SNDCTL_DSP_SET_PLAYTGT:
+ case SNDCTL_DSP_SET_RECSRC:
+ case SNDCTL_DSP_GET_PLAYTGT:
+ case SNDCTL_DSP_GET_RECSRC:
+ /* We have one recording source and play target. */
+ INTARG = 0;
+ break;
default:
errno = EINVAL;
return -1;
@@ -1114,7 +1129,7 @@ mixer_oss4_ioctl(int fd, unsigned long c
"%s %s", dev.name, dev.version);
tmpai->busy = 0;
tmpai->pid = -1;
- ioctl(newfd, SNDCTL_DSP_GETFMTS, &tmpai->iformats);
+ audio_ioctl(newfd, SNDCTL_DSP_GETFMTS, &tmpai->iformats);
tmpai->oformats = tmpai->iformats;
tmpai->magic = -1; /* reserved for "internal use" */
memset(tmpai->cmd, 0, sizeof(tmpai->cmd));
@@ -1603,17 +1618,40 @@ global_oss4_ioctl(int fd, unsigned long
static int
getcaps(int fd, int *out)
{
+ struct audio_info info;
int props, caps;
+ int nchannels;
if (ioctl(fd, AUDIO_GETPROPS, &props) < 0)
return -1;
- caps = DSP_CAP_TRIGGER;
+ if (ioctl(fd, AUDIO_GETFORMAT, &info) < 0)
+ return -1;
+
+ caps = 0;
+ caps |= PCM_CAP_TRIGGER;
+ caps |= PCM_CAP_MULTI;
+ caps |= PCM_CAP_FREERATE;
+
+ nchannels = (props & AUDIO_PROP_PLAYBACK) ?
+ info.play.channels : info.record.channels;
+
+ switch (nchannels) {
+ case 2:
+ caps |= DSP_CH_STEREO;
+ break;
+ case 1:
+ caps |= DSP_CH_MONO;
+ break;
+ default:
+ caps |= DSP_CH_MULTI;
+ break;
+ }
if (props & AUDIO_PROP_FULLDUPLEX)
- caps |= DSP_CAP_DUPLEX;
+ caps |= PCM_CAP_DUPLEX;
if (props & AUDIO_PROP_MMAP)
- caps |= DSP_CAP_MMAP;
+ caps |= PCM_CAP_MMAP;
if (props & AUDIO_PROP_CAPTURE)
caps |= PCM_CAP_INPUT;
if (props & AUDIO_PROP_PLAYBACK)
diff -r 27c5c1b37fa1 -r 3ecd20e5dbf4 lib/libossaudio/soundcard.h
--- a/lib/libossaudio/soundcard.h Sun May 09 11:06:20 2021 +0000
+++ b/lib/libossaudio/soundcard.h Sun May 09 11:28:25 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: soundcard.h,v 1.33 2020/12/03 22:10:21 nia Exp $ */
+/* $NetBSD: soundcard.h,v 1.34 2021/05/09 11:28:25 nia Exp $ */
/*-
* Copyright (c) 1997, 2020 The NetBSD Foundation, Inc.
@@ -60,12 +60,16 @@
#define AFMT_S8 0x00000040
#define AFMT_U16_LE 0x00000080
#define AFMT_U16_BE 0x00000100
-#define AFMT_MPEG 0x00000200
+#define AFMT_MPEG 0x00000200 /* Not supported */
#define AFMT_AC3 0x00000400
-#define AFMT_S24_LE 0x00000800
-#define AFMT_S24_BE 0x00001000
+#define AFMT_S24_LE 0x00000800 /* Not supported */
+#define AFMT_S24_BE 0x00001000 /* Not supported */
#define AFMT_S32_LE 0x00002000
#define AFMT_S32_BE 0x00004000
+#define AFMT_FLOAT 0x00010000 /* Not supported */
+#define AFMT_SPDIF_RAW 0x00020000 /* Not supported */
+#define AFMT_S24_PACKED 0x00040000 /* Not supported */
+#define AFMT_VORBIS 0x00080000 /* Not supported */
#define SNDCTL_DSP_SAMPLESIZE SNDCTL_DSP_SETFMT
#define SOUND_PCM_READ_BITS _IOR ('P', 5, int)
#define SNDCTL_DSP_CHANNELS _IOWR('P', 6, int)
@@ -99,6 +103,10 @@
# define DSP_CAP_DIGITALOUT PCM_CAP_DIGITALOUT
# define DSP_CAP_DIGITALIN PCM_CAP_DIGITALIN
# define DSP_CAP_ADMASK PCM_CAP_ADMASK
+# define DSP_CAP_FREERATE PCM_CAP_FREERATE
+# define DSP_CAP_MULTI PCM_CAP_MULTI
+# define DSP_CAP_BIND PCM_CAP_BIND
+# define DSP_CAP_SHADOW PCM_CAP_SHADOW
# define PCM_CAP_REVISION 0x000000ff /* Unused in NetBSD */
# define PCM_CAP_DUPLEX 0x00000100 /* Full duplex */
# define PCM_CAP_REALTIME 0x00000200 /* Unused in NetBSD */
@@ -111,12 +119,21 @@
# define PCM_CAP_MODEM 0x00010000 /* Unused in NetBSD */
# define PCM_CAP_HIDDEN 0x00020000 /* Unused in NetBSD */
# define PCM_CAP_VIRTUAL 0x00040000 /* Unused in NetBSD */
+# define PCM_CAP_MULTI 0x00080000 /* Simultaneous open() */
# define PCM_CAP_ANALOGOUT 0x00100000 /* Unused in NetBSD */
# define PCM_CAP_ANALOGIN 0x00200000 /* Unused in NetBSD */
# define PCM_CAP_DIGITALOUT 0x00400000 /* Unused in NetBSD */
# define PCM_CAP_DIGITALIN 0x00800000 /* Unused in NetBSD */
# define PCM_CAP_ADMASK 0x00f00000 /* Unused in NetBSD */
# define PCM_CAP_SPECIAL 0x01000000 /* Unused in NetBSD */
+# define PCM_CAP_FREERATE 0x10000000 /* Freely set rate */
+# define PCM_CAP_SHADOW 0x40000000 /* Unused in NetBSD */
+# define PCM_CAP_BIND 0x80000000 /* Unused in NetBSD */
+# define DSP_CH_ANY 0x00000000 /* No preferred mode */
+# define DSP_CH_MONO 0x02000000
+# define DSP_CH_STEREO 0x04000000
+# define DSP_CH_MULTI 0x06000000
+# define DSP_CH_MASK 0x06000000
#define SNDCTL_DSP_GETTRIGGER _IOR ('P', 16, int)
#define SNDCTL_DSP_SETTRIGGER _IOW ('P', 16, int)
# define PCM_ENABLE_INPUT 0x00000001
@@ -342,6 +359,11 @@ typedef struct buffmem_desc {
/* Some OSSv4 calls. */
+/* Why is yet more duplication necessary? Sigh. */
+#define OSS_OPEN_READ PCM_ENABLE_INPUT
+#define OSS_OPEN_WRITE PCM_ENABLE_OUTPUT
+#define OSS_OPEN_READWRITE (OSS_OPEN_READ|OSS_OPEN_WRITE)
+
#define OSS_DEVNODE_SIZE 32
#define OSS_LABEL_SIZE 16
#define OSS_LONGNAME_SIZE 64
@@ -357,10 +379,21 @@ typedef struct buffmem_desc {
#define SNDCTL_DSP_GETERROR _IOR ('P',34, struct audio_errinfo)
#define SNDCTL_DSP_CURRENT_IPTR _IOR ('P',35, oss_count_t)
#define SNDCTL_DSP_CURRENT_OPTR _IOR ('P',36, oss_count_t)
+#define SNDCTL_DSP_GET_RECSRC_NAMES _IOR ('P',37, oss_mixer_enuminfo)
+#define SNDCTL_DSP_GET_RECSRC _IOR ('P',38, int)
+#define SNDCTL_DSP_SET_RECSRC _IOWR ('P',38, int)
+#define SNDCTL_DSP_GET_PLAYTGT_NAMES _IOR ('P',39, oss_mixer_enuminfo)
+#define SNDCTL_DSP_GET_PLAYTGT _IOR ('P',40, int)
+#define SNDCTL_DSP_SET_PLAYTGT _IOWR ('P',40, int)
#define SNDCTL_DSP_GET_CHNORDER _IOR ('P',42, unsigned long long)
#define SNDCTL_DSP_SET_CHNORDER _IOWR ('P',42, unsigned long long)
+#define SNDCTL_DSP_HALT_OUTPUT _IO ('P',70)
+#define SNDCTL_DSP_RESET_OUTPUT SNDCTL_DSP_HALT_OUTPUT /* Old name */
+#define SNDCTL_DSP_HALT_INPUT _IO ('P',71)
+#define SNDCTL_DSP_RESET_INPUT SNDCTL_DSP_HALT_INPUT /* Old name */
+
#define CHID_UNDEF 0
#define CHID_L 1
#define CHID_R 2
Home |
Main Index |
Thread Index |
Old Index