Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-1-5]: src/usr.bin/audio/common Pull up revisions 1.1-1.3 (new, re...
details: https://anonhg.NetBSD.org/src/rev/3202c919230c
branches: netbsd-1-5
changeset: 492639:3202c919230c
user: he <he%NetBSD.org@localhost>
date: Tue Jan 29 23:10:14 2002 +0000
description:
Pull up revisions 1.1-1.3 (new, requested by mrg):
Bring in several fixes and enhancements to these tools:
o fix stdin audioplay
o add WAV support to audiorecord
o allows any host to output any endian sample
o don't output a bogus header
o fix a bug in audiorecord -t
o many manual page fixes
o exit immediately on signals
diffstat:
usr.bin/audio/common/wav.c | 201 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 201 insertions(+), 0 deletions(-)
diffs (205 lines):
diff -r f0ebb3b53511 -r 3202c919230c usr.bin/audio/common/wav.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.bin/audio/common/wav.c Tue Jan 29 23:10:14 2002 +0000
@@ -0,0 +1,201 @@
+/* $NetBSD: wav.c,v 1.3.2.2 2002/01/29 23:10:14 he Exp $ */
+
+/*
+ * Copyright (c) 2002 Matthew R. Green
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * WAV support for the audio tools; thanks go to the sox utility for
+ * clearing up issues with WAV files.
+ */
+
+#include <sys/types.h>
+#include <sys/audioio.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "libaudio.h"
+
+struct {
+ int wenc;
+ const char *wname;
+} wavencs[] = {
+ { WAVE_FORMAT_UNKNOWN, "Microsoft Official Unknown" },
+ { WAVE_FORMAT_PCM, "Microsoft PCM" },
+ { WAVE_FORMAT_ADPCM, "Microsoft ADPCM" },
+ { WAVE_FORMAT_ALAW, "Microsoft A-law" },
+ { WAVE_FORMAT_MULAW, "Microsoft U-law" },
+ { WAVE_FORMAT_OKI_ADPCM,"OKI ADPCM" },
+ { WAVE_FORMAT_DIGISTD, "Digistd format" },
+ { WAVE_FORMAT_DIGIFIX, "Digifix format" },
+ { -1, "?Unknown?" },
+};
+
+const char *
+wav_enc_from_val(int encoding)
+{
+ int i;
+
+ for (i = 0; wavencs[i].wenc != -1; i++)
+ if (wavencs[i].wenc == encoding)
+ break;
+ return (wavencs[i].wname);
+}
+
+/*
+ * sample header is:
+ *
+ * RIFF\^@^C^@WAVEfmt ^P^@^@^@^A^@^B^@D<AC>^@^@^P<B1>^B^@^D^@^P^@data^@^@^C^@^@^@^@^@^@^@^@^@^@
+ *
+ */
+/*
+ * WAV format helpers
+ */
+/*
+ * find a .wav header, etc. returns header length on success
+ */
+ssize_t
+audio_wav_parse_hdr(hdr, sz, enc, prec, sample, channels, datasize)
+ void *hdr;
+ size_t sz;
+ int *enc;
+ int *prec;
+ int *sample;
+ int *channels;
+ size_t *datasize;
+{
+ char *where = hdr, *owhere;
+ wav_audioheaderpart part;
+ wav_audioheaderfmt fmt;
+ char *end = (((char *)hdr) + sz);
+ int newenc, newprec;
+ static const char
+ strfmt[4] = "fmt ",
+ strRIFF[4] = "RIFF",
+ strWAVE[4] = "WAVE",
+ strdata[4] = "data";
+
+ if (sz < 32)
+ return (AUDIO_ENOENT);
+
+ if (strncmp(where, strRIFF, sizeof strRIFF))
+ return (AUDIO_ENOENT);
+ where += 8;
+ if (strncmp(where, strWAVE, sizeof strWAVE))
+ return (AUDIO_ENOENT);
+ where += 4;
+
+ do {
+ memcpy(&part, where, sizeof part);
+ owhere = where;
+ where += getle32(part.len) + 8;
+ } while (where < end && strncmp(part.name, strfmt, sizeof strfmt));
+
+ /* too short ? */
+ if (where + sizeof fmt > end)
+ return (AUDIO_ESHORTHDR);
+
+ memcpy(&fmt, (owhere + 8), sizeof fmt);
+
+#if 0
+printf("fmt header is:\n\t%d\ttag\n\t%d\tchannels\n\t%d\tsample rate\n\t%d\tavg_bps\n\t%d\talignment\n\t%d\tbits per sample\n", getle16(fmt.tag), getle16(fmt.channels), getle32(fmt.sample_rate),
getle32(fmt.avg_bps), getle16(fmt.alignment), getle16(fmt.bits_per_sample));
+#endif
+
+ switch (getle16(fmt.tag)) {
+ case WAVE_FORMAT_UNKNOWN:
+ case WAVE_FORMAT_ADPCM:
+ case WAVE_FORMAT_OKI_ADPCM:
+ case WAVE_FORMAT_DIGISTD:
+ case WAVE_FORMAT_DIGIFIX:
+ case IBM_FORMAT_MULAW:
+ case IBM_FORMAT_ALAW:
+ case IBM_FORMAT_ADPCM:
+ default:
+ return (AUDIO_EWAVUNSUPP);
+
+ case WAVE_FORMAT_PCM:
+ switch (getle16(fmt.bits_per_sample)) {
+ case 8:
+ newprec = 8;
+ break;
+ case 16:
+ newprec = 16;
+ break;
+ case 24:
+ newprec = 24;
+ break;
+ case 32:
+ newprec = 32;
+ break;
+ default:
+ return (AUDIO_EWAVBADPCM);
+ }
+ if (newprec == 8)
+ newenc = AUDIO_ENCODING_ULINEAR_LE;
+ else
+ newenc = AUDIO_ENCODING_SLINEAR_LE;
+ break;
+ case WAVE_FORMAT_ALAW:
+ newenc = AUDIO_ENCODING_ALAW;
+ newprec = 8;
+ break;
+ case WAVE_FORMAT_MULAW:
+ newenc = AUDIO_ENCODING_ULAW;
+ newprec = 8;
+ break;
+ }
+
+ do {
+ memcpy(&part, where, sizeof part);
+#if 0
+printf("part `%c%c%c%c' len = %d\n", part.name[0], part.name[1], part.name[2], part.name[3], getle32(part.len));
+#endif
+ owhere = where;
+ where += (getle32(part.len) + 8);
+ } while (where < end && strncmp(part.name, strdata, sizeof strdata));
+
+ if ((where - getle32(part.len)) <= end) {
+ if (channels)
+ *channels = getle16(fmt.channels);
+ if (sample)
+ *sample = getle32(fmt.sample_rate);
+ if (enc)
+ *enc = newenc;
+ if (prec)
+ *prec = newprec;
+ if (datasize)
+ *datasize = (size_t)getle32(part.len);
+ return (owhere - (char *)hdr + 8);
+ }
+ return (AUDIO_EWAVNODATA);
+}
Home |
Main Index |
Thread Index |
Old Index