Module Name:    src
Committed By:   nia
Date:           Tue Nov  3 09:46:01 UTC 2020

Modified Files:
        src/lib/libossaudio: ossaudio.c

Log Message:
ossaudio(3): Reduce code duplication for querying capabilities


To generate a diff of this commit:
cvs rdiff -u -r1.61 -r1.62 src/lib/libossaudio/ossaudio.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libossaudio/ossaudio.c
diff -u src/lib/libossaudio/ossaudio.c:1.61 src/lib/libossaudio/ossaudio.c:1.62
--- src/lib/libossaudio/ossaudio.c:1.61	Tue Nov  3 09:36:12 2020
+++ src/lib/libossaudio/ossaudio.c	Tue Nov  3 09:46:00 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ossaudio.c,v 1.61 2020/11/03 09:36:12 nia Exp $	*/
+/*	$NetBSD: ossaudio.c,v 1.62 2020/11/03 09:46:00 nia Exp $	*/
 
 /*-
  * Copyright (c) 1997, 2020 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: ossaudio.c,v 1.61 2020/11/03 09:36:12 nia Exp $");
+__RCSID("$NetBSD: ossaudio.c,v 1.62 2020/11/03 09:46:00 nia Exp $");
 
 /*
  * This is an Open Sound System compatibility layer, which provides
@@ -71,6 +71,8 @@ static int getaudiocount(void);
 static int getmixercount(void);
 static int getmixercontrolcount(int);
 
+static int getcaps(int, int *);
+
 static int getvol(u_int, u_char);
 static void setvol(int, int, bool);
 
@@ -126,7 +128,7 @@ audio_ioctl(int fd, unsigned long com, v
 	static int totalperrors = 0;
 	static int totalrerrors = 0;
 	oss_count_t osscount;
-	int idat, idata;
+	int idat;
 	int retval;
 
 	idat = 0;
@@ -520,19 +522,9 @@ audio_ioctl(int fd, unsigned long com, v
 			return retval;
 		break;
 	case SNDCTL_DSP_GETCAPS:
-		retval = ioctl(fd, AUDIO_GETPROPS, &idata);
+		retval = getcaps(fd, (int *)argp);
 		if (retval < 0)
 			return retval;
-		idat = DSP_CAP_TRIGGER;
-		if (idata & AUDIO_PROP_FULLDUPLEX)
-			idat |= DSP_CAP_DUPLEX;
-		if (idata & AUDIO_PROP_MMAP)
-			idat |= DSP_CAP_MMAP;
-		if (idata & AUDIO_PROP_CAPTURE)
-			idat |= DSP_CAP_INPUT;
-		if (idata & AUDIO_PROP_PLAYBACK)
-			idat |= DSP_CAP_OUTPUT;
-		INTARG = idat;
 		break;
 	case SNDCTL_DSP_SETTRIGGER:
 		retval = ioctl(fd, AUDIO_GETBUFINFO, &tmpinfo);
@@ -1018,7 +1010,6 @@ mixer_oss4_ioctl(int fd, unsigned long c
 	int newfd = -1, tmperrno;
 	int i, noffs;
 	int retval;
-	int props, caps;
 
 	/*
 	 * Note: it is difficult to translate the NetBSD concept of a "set"
@@ -1075,27 +1066,16 @@ mixer_oss4_ioctl(int fd, unsigned long c
 			errno = tmperrno;
 			return retval;
 		}
-		retval = ioctl(newfd, AUDIO_GETPROPS, &props);
-		if (retval < 0) {
+		if (getcaps(newfd, &tmpai->caps) < 0) {
 			tmperrno = errno;
 			close(newfd);
 			errno = tmperrno;
 			return retval;
 		}
-		caps = DSP_CAP_TRIGGER;
-		if (props & AUDIO_PROP_FULLDUPLEX)
-			caps |= DSP_CAP_DUPLEX;
-		if (props & AUDIO_PROP_MMAP)
-			caps |= DSP_CAP_MMAP;
-		if (props & AUDIO_PROP_CAPTURE)
-			caps |= PCM_CAP_INPUT;
-		if (props & AUDIO_PROP_PLAYBACK)
-			caps |= PCM_CAP_OUTPUT;
 		snprintf(tmpai->name, sizeof(tmpai->name),
 		    "%s %s", dev.name, dev.version);
 		tmpai->busy = 0;
 		tmpai->pid = -1;
-		tmpai->caps = caps;
 		ioctl(newfd, SNDCTL_DSP_GETFMTS, &tmpai->iformats);
 		tmpai->oformats = tmpai->iformats;
 		tmpai->magic = -1; /* reserved for "internal use" */
@@ -1576,6 +1556,29 @@ global_oss4_ioctl(int fd, unsigned long 
 }
 
 static int
+getcaps(int fd, int *out)
+{
+	int props, caps;
+
+	if (ioctl(fd, AUDIO_GETPROPS, &props) < 0)
+		return -1;
+
+	caps = DSP_CAP_TRIGGER;
+
+	if (props & AUDIO_PROP_FULLDUPLEX)
+		caps |= DSP_CAP_DUPLEX;
+	if (props & AUDIO_PROP_MMAP)
+		caps |= DSP_CAP_MMAP;
+	if (props & AUDIO_PROP_CAPTURE)
+		caps |= PCM_CAP_INPUT;
+	if (props & AUDIO_PROP_PLAYBACK)
+		caps |= PCM_CAP_OUTPUT;
+
+	*out = caps;
+	return 0;
+}
+
+static int
 getaudiocount(void)
 {
 	char devname[32];

Reply via email to