Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libossaudio ossaudio(3): Add SNDCTL_DSP_CURRENT_(I|O)PTR



details:   https://anonhg.NetBSD.org/src/rev/7181063f520b
branches:  trunk
changeset: 956024:7181063f520b
user:      nia <nia%NetBSD.org@localhost>
date:      Mon Oct 19 09:01:24 2020 +0000

description:
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:

 lib/libossaudio/ossaudio.c  |  25 +++++++++++++++++++++++--
 lib/libossaudio/soundcard.h |  10 +++++++++-
 2 files changed, 32 insertions(+), 3 deletions(-)

diffs (84 lines):

diff -r 6636689cc9c3 -r 7181063f520b lib/libossaudio/ossaudio.c
--- a/lib/libossaudio/ossaudio.c        Mon Oct 19 07:44:52 2020 +0000
+++ b/lib/libossaudio/ossaudio.c        Mon Oct 19 09:01:24 2020 +0000
@@ -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 @@
        int perrors, rerrors;
        static int totalperrors = 0;
        static int totalrerrors = 0;
+       oss_count_t osscount;
        int idat, idata;
        int retval;
 
@@ -577,6 +578,16 @@
                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 @@
                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 -r 6636689cc9c3 -r 7181063f520b lib/libossaudio/soundcard.h
--- a/lib/libossaudio/soundcard.h       Mon Oct 19 07:44:52 2020 +0000
+++ b/lib/libossaudio/soundcard.h       Mon Oct 19 09:01:24 2020 +0000
@@ -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 @@
 #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;



Home | Main Index | Thread Index | Old Index