summaryrefslogtreecommitdiff
path: root/lib/libossaudio
diff options
context:
space:
mode:
authornia <nia@NetBSD.org>2020-10-19 09:01:24 +0000
committernia <nia@NetBSD.org>2020-10-19 09:01:24 +0000
commit2465c59f8ae1076df2e86a6b6c47d5002b16c641 (patch)
treee85cfeb7027575ceafc5f323552034d655694a1a /lib/libossaudio
parentfcf10353dc7a4a0c1153a8c7a5b6ecd28a531dff (diff)
ossaudio(3): Add SNDCTL_DSP_CURRENT_(I|O)PTR
In OSSv4 these are supposed to avoid the wrapping problems with the older GET(I|O)PTR ioctls but we don't quite get the same benefit here. XXX: We could probably fake it by maintaining some state in-between calls.
Diffstat (limited to 'lib/libossaudio')
-rw-r--r--lib/libossaudio/ossaudio.c25
-rw-r--r--lib/libossaudio/soundcard.h10
2 files changed, 32 insertions, 3 deletions
diff --git a/lib/libossaudio/ossaudio.c b/lib/libossaudio/ossaudio.c
index 5a75be4b035..3ba2453a842 100644
--- a/lib/libossaudio/ossaudio.c
+++ b/lib/libossaudio/ossaudio.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ossaudio.c,v 1.49 2020/10/17 23:23:06 nia Exp $ */
+/* $NetBSD: ossaudio.c,v 1.50 2020/10/19 09:01:24 nia Exp $ */
/*-
* Copyright (c) 1997, 2020 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: ossaudio.c,v 1.49 2020/10/17 23:23:06 nia Exp $");
+__RCSID("$NetBSD: ossaudio.c,v 1.50 2020/10/19 09:01:24 nia Exp $");
/*
* This is an Open Sound System compatibility layer, which provides
@@ -121,6 +121,7 @@ audio_ioctl(int fd, unsigned long com, void *argp)
int perrors, rerrors;
static int totalperrors = 0;
static int totalrerrors = 0;
+ oss_count_t osscount;
int idat, idata;
int retval;
@@ -577,6 +578,16 @@ audio_ioctl(int fd, unsigned long com, void *argp)
cntinfo.ptr = tmpoffs.offset;
*(struct count_info *)argp = cntinfo;
break;
+ case SNDCTL_DSP_CURRENT_IPTR:
+ retval = ioctl(fd, AUDIO_GETBUFINFO, &tmpinfo);
+ if (retval < 0)
+ return retval;
+ /* XXX: 'samples' may wrap */
+ memset(osscount.filler, 0, sizeof(osscount.filler));
+ osscount.samples = tmpinfo.record.samples;
+ osscount.fifo_samples = tmpinfo.record.seek;
+ *(oss_count_t *)argp = osscount;
+ break;
case SNDCTL_DSP_GETOPTR:
retval = ioctl(fd, AUDIO_GETOOFFS, &tmpoffs);
if (retval < 0)
@@ -586,6 +597,16 @@ audio_ioctl(int fd, unsigned long com, void *argp)
cntinfo.ptr = tmpoffs.offset;
*(struct count_info *)argp = cntinfo;
break;
+ case SNDCTL_DSP_CURRENT_OPTR:
+ retval = ioctl(fd, AUDIO_GETBUFINFO, &tmpinfo);
+ if (retval < 0)
+ return retval;
+ /* XXX: 'samples' may wrap */
+ memset(osscount.filler, 0, sizeof(osscount.filler));
+ osscount.samples = tmpinfo.play.samples;
+ osscount.fifo_samples = tmpinfo.play.seek;
+ *(oss_count_t *)argp = osscount;
+ break;
case SNDCTL_DSP_SETPLAYVOL:
setvol(fd, INTARG, false);
/* FALLTHRU */
diff --git a/lib/libossaudio/soundcard.h b/lib/libossaudio/soundcard.h
index 9983feb9820..bd60ee19c4e 100644
--- a/lib/libossaudio/soundcard.h
+++ b/lib/libossaudio/soundcard.h
@@ -1,4 +1,4 @@
-/* $NetBSD: soundcard.h,v 1.26 2020/10/17 23:23:06 nia Exp $ */
+/* $NetBSD: soundcard.h,v 1.27 2020/10/19 09:01:24 nia Exp $ */
/*-
* Copyright (c) 1997, 2020 The NetBSD Foundation, Inc.
@@ -326,6 +326,14 @@ typedef struct buffmem_desc {
#define SNDCTL_DSP_SILENCE _IO ('P',32)
#define SNDCTL_DSP_COOKEDMODE _IOW ('P',33, int)
#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)
+
+typedef struct {
+ long long samples;
+ int fifo_samples;
+ int filler[32]; /* "Future use" */
+} oss_count_t;
typedef struct audio_errinfo {
int play_underruns;