Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/audio/play try using normal read/write is mmap() fai...
details: https://anonhg.NetBSD.org/src/rev/9074fce197f0
branches: trunk
changeset: 471849:9074fce197f0
user: mrg <mrg%NetBSD.org@localhost>
date: Tue Apr 13 07:21:45 1999 +0000
description:
try using normal read/write is mmap() fails. tell the VM system we are going to be doing sequential access via madvise().
diffstat:
usr.bin/audio/play/play.c | 139 +++++++++++++++++++++++++++++----------------
1 files changed, 90 insertions(+), 49 deletions(-)
diffs (211 lines):
diff -r 5bc20b4dd067 -r 9074fce197f0 usr.bin/audio/play/play.c
--- a/usr.bin/audio/play/play.c Tue Apr 13 06:45:36 1999 +0000
+++ b/usr.bin/audio/play/play.c Tue Apr 13 07:21:45 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: play.c,v 1.8 1999/04/02 16:05:55 augustss Exp $ */
+/* $NetBSD: play.c,v 1.9 1999/04/13 07:21:45 mrg Exp $ */
/*
* Copyright (c) 1999 Matthew R. Green
@@ -47,6 +47,7 @@
int main __P((int, char *[]));
void usage __P((void));
+void play_fd __P((int, char *));
ssize_t audioctl_write_fromhdr __P((void *, size_t, int));
audio_info_t info;
@@ -61,16 +62,17 @@
int channels;
char const *play_errstring = NULL;
+size_t bufsize;
+int audiofd, ctlfd;
int
main(argc, argv)
int argc;
char *argv[];
{
- size_t len, bufsize;
- ssize_t hdrlen;
+ size_t len;
off_t filesize;
- int ch, audiofd, ctlfd;
+ int ch;
int iflag = 0;
int qflag = 0;
int verbose = 0;
@@ -160,11 +162,11 @@
audiofd = open(device, O_WRONLY);
#ifdef _PATH_OAUDIO
- /* Allow the non-unit device to be used. */
- if (audiofd < 0 && device == _PATH_AUDIO) {
- device = _PATH_OAUDIO;
- ctldev = _PATH_OAUDIOCTL;
- audiofd = open(device, O_WRONLY);
+ /* Allow the non-unit device to be used. */
+ if (audiofd < 0 && device == _PATH_AUDIO) {
+ device = _PATH_OAUDIO;
+ ctldev = _PATH_OAUDIOCTL;
+ audiofd = open(device, O_WRONLY);
}
#endif
if (audiofd < 0)
@@ -185,6 +187,8 @@
void *addr, *oaddr;
do {
+ ssize_t hdrlen;
+
fd = open(*argv, O_RDONLY);
if (fd < 0)
err(1, "could not open %s", *argv);
@@ -195,12 +199,30 @@
oaddr = addr = mmap(0, (size_t)filesize, PROT_READ,
MAP_SHARED, fd, 0);
- if (addr == (void *)-1)
- err(1, "could not mmap %s", *argv);
+ /*
+ * if we failed to mmap the file, try to read it
+ * instead, so that filesystems, etc, that do not
+ * support mmap() work
+ */
+ if (addr == (void *)-1) {
+ play_fd(fd, *argv);
+ close(fd);
+ continue;
+ }
+
+ /*
+ * give the VM system a bit of a hint about the type
+ * of accesses we will make.
+ */
+ if (madvise(addr, filesize, MADV_SEQUENTIAL) < 0)
+ warn("madvise failed, ignoring");
+
+ /*
+ * get the header length and set up the audio device
+ */
if ((hdrlen = audioctl_write_fromhdr(addr,
(size_t)filesize, ctlfd)) < 0) {
-play_error:
if (play_errstring)
errx(1, "%s: %s", play_errstring, *argv);
else
@@ -219,7 +241,8 @@
if (write(audiofd, addr, (size_t)filesize) != (ssize_t)filesize)
err(1, "final write failed");
- ioctl(audiofd, AUDIO_DRAIN);
+ if (ioctl(audiofd, AUDIO_DRAIN) < 0)
+ warn("audio drain ioctl failed");
if (munmap(oaddr, (size_t)filesize) < 0)
err(1, "munmap failed");
@@ -227,48 +250,66 @@
} while (*++argv);
} else {
- char *buffer = malloc(bufsize);
- int n, m;
-
- if (buffer == NULL)
- err(1, "malloc of read buffer failed");
-
- n = read(STDIN_FILENO, buffer, bufsize);
-
- if (n < 0)
- err(1, "read of standard input failed");
- if (n == 0)
- errx(1, "EOF on standard input");
-
- hdrlen = audioctl_write_fromhdr(buffer, n, ctlfd);
- if (hdrlen < 0)
- goto play_error;
-
- /* advance the buffer if we have to */
- if (hdrlen > 0) {
- /* shouldn't happen */
- if (hdrlen > n)
- err(1, "bogus hdrlen %d > length %d?", (int)hdrlen, n);
-
- memmove(buffer, buffer + hdrlen, n - hdrlen);
-
- m = read(STDIN_FILENO, buffer + n, hdrlen);
- n += m;
- }
- /* read until EOF or error */
- do {
- if (n == -1)
- err(1, "read of standard input failed");
- if (write(audiofd, buffer, n) != n)
- err(1, "write failed");
- } while ((n = read(STDIN_FILENO, buffer, bufsize)));
- ioctl(audiofd, AUDIO_DRAIN);
+ play_fd(STDIN_FILENO, "standard input");
}
exit(0);
}
/*
+ * play the file on on the file descriptor fd
+ */
+void
+play_fd(fd, file)
+ int fd;
+ char *file;
+{
+ char *buffer = malloc(bufsize);
+ ssize_t hdrlen;
+ int n, m;
+
+ if (buffer == NULL)
+ err(1, "malloc of read buffer failed");
+
+ n = read(fd, buffer, bufsize);
+
+ if (n < 0)
+ err(1, "read of standard input failed");
+ if (n == 0)
+ errx(1, "EOF on standard input");
+
+ hdrlen = audioctl_write_fromhdr(buffer, n, ctlfd);
+ if (hdrlen < 0) {
+ if (play_errstring)
+ errx(1, "%s: %s", play_errstring, file);
+ else
+ errx(1, "unknown audio file: %s", file);
+ }
+
+ /* advance the buffer if we have to */
+ if (hdrlen > 0) {
+ /* shouldn't happen */
+ if (hdrlen > n)
+ err(1, "bogus hdrlen %d > length %d?", (int)hdrlen, n);
+
+ memmove(buffer, buffer + hdrlen, n - hdrlen);
+
+ m = read(fd, buffer + n, hdrlen);
+ n += m;
+ }
+ /* read until EOF or error */
+ do {
+ if (n == -1)
+ err(1, "read of standard input failed");
+ if (write(audiofd, buffer, n) != n)
+ err(1, "write failed");
+ } while ((n = read(fd, buffer, bufsize)));
+
+ if (ioctl(audiofd, AUDIO_DRAIN) < 0)
+ warn("audio drain ioctl failed");
+}
+
+/*
* only support sun and wav audio files so far ...
*
* XXX this should probably be mostly part of libaudio, but it
Home |
Main Index |
Thread Index |
Old Index