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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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);
+}