From 27ca241ed7b8d8474bed314a19d7e631a884f546 Mon Sep 17 00:00:00 2001 From: nia Date: Mon, 19 Oct 2020 09:01:24 +0000 Subject: [PATCH] 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. --- lib/libossaudio/ossaudio.c | 25 +++++++++++++++++++++++-- lib/libossaudio/soundcard.h | 10 +++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/lib/libossaudio/ossaudio.c b/lib/libossaudio/ossaudio.c index 5a75be4b0357..3ba2453a8425 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 -__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 9983feb98205..bd60ee19c4e3 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;