Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/audio add support for playing IEEE float32 and float...
details: https://anonhg.NetBSD.org/src/rev/3c99208c62f9
branches: trunk
changeset: 460900:3c99208c62f9
user: mrg <mrg%NetBSD.org@localhost>
date: Sat Nov 09 12:46:44 2019 +0000
description:
add support for playing IEEE float32 and float64 RIFF WAVE
samples on platforms that have these types natively, and
can handle signed linear 32 bit samples. explicitly
disabled on vax, run-or-compile-time sizeof() check
disabled for everyone else
now i can play a float32 .wav file i found.
float64 not tested.
copyright maint, update HISTORY, update audio drivers list.
diffstat:
usr.bin/audio/common/audio.c | 8 +-
usr.bin/audio/common/libaudio.h | 18 ++++-
usr.bin/audio/common/sun.c | 6 +-
usr.bin/audio/common/wav.c | 21 +++++-
usr.bin/audio/play/audioplay.1 | 47 ++++++++++++-
usr.bin/audio/play/play.c | 136 ++++++++++++++++++++++++++++++++++++---
6 files changed, 209 insertions(+), 27 deletions(-)
diffs (truncated from 487 to 300 lines):
diff -r 932a49eff5d4 -r 3c99208c62f9 usr.bin/audio/common/audio.c
--- a/usr.bin/audio/common/audio.c Fri Nov 08 14:28:07 2019 +0000
+++ b/usr.bin/audio/common/audio.c Sat Nov 09 12:46:44 2019 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: audio.c,v 1.25 2015/08/05 06:54:39 mrg Exp $ */
+/* $NetBSD: audio.c,v 1.26 2019/11/09 12:46:44 mrg Exp $ */
/*
- * Copyright (c) 1999 Matthew R. Green
+ * Copyright (c) 1999, 2013, 2015, 2019 Matthew R. Green
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: audio.c,v 1.25 2015/08/05 06:54:39 mrg Exp $");
+__RCSID("$NetBSD: audio.c,v 1.26 2019/11/09 12:46:44 mrg Exp $");
#endif
@@ -110,6 +110,8 @@
{ AudioEmpeg_l2_packets,AUDIO_ENCODING_MPEG_L2_PACKETS },
{ AudioEmpeg_l2_system, AUDIO_ENCODING_MPEG_L2_SYSTEM },
{ AudioEac3, AUDIO_ENCODING_AC3 },
+ { "ieee_float32", AUDIO_ENCODING_LIBAUDIO_FLOAT32 },
+ { "ieee_float64", AUDIO_ENCODING_LIBAUDIO_FLOAT64 },
{ NULL, -1 }
};
diff -r 932a49eff5d4 -r 3c99208c62f9 usr.bin/audio/common/libaudio.h
--- a/usr.bin/audio/common/libaudio.h Fri Nov 08 14:28:07 2019 +0000
+++ b/usr.bin/audio/common/libaudio.h Sat Nov 09 12:46:44 2019 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: libaudio.h,v 1.20 2015/08/05 06:54:39 mrg Exp $ */
+/* $NetBSD: libaudio.h,v 1.21 2019/11/09 12:46:44 mrg Exp $ */
/*
- * Copyright (c) 1999, 2009 Matthew R. Green
+ * Copyright (c) 1999, 2009, 2013, 2015, 2019 Matthew R. Green
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -37,6 +37,17 @@
int audio_format_from_str (char *);
/*
+ * Audio encoding formats; this is a additional to those set
+ * in sys/audioio.h, but with a large offset to avoid future
+ * conflicts (additional ones are libaudio-software only.)
+ *
+ * This is to support floating-point WAV files. These require
+ * software conversion to a supported format.
+ */
+#define AUDIO_ENCODING_LIBAUDIO_FLOAT32 1001 /* 32-bit IEEE FP. */
+#define AUDIO_ENCODING_LIBAUDIO_FLOAT64 1002 /* 64-bit IEEE FP. */
+
+/*
* We copy the Sun/NeXT on-disk audio header format and document what
* we know of it here.
*
@@ -107,10 +118,11 @@
#define WAVAUDIO_FILE_MAGIC_FMT ((u_int32_t)0x666d7420)
#define WAVAUDIO_FILE_MAGIC_DATA ((u_int32_t)0x64617461)
-/* purloined from public Microsoft RIFF docs via sox or mplayer */
+/* purloined from public Microsoft RIFF docs via sox, mplayer, or directly */
#define WAVE_FORMAT_UNKNOWN (0x0000)
#define WAVE_FORMAT_PCM (0x0001)
#define WAVE_FORMAT_ADPCM (0x0002)
+#define WAVE_FORMAT_IEEE_FLOAT (0x0003)
#define WAVE_FORMAT_ALAW (0x0006)
#define WAVE_FORMAT_MULAW (0x0007)
#define WAVE_FORMAT_OKI_ADPCM (0x0010)
diff -r 932a49eff5d4 -r 3c99208c62f9 usr.bin/audio/common/sun.c
--- a/usr.bin/audio/common/sun.c Fri Nov 08 14:28:07 2019 +0000
+++ b/usr.bin/audio/common/sun.c Sat Nov 09 12:46:44 2019 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: sun.c,v 1.9 2015/08/05 06:54:39 mrg Exp $ */
+/* $NetBSD: sun.c,v 1.10 2019/11/09 12:46:44 mrg Exp $ */
/*
- * Copyright (c) 2002 Matthew R. Green
+ * Copyright (c) 2002, 2013, 2015 Matthew R. Green
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: sun.c,v 1.9 2015/08/05 06:54:39 mrg Exp $");
+__RCSID("$NetBSD: sun.c,v 1.10 2019/11/09 12:46:44 mrg Exp $");
#endif
diff -r 932a49eff5d4 -r 3c99208c62f9 usr.bin/audio/common/wav.c
--- a/usr.bin/audio/common/wav.c Fri Nov 08 14:28:07 2019 +0000
+++ b/usr.bin/audio/common/wav.c Sat Nov 09 12:46:44 2019 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: wav.c,v 1.14 2017/11/25 17:18:15 jdolecek Exp $ */
+/* $NetBSD: wav.c,v 1.15 2019/11/09 12:46:44 mrg Exp $ */
/*
- * Copyright (c) 2002, 2009 Matthew R. Green
+ * Copyright (c) 2002, 2009, 2013, 2015, 2019 Matthew R. Green
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -33,7 +33,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: wav.c,v 1.14 2017/11/25 17:18:15 jdolecek Exp $");
+__RCSID("$NetBSD: wav.c,v 1.15 2019/11/09 12:46:44 mrg Exp $");
#endif
@@ -60,6 +60,7 @@
{ WAVE_FORMAT_UNKNOWN, "Microsoft Official Unknown" },
{ WAVE_FORMAT_PCM, "Microsoft PCM" },
{ WAVE_FORMAT_ADPCM, "Microsoft ADPCM" },
+ { WAVE_FORMAT_IEEE_FLOAT,"Microsoft IEEE Floating-Point" },
{ WAVE_FORMAT_ALAW, "Microsoft A-law" },
{ WAVE_FORMAT_MULAW, "Microsoft mu-law" },
{ WAVE_FORMAT_OKI_ADPCM,"OKI ADPCM" },
@@ -188,6 +189,20 @@
newenc = AUDIO_ENCODING_ULAW;
newprec = 8;
break;
+ case WAVE_FORMAT_IEEE_FLOAT:
+ switch (getle16(fmt.bits_per_sample)) {
+ case 32:
+ newenc = AUDIO_ENCODING_LIBAUDIO_FLOAT32;
+ newprec = 32;
+ break;
+ case 64:
+ newenc = AUDIO_ENCODING_LIBAUDIO_FLOAT64;
+ newprec = 32;
+ break;
+ default:
+ return (AUDIO_EWAVBADPCM);
+ }
+ break;
}
do {
diff -r 932a49eff5d4 -r 3c99208c62f9 usr.bin/audio/play/audioplay.1
--- a/usr.bin/audio/play/audioplay.1 Fri Nov 08 14:28:07 2019 +0000
+++ b/usr.bin/audio/play/audioplay.1 Sat Nov 09 12:46:44 2019 +0000
@@ -1,6 +1,6 @@
-.\" $NetBSD: audioplay.1,v 1.26 2014/03/18 18:20:44 riastradh Exp $
+.\" $NetBSD: audioplay.1,v 1.27 2019/11/09 12:46:44 mrg Exp $
.\"
-.\" Copyright (c) 1998, 1999, 2002, 2010 Matthew R. Green
+.\" Copyright (c) 1998, 1999, 2002, 2010, 2019 Matthew R. Green
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -24,7 +24,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd December 30, 2010
+.Dd November 8, 2019
.Dt AUDIOPLAY 1
.Os
.Sh NAME
@@ -172,6 +172,15 @@
can be configured in the
.Dq Netscape
web browser as the program to use when playing audio files.
+.Pp
+In addition to the audio driver encodings list in the EXAMPLES section,
+.Nm
+supports playing IEEE floating point data in RIFF WAVE audio files
+(with one caveat that the flaoting point size must be native.)
+In this case
+.Nm
+converts the floating point data into signed linear samples before
+they are passed to the chosen audio device.
.Sh ERRORS
If the audio device or the control device can not be opened, and error is
returned.
@@ -182,29 +191,55 @@
.Sh SEE ALSO
.Xr audioctl 1 ,
.Xr audiorecord 1 ,
+.Xr aica 4 ,
+.Xr arcofi 4 ,
.Xr aria 4 ,
.Xr audio 4 ,
.Xr audioamd 4 ,
.Xr auich 4 ,
+.Xr auixp 4 ,
+.Xr ausoc 4 ,
.Xr autri 4 ,
.Xr auvia 4 ,
+.Xr awacs 4 ,
+.Xr bba 4 ,
+.Xr btsco 4 ,
.Xr clcs 4 ,
.Xr clct 4 ,
.Xr cmpci 4 ,
+.Xr dbri 4 ,
.Xr eap 4 ,
.Xr emuxki 4 ,
.Xr esm 4 ,
.Xr eso 4 ,
.Xr ess 4 ,
.Xr fms 4 ,
+.Xr gcscaudio 4 ,
.Xr gus 4 ,
.Xr guspnp 4 ,
+.Xr haltwo 4 ,
+.Xr harmony 4 ,
+.Xr hdafg 4 ,
+.Xr mavb 4 ,
.Xr neo 4 ,
+.Xr pad 4 ,
+.Xr pas 4 ,
+.Xr paud 4 ,
+.Xr repluse 4 ,
.Xr sb 4 ,
+.Xr snapper 4 ,
.Xr sv 4 ,
+.Xr toccata 4 ,
+.Xr uaudio 4 ,
+.Xr vaudio 4 ,
+.Xr vcaudio 4 ,
+.Xr vraiu 4 ,
+.Xr vs 4 ,
+.Xr vsaudio 4 ,
.Xr wss 4 ,
.Xr yds 4 ,
-.Xr ym 4
+.Xr ym 4 ,
+.Xr zaudio 4
.Sh HISTORY
The
.Nm
@@ -214,6 +249,10 @@
.Nm
was first made available in
.Nx 1.4 .
+Support for RIFF WAVE recording was introduced in
+.Nx 1.6 .
+Support for RIFF WAVE IEEE floating point data was introduced in
+.Nx 10.0 .
.Sh AUTHORS
The
.Nm
diff -r 932a49eff5d4 -r 3c99208c62f9 usr.bin/audio/play/play.c
--- a/usr.bin/audio/play/play.c Fri Nov 08 14:28:07 2019 +0000
+++ b/usr.bin/audio/play/play.c Sat Nov 09 12:46:44 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: play.c,v 1.57 2019/05/04 08:27:30 isaki Exp $ */
+/* $NetBSD: play.c,v 1.58 2019/11/09 12:46:44 mrg Exp $ */
/*
* Copyright (c) 1999, 2000, 2001, 2002, 2010 Matthew R. Green
@@ -28,10 +28,9 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: play.c,v 1.57 2019/05/04 08:27:30 isaki Exp $");
+__RCSID("$NetBSD: play.c,v 1.58 2019/11/09 12:46:44 mrg Exp $");
#endif
-
#include <sys/param.h>
#include <sys/audioio.h>
#include <sys/ioctl.h>
@@ -51,10 +50,14 @@
#include "libaudio.h"
+typedef size_t (*convert)(void *inbuf, void *outbuf, size_t len);
+
static void usage(void) __dead;
static void play(char *);
static void play_fd(const char *, int);
-static ssize_t audioctl_write_fromhdr(void *, size_t, int, off_t *, const char *);
+static ssize_t audioctl_write_fromhdr(void *, size_t, int,
+ off_t *, const char *,
+ convert *);
static void cleanup(int) __dead;
static audio_info_t info;
@@ -214,9 +217,90 @@
exit(exitstatus);
}
+#ifndef __vax__
+static size_t
+float32_to_linear32(void *inbuf, void *outbuf, size_t len)
+{
+ uint8_t *inbuf8 = inbuf, *end = inbuf8 + len;
+ uint8_t *outbuf8 = outbuf;
Home |
Main Index |
Thread Index |
Old Index