Module Name:    src
Committed By:   jmcneill
Date:           Mon Dec 26 21:06:42 UTC 2011

Modified Files:
        src/sys/arch/usermode/conf: GENERIC.common files.usermode
        src/sys/arch/usermode/dev: mainbus.c
        src/sys/arch/usermode/include: mainbus.h thunk.h
        src/sys/arch/usermode/usermode: machdep.c thunk.c

Log Message:
add vaudio(4) audio device driver


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/usermode/conf/GENERIC.common
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/usermode/conf/files.usermode
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/usermode/dev/mainbus.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/usermode/include/mainbus.h
cvs rdiff -u -r1.45 -r1.46 src/sys/arch/usermode/include/thunk.h
cvs rdiff -u -r1.43 -r1.44 src/sys/arch/usermode/usermode/machdep.c
cvs rdiff -u -r1.53 -r1.54 src/sys/arch/usermode/usermode/thunk.c

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

Modified files:

Index: src/sys/arch/usermode/conf/GENERIC.common
diff -u src/sys/arch/usermode/conf/GENERIC.common:1.2 src/sys/arch/usermode/conf/GENERIC.common:1.3
--- src/sys/arch/usermode/conf/GENERIC.common:1.2	Mon Dec 26 12:39:19 2011
+++ src/sys/arch/usermode/conf/GENERIC.common	Mon Dec 26 21:06:42 2011
@@ -1,9 +1,9 @@
-# $NetBSD: GENERIC.common,v 1.2 2011/12/26 12:39:19 jmcneill Exp $
+# $NetBSD: GENERIC.common,v 1.3 2011/12/26 21:06:42 jmcneill Exp $
 
 include "arch/usermode/conf/std.usermode"
 
 options 	INCLUDE_CONFIG_FILE
-#ident 		"GENERIC-$Revision: 1.2 $"
+#ident 		"GENERIC-$Revision: 1.3 $"
 maxusers 	32
 
 makeoptions	DEBUG="-O1 -g3"
@@ -50,6 +50,8 @@ clock0		at mainbus?
 ttycons0	at mainbus?
 ld0		at mainbus?
 veth0		at mainbus?
+vaudio0		at mainbus?
+audio0		at vaudio0
 
 #options		SDL
 #genfb0		at thunkbus?

Index: src/sys/arch/usermode/conf/files.usermode
diff -u src/sys/arch/usermode/conf/files.usermode:1.13 src/sys/arch/usermode/conf/files.usermode:1.14
--- src/sys/arch/usermode/conf/files.usermode:1.13	Mon Dec 26 12:39:19 2011
+++ src/sys/arch/usermode/conf/files.usermode	Mon Dec 26 21:06:42 2011
@@ -1,4 +1,4 @@
-# $NetBSD: files.usermode,v 1.13 2011/12/26 12:39:19 jmcneill Exp $
+# $NetBSD: files.usermode,v 1.14 2011/12/26 21:06:42 jmcneill Exp $
 
 maxpartitions 8
 maxusers 8 16 64
@@ -31,6 +31,10 @@ device	veth { } : arp, ether, ifnet
 attach	veth at thunkbus
 file	arch/usermode/dev/if_veth.c		veth
 
+device	vaudio { } : audiobus, auconv, aurateconv, mulaw
+attach	vaudio at thunkbus
+file	arch/usermode/dev/vaudio.c		vaudio
+
 attach	ld at thunkbus with ld_thunkbus
 file	arch/usermode/dev/ld_thunkbus.c		ld_thunkbus
 

Index: src/sys/arch/usermode/dev/mainbus.c
diff -u src/sys/arch/usermode/dev/mainbus.c:1.6 src/sys/arch/usermode/dev/mainbus.c:1.7
--- src/sys/arch/usermode/dev/mainbus.c:1.6	Mon Dec 26 12:39:19 2011
+++ src/sys/arch/usermode/dev/mainbus.c	Mon Dec 26 21:06:42 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mainbus.c,v 1.6 2011/12/26 12:39:19 jmcneill Exp $ */
+/* $NetBSD: mainbus.c,v 1.7 2011/12/26 21:06:42 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca>
@@ -31,7 +31,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.6 2011/12/26 12:39:19 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.7 2011/12/26 21:06:42 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -57,6 +57,7 @@ CFATTACH_DECL_NEW(mainbus, sizeof(mainbu
 extern char *usermode_root_image_path;
 extern char *usermode_tap_device;
 extern char *usermode_tap_eaddr;
+extern char *usermode_audio_device;
 
 static int
 mainbus_match(device_t parent, cfdata_t match, void *opaque)
@@ -97,6 +98,12 @@ mainbus_attach(device_t parent, device_t
 		config_found_ia(self, "thunkbus", &taa, mainbus_print);
 	}
 
+	if (usermode_audio_device) {
+		taa.taa_type = THUNKBUS_TYPE_VAUDIO;
+		taa.u.vaudio.device = usermode_audio_device;
+		config_found_ia(self, "thunkbus", &taa, mainbus_print);
+	}
+
 	if (usermode_root_image_path) {
 		taa.taa_type = THUNKBUS_TYPE_DISKIMAGE;
 		taa.u.diskimage.path = usermode_root_image_path;

Index: src/sys/arch/usermode/include/mainbus.h
diff -u src/sys/arch/usermode/include/mainbus.h:1.5 src/sys/arch/usermode/include/mainbus.h:1.6
--- src/sys/arch/usermode/include/mainbus.h:1.5	Mon Dec 26 12:39:19 2011
+++ src/sys/arch/usermode/include/mainbus.h	Mon Dec 26 21:06:42 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mainbus.h,v 1.5 2011/12/26 12:39:19 jmcneill Exp $ */
+/* $NetBSD: mainbus.h,v 1.6 2011/12/26 21:06:42 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca>
@@ -37,6 +37,7 @@ struct thunkbus_attach_args {
 #define	THUNKBUS_TYPE_DISKIMAGE	3
 #define THUNKBUS_TYPE_GENFB	4
 #define THUNKBUS_TYPE_VETH	5
+#define THUNKBUS_TYPE_VAUDIO	6
 
 	union {
 		struct {
@@ -46,6 +47,9 @@ struct thunkbus_attach_args {
 			const char *device;
 			const char *eaddr;
 		} veth;
+		struct {
+			const char *device;
+		} vaudio;
 	} u;
 };
 

Index: src/sys/arch/usermode/include/thunk.h
diff -u src/sys/arch/usermode/include/thunk.h:1.45 src/sys/arch/usermode/include/thunk.h:1.46
--- src/sys/arch/usermode/include/thunk.h:1.45	Mon Dec 26 12:39:19 2011
+++ src/sys/arch/usermode/include/thunk.h	Mon Dec 26 21:06:42 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: thunk.h,v 1.45 2011/12/26 12:39:19 jmcneill Exp $ */
+/* $NetBSD: thunk.h,v 1.46 2011/12/26 21:06:42 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <jmcne...@invisible.ca>
@@ -152,6 +152,23 @@ int	thunk_open_tap(const char *);
 int	thunk_pollin_tap(int, int);
 int	thunk_pollout_tap(int, int);
 
+typedef struct {
+	unsigned int		sample_rate;
+	unsigned int		precision;
+	unsigned int		validbits;
+	unsigned int		channels;
+} thunk_audio_config_t;
+
+int	thunk_audio_open(const char *);
+int	thunk_audio_close(int);
+int	thunk_audio_drain(int);
+int	thunk_audio_config(int, const thunk_audio_config_t *,
+			   const thunk_audio_config_t *);
+int	thunk_audio_pollout(int);
+int	thunk_audio_pollin(int);
+int	thunk_audio_write(int, const void *, size_t);
+int	thunk_audio_read(int, void *, size_t);
+
 int	thunk_sdl_init(unsigned int, unsigned int, unsigned short);
 void *	thunk_sdl_getfb(size_t);
 int	thunk_sdl_getchar(void);

Index: src/sys/arch/usermode/usermode/machdep.c
diff -u src/sys/arch/usermode/usermode/machdep.c:1.43 src/sys/arch/usermode/usermode/machdep.c:1.44
--- src/sys/arch/usermode/usermode/machdep.c:1.43	Mon Dec 26 12:39:20 2011
+++ src/sys/arch/usermode/usermode/machdep.c	Mon Dec 26 21:06:42 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.43 2011/12/26 12:39:20 jmcneill Exp $ */
+/* $NetBSD: machdep.c,v 1.44 2011/12/26 21:06:42 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Reinoud Zandijk <rein...@netbsd.org>
@@ -38,7 +38,7 @@
 #include "opt_sdl.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.43 2011/12/26 12:39:20 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.44 2011/12/26 21:06:42 jmcneill Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -67,6 +67,8 @@ char *usermode_root_image_path = NULL;
 static char usermode_tap_devicebuf[PATH_MAX] = "";
 char *usermode_tap_device = NULL;
 char *usermode_tap_eaddr = NULL;
+static char usermode_audio_devicebuf[PATH_MAX] = "";
+char *usermode_audio_device = NULL;
 
 void	main(int argc, char *argv[]);
 void	usermode_reboot(void);
@@ -116,6 +118,19 @@ main(int argc, char *argv[])
 					    "%s", tap);
 				usermode_tap_device = usermode_tap_devicebuf;
 				usermode_tap_eaddr = mac;
+			} else if (strncmp(argv[i], "audio=",
+			    strlen("audio=")) == 0) {
+				char *audio = argv[i] + strlen("audio=");
+				if (*audio != '/')
+					snprintf(usermode_audio_devicebuf,
+					    sizeof(usermode_audio_devicebuf),
+					    "/dev/%s", audio);
+				else
+					snprintf(usermode_audio_devicebuf,
+					    sizeof(usermode_audio_devicebuf),
+					    "%s", audio);
+				usermode_audio_device =
+				    usermode_audio_devicebuf;
 			} else {
 				usermode_root_image_path = argv[i];
 			}

Index: src/sys/arch/usermode/usermode/thunk.c
diff -u src/sys/arch/usermode/usermode/thunk.c:1.53 src/sys/arch/usermode/usermode/thunk.c:1.54
--- src/sys/arch/usermode/usermode/thunk.c:1.53	Mon Dec 26 14:50:27 2011
+++ src/sys/arch/usermode/usermode/thunk.c	Mon Dec 26 21:06:42 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: thunk.c,v 1.53 2011/12/26 14:50:27 jmcneill Exp $ */
+/* $NetBSD: thunk.c,v 1.54 2011/12/26 21:06:42 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <jmcne...@invisible.ca>
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifdef __NetBSD__
-__RCSID("$NetBSD: thunk.c,v 1.53 2011/12/26 14:50:27 jmcneill Exp $");
+__RCSID("$NetBSD: thunk.c,v 1.54 2011/12/26 21:06:42 jmcneill Exp $");
 #endif
 
 #include <sys/types.h>
@@ -37,6 +37,7 @@ __RCSID("$NetBSD: thunk.c,v 1.53 2011/12
 #include <sys/poll.h>
 #include <sys/sysctl.h>
 #include <sys/socket.h>
+#include <sys/audioio.h>
 #include <machine/vmparam.h>
 
 #include <net/if.h>
@@ -760,3 +761,86 @@ thunk_pollout_tap(int fd, int timeout)
 
 	return poll(fds, __arraycount(fds), timeout);
 }
+
+int
+thunk_audio_open(const char *path)
+{
+	return open(path, O_RDWR);
+}
+
+int
+thunk_audio_close(int fd)
+{
+	return close(fd);
+}
+
+int
+thunk_audio_drain(int fd)
+{
+	return ioctl(fd, AUDIO_DRAIN, 0);
+}
+
+int
+thunk_audio_config(int fd, const thunk_audio_config_t *pconf,
+    const thunk_audio_config_t *rconf)
+{
+	struct audio_info info;
+	int error;
+
+	AUDIO_INITINFO(&info);
+	info.play.sample_rate = pconf->sample_rate;
+	info.play.channels = pconf->channels;
+	info.play.precision = pconf->precision;
+	info.play.encoding = AUDIO_ENCODING_SLINEAR_LE;
+	info.record.sample_rate = rconf->sample_rate;
+	info.record.channels = rconf->channels;
+	info.record.precision = rconf->precision;
+	info.record.encoding = AUDIO_ENCODING_SLINEAR_LE;
+	info.mode = AUMODE_PLAY_ALL|AUMODE_RECORD;
+
+	error = ioctl(fd, AUDIO_SETINFO, &info);
+	if (error)
+		printf("AUDIO_SETINFO failed: %s\n", strerror(errno));
+
+	return error;
+}
+
+int
+thunk_audio_pollout(int fd)
+{
+	struct audio_info info;
+	int error;
+
+	AUDIO_INITINFO(&info);
+	error = ioctl(fd, AUDIO_GETBUFINFO, &info);
+	if (error)
+		return -1;
+
+	return info.play.buffer_size - info.play.seek;
+}
+
+int
+thunk_audio_pollin(int fd)
+{
+	struct audio_info info;
+	int error;
+
+	AUDIO_INITINFO(&info);
+	error = ioctl(fd, AUDIO_GETBUFINFO, &info);
+	if (error)
+		return -1;
+
+	return info.record.seek;
+}
+
+int
+thunk_audio_write(int fd, const void *buf, size_t buflen)
+{
+	return write(fd, buf, buflen);
+}
+
+int
+thunk_audio_read(int fd, void *buf, size_t buflen)
+{
+	return read(fd, buf, buflen);
+}

Reply via email to