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.
This commit is contained in:
nia 2020-10-19 09:01:24 +00:00
parent 2256753ef0
commit 27ca241ed7
2 changed files with 32 additions and 3 deletions

View File

@ -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 */

View File

@ -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;