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); +}