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:
parent
2256753ef0
commit
27ca241ed7
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue