* NSP support
@ 2020-08-02 0:26 Jim O'Regan
2020-08-24 12:21 ` Jim O'Regan
0 siblings, 1 reply; 2+ messages in thread
From: Jim O'Regan @ 2020-08-02 0:26 UTC (permalink / raw)
To: sox-devel
[-- Attachment #1.1: Type: text/plain, Size: 214 bytes --]
Hi.
I did this a few years ago to convert some old files created with
Wavesurfer. I've just checked that the patch applies. It's also in a branch
on github, here: https://github.com/jimregan/sox-nsp/tree/nsp-flat
[-- Attachment #1.2: Type: text/html, Size: 333 bytes --]
[-- Attachment #2: NSP.patch --]
[-- Type: application/octet-stream, Size: 7512 bytes --]
From d8aecb8522423c53fa954694b7684bdc4da95a80 Mon Sep 17 00:00:00 2001
From: Jim O'Regan <jaoregan@tcd.ie>
Date: Sun, 10 Mar 2019 11:45:01 +0100
Subject: [PATCH] NSP format support
---
src/CMakeLists.txt | 1 +
src/Makefile.am | 2 +-
src/formats.c | 1 +
src/formats.h | 1 +
src/nsp.c | 178 +++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 182 insertions(+), 1 deletion(-)
create mode 100644 src/nsp.c
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index bde10d6a..24588c3e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -108,6 +108,7 @@ set(formats_srcs
lu-fmt
maud
nulfile
+ nsp
prc
raw
raw-fmt
diff --git a/src/Makefile.am b/src/Makefile.am
index cd44ae4d..ac7726cf 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -121,7 +121,7 @@ libsox_la_SOURCES += raw-fmt.c s1-fmt.c s2-fmt.c s3-fmt.c \
lu-fmt.c 8svx.c aiff-fmt.c aifc-fmt.c au.c avr.c cdr.c cvsd-fmt.c \
dvms-fmt.c dat.c hcom.c htk.c maud.c prc.c sf.c smp.c \
sounder.c soundtool.c sphere.c tx16w.c voc.c vox-fmt.c ima-fmt.c adpcm.c adpcm.h \
- ima_rw.c ima_rw.h wav.c wve.c xa.c nulfile.c f4-fmt.c f8-fmt.c gsrt.c
+ ima_rw.c ima_rw.h wav.c wve.c xa.c nulfile.c f4-fmt.c f8-fmt.c gsrt.c nsp.c
libsox_la_LIBADD += @GSM_LIBS@ @LIBGSM_LIBADD@
libsox_la_LIBADD += @LPC10_LIBS@ @LIBLPC10_LIBADD@
diff --git a/src/formats.c b/src/formats.c
index f3efe764..ee63a388 100644
--- a/src/formats.c
+++ b/src/formats.c
@@ -67,6 +67,7 @@ static char const * auto_detect_format(sox_format_t * ft, char const * ext)
CHECK(aifc , 0, 4, "FORM" , 8, 4, "AIFC")
CHECK(8svx , 0, 4, "FORM" , 8, 4, "8SVX")
CHECK(maud , 0, 4, "FORM" , 8, 4, "MAUD")
+ CHECK(nsp , 0, 4, "FORM" , 4, 4, "DS16")
CHECK(xa , 0, 0, "" , 0, 4, "XA\0\0")
CHECK(xa , 0, 0, "" , 0, 4, "XAI\0")
CHECK(xa , 0, 0, "" , 0, 4, "XAJ\0")
diff --git a/src/formats.h b/src/formats.h
index a42ce270..b931d83f 100644
--- a/src/formats.h
+++ b/src/formats.h
@@ -36,6 +36,7 @@
FORMAT(la)
FORMAT(lu)
FORMAT(maud)
+ FORMAT(nsp)
FORMAT(nul)
FORMAT(prc)
FORMAT(raw)
diff --git a/src/nsp.c b/src/nsp.c
new file mode 100644
index 00000000..e9f128c5
--- /dev/null
+++ b/src/nsp.c
@@ -0,0 +1,178 @@
+/* libSoX CSL NSP format.
+ * http://web.archive.org/web/20160525045942/http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/CSL/CSL.html
+ *
+ * Copyright 2017 Jim O'Regan
+ *
+ * based on aiff.c
+ * Copyright 1991-2007 Guido van Rossum And Sundry Contributors
+ *
+ * This source code is freely redistributable and may be used for
+ * any purpose. This copyright notice must be maintained.
+ * Guido van Rossum And Sundry Contributors are not responsible for
+ * the consequences of using this software.
+ */
+
+#include "sox_i.h"
+
+#include <time.h> /* for time stamping comments */
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <limits.h>
+
+int lsx_nspstartread(sox_format_t * ft);
+
+int lsx_nspstartread(sox_format_t * ft)
+{
+ char buf[5];
+ uint32_t hchunksize;
+ uint32_t chunksize;
+ unsigned short channels = 0;
+ sox_encoding_t enc = SOX_ENCODING_SIGN2;
+ unsigned short bits = 16;
+ double rate = 0.0;
+ uint64_t seekto = 0;
+ int i;
+ size_t ssndsize = 0;
+
+ char date[20];
+ char *comment;
+ uint16_t maxabschan[8];
+ uint32_t datalength;
+ uint32_t samplerate;
+ int numchannels;
+
+ uint8_t trash8;
+
+ /* FORM chunk */
+ if (lsx_reads(ft, buf, (size_t)8) == SOX_EOF || strncmp(buf, "FORMDS16", (size_t)8) != 0) {
+ lsx_fail_errno(ft,SOX_EHDR,"NSP header does not begin with magic word `FORMDS16'");
+ return(SOX_EOF);
+ }
+ lsx_readdw(ft, &hchunksize);
+
+ while (1) {
+ if (lsx_reads(ft, buf, (size_t)4) == SOX_EOF) {
+ if (ssndsize > 0)
+ break;
+ else {
+ lsx_fail_errno(ft,SOX_EHDR,"Missing SDA_ chunk in NSP file");
+ return(SOX_EOF);
+ }
+ }
+ if (strncmp(buf, "HEDR", (size_t)4) == 0) {
+ /* HEDR chunk */
+ lsx_readdw(ft, &chunksize);
+ lsx_reads(ft, date, (size_t)20);
+ lsx_readdw(ft, &samplerate);
+ rate = (double)samplerate;
+ lsx_readdw(ft, &datalength);
+ lsx_readw(ft, &maxabschan[0]);
+ lsx_readw(ft, &maxabschan[1]);
+
+ /* Most likely there will only be 1 channel, but there can be 2 here */
+ if (maxabschan[0] == 0xffff && maxabschan[1] == 0xffff) {
+ lsx_fail_errno(ft,SOX_EHDR,"Channels A and B undefined");
+ } else if (maxabschan[0] == 0xffff || maxabschan[1] == 0xffff) {
+ ft->signal.channels = 1;
+ } else {
+ ft->signal.channels = 2;
+ }
+ } else if (strncmp(buf, "HDR8", (size_t)4) == 0) {
+ /* HDR8 chunk */
+ lsx_readdw(ft, &chunksize);
+ lsx_reads(ft, date, (size_t)20);
+ lsx_readdw(ft, &samplerate);
+ rate = (double)samplerate;
+ lsx_readdw(ft, &datalength);
+ lsx_readw(ft, &maxabschan[0]);
+ lsx_readw(ft, &maxabschan[1]);
+ lsx_readw(ft, &maxabschan[2]);
+ lsx_readw(ft, &maxabschan[3]);
+ lsx_readw(ft, &maxabschan[4]);
+ lsx_readw(ft, &maxabschan[5]);
+ lsx_readw(ft, &maxabschan[6]);
+ lsx_readw(ft, &maxabschan[7]);
+
+ /* Can be up to 8 channels */
+ numchannels = 0;
+ for (i = 0; i < 7; i++) {
+ if (maxabschan[i] != 0xffff) {
+ numchannels++;
+ }
+ }
+ if (numchannels == 0) {
+ lsx_fail_errno(ft,SOX_EHDR,"No channels defined");
+ }
+ ft->signal.channels = numchannels;
+ } else if (strncmp(buf, "NOTE", (size_t)4) == 0) {
+ unsigned char nullc = 0;
+ /* NOTE chunk */
+ lsx_readdw(ft, &chunksize);
+ comment = lsx_malloc(chunksize * sizeof(char*));
+ lsx_reads(ft, comment, (size_t)chunksize);
+ if(strlen(comment) != 0)
+ lsx_debug("NSP comment: %s %d", comment);
+ free(comment);
+ lsx_readb(ft, &nullc);
+ } else if (strncmp(buf, "SDA_", (size_t)4) == 0) {
+ lsx_readdw(ft, &chunksize);
+ ssndsize = chunksize;
+ /* if can't seek, just do sound now */
+ if (!ft->seekable)
+ break;
+ /* else, seek to end of sound and hunt for more */
+ seekto = lsx_tell(ft);
+ lsx_seeki(ft, (off_t)chunksize, SEEK_CUR);
+ } else {
+ if (lsx_eof(ft))
+ break;
+ buf[4] = 0;
+ lsx_debug("NSPstartread: ignoring `%s' chunk", buf);
+ lsx_readdw(ft, &chunksize);
+ if (lsx_eof(ft))
+ break;
+ /* Skip the chunk using lsx_readb() so we may read
+ from a pipe */
+ while (chunksize-- > 0) {
+ if (lsx_readb(ft, &trash8) == SOX_EOF)
+ break;
+ }
+ }
+ if (lsx_eof(ft))
+ break;
+ }
+
+ if (ft->seekable) {
+ if (seekto > 0)
+ lsx_seeki(ft, seekto, SEEK_SET);
+ else {
+ lsx_fail_errno(ft,SOX_EOF,"NSP: no sound data on input file");
+ return(SOX_EOF);
+ }
+ }
+
+ return lsx_check_read_params(
+ ft, channels, rate, enc, bits, (uint64_t)ssndsize/2, sox_false);
+}
+
+static int lsx_nspstopread(sox_format_t * ft)
+{
+ ft->sox_errno = SOX_SUCCESS;
+
+ return SOX_SUCCESS;
+}
+
+LSX_FORMAT_HANDLER(nsp)
+{
+ static char const * const names[] = {"nsp", NULL };
+ static sox_format_handler_t const handler = {SOX_LIB_VERSION_CODE,
+ "Computerized Speech Lab NSP file",
+ names, SOX_FILE_LIT_END,
+ lsx_nspstartread, lsx_rawread, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL, 0
+ };
+ return &handler;
+}
[-- Attachment #3: Type: text/plain, Size: 0 bytes --]
[-- Attachment #4: Type: text/plain, Size: 158 bytes --]
_______________________________________________
SoX-devel mailing list
SoX-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sox-devel
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: NSP support
2020-08-02 0:26 NSP support Jim O'Regan
@ 2020-08-24 12:21 ` Jim O'Regan
0 siblings, 0 replies; 2+ messages in thread
From: Jim O'Regan @ 2020-08-24 12:21 UTC (permalink / raw)
To: sox-devel
[-- Attachment #1.1: Type: text/plain, Size: 323 bytes --]
Updated version
Ar Domh 2 Lún 2020 ag 01:26, scríobh Jim O'Regan <jaoregan@tcd.ie>:
> Hi.
>
> I did this a few years ago to convert some old files created with
> Wavesurfer. I've just checked that the patch applies. It's also in a branch
> on github, here: https://github.com/jimregan/sox-nsp/tree/nsp-flat
>
[-- Attachment #1.2: Type: text/html, Size: 716 bytes --]
[-- Attachment #2: NSP.patch --]
[-- Type: application/octet-stream, Size: 7193 bytes --]
From 8b88a9ac233e62486fc23b2a9f78cf301be40429 Mon Sep 17 00:00:00 2001
From: Jim O'Regan <jaoregan@tcd.ie>
Date: Mon, 24 Aug 2020 13:06:29 +0100
Subject: [PATCH] Add NSP support
---
src/Makefile.am | 2 +-
src/formats.c | 1 +
src/formats.h | 1 +
src/nsp.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 181 insertions(+), 1 deletion(-)
create mode 100644 src/nsp.c
diff --git a/src/Makefile.am b/src/Makefile.am
index f5f456ec..f51c6402 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -117,7 +117,7 @@ libsox_la_SOURCES += raw-fmt.c s1-fmt.c s2-fmt.c s3-fmt.c \
lu-fmt.c 8svx.c aiff-fmt.c aifc-fmt.c au.c avr.c cdr.c cvsd-fmt.c \
dvms-fmt.c dat.c hcom.c htk.c maud.c prc.c sf.c smp.c \
sounder.c soundtool.c sphere.c tx16w.c voc.c vox-fmt.c ima-fmt.c adpcm.c adpcm.h \
- ima_rw.c ima_rw.h wav.c wve.c xa.c nulfile.c f4-fmt.c f8-fmt.c gsrt.c
+ ima_rw.c ima_rw.h wav.c wve.c xa.c nulfile.c f4-fmt.c f8-fmt.c gsrt.c nsp.c
libsox_la_LIBADD += @LPC10_LIBS@ @LIBLPC10_LIBADD@
diff --git a/src/formats.c b/src/formats.c
index 2adc88b3..33036b06 100644
--- a/src/formats.c
+++ b/src/formats.c
@@ -72,6 +72,7 @@ static char const * auto_detect_format(sox_format_t * ft, char const * ext)
CHECK(aifc , 0, 4, "FORM" , 8, 4, "AIFC")
CHECK(8svx , 0, 4, "FORM" , 8, 4, "8SVX")
CHECK(maud , 0, 4, "FORM" , 8, 4, "MAUD")
+ CHECK(nsp , 0, 4, "FORM" , 4, 4, "DS16")
CHECK(xa , 0, 0, "" , 0, 4, "XA\0\0")
CHECK(xa , 0, 0, "" , 0, 4, "XAI\0")
CHECK(xa , 0, 0, "" , 0, 4, "XAJ\0")
diff --git a/src/formats.h b/src/formats.h
index a42ce270..b931d83f 100644
--- a/src/formats.h
+++ b/src/formats.h
@@ -36,6 +36,7 @@
FORMAT(la)
FORMAT(lu)
FORMAT(maud)
+ FORMAT(nsp)
FORMAT(nul)
FORMAT(prc)
FORMAT(raw)
diff --git a/src/nsp.c b/src/nsp.c
new file mode 100644
index 00000000..e9f128c5
--- /dev/null
+++ b/src/nsp.c
@@ -0,0 +1,178 @@
+/* libSoX CSL NSP format.
+ * http://web.archive.org/web/20160525045942/http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/CSL/CSL.html
+ *
+ * Copyright 2017 Jim O'Regan
+ *
+ * based on aiff.c
+ * Copyright 1991-2007 Guido van Rossum And Sundry Contributors
+ *
+ * This source code is freely redistributable and may be used for
+ * any purpose. This copyright notice must be maintained.
+ * Guido van Rossum And Sundry Contributors are not responsible for
+ * the consequences of using this software.
+ */
+
+#include "sox_i.h"
+
+#include <time.h> /* for time stamping comments */
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <limits.h>
+
+int lsx_nspstartread(sox_format_t * ft);
+
+int lsx_nspstartread(sox_format_t * ft)
+{
+ char buf[5];
+ uint32_t hchunksize;
+ uint32_t chunksize;
+ unsigned short channels = 0;
+ sox_encoding_t enc = SOX_ENCODING_SIGN2;
+ unsigned short bits = 16;
+ double rate = 0.0;
+ uint64_t seekto = 0;
+ int i;
+ size_t ssndsize = 0;
+
+ char date[20];
+ char *comment;
+ uint16_t maxabschan[8];
+ uint32_t datalength;
+ uint32_t samplerate;
+ int numchannels;
+
+ uint8_t trash8;
+
+ /* FORM chunk */
+ if (lsx_reads(ft, buf, (size_t)8) == SOX_EOF || strncmp(buf, "FORMDS16", (size_t)8) != 0) {
+ lsx_fail_errno(ft,SOX_EHDR,"NSP header does not begin with magic word `FORMDS16'");
+ return(SOX_EOF);
+ }
+ lsx_readdw(ft, &hchunksize);
+
+ while (1) {
+ if (lsx_reads(ft, buf, (size_t)4) == SOX_EOF) {
+ if (ssndsize > 0)
+ break;
+ else {
+ lsx_fail_errno(ft,SOX_EHDR,"Missing SDA_ chunk in NSP file");
+ return(SOX_EOF);
+ }
+ }
+ if (strncmp(buf, "HEDR", (size_t)4) == 0) {
+ /* HEDR chunk */
+ lsx_readdw(ft, &chunksize);
+ lsx_reads(ft, date, (size_t)20);
+ lsx_readdw(ft, &samplerate);
+ rate = (double)samplerate;
+ lsx_readdw(ft, &datalength);
+ lsx_readw(ft, &maxabschan[0]);
+ lsx_readw(ft, &maxabschan[1]);
+
+ /* Most likely there will only be 1 channel, but there can be 2 here */
+ if (maxabschan[0] == 0xffff && maxabschan[1] == 0xffff) {
+ lsx_fail_errno(ft,SOX_EHDR,"Channels A and B undefined");
+ } else if (maxabschan[0] == 0xffff || maxabschan[1] == 0xffff) {
+ ft->signal.channels = 1;
+ } else {
+ ft->signal.channels = 2;
+ }
+ } else if (strncmp(buf, "HDR8", (size_t)4) == 0) {
+ /* HDR8 chunk */
+ lsx_readdw(ft, &chunksize);
+ lsx_reads(ft, date, (size_t)20);
+ lsx_readdw(ft, &samplerate);
+ rate = (double)samplerate;
+ lsx_readdw(ft, &datalength);
+ lsx_readw(ft, &maxabschan[0]);
+ lsx_readw(ft, &maxabschan[1]);
+ lsx_readw(ft, &maxabschan[2]);
+ lsx_readw(ft, &maxabschan[3]);
+ lsx_readw(ft, &maxabschan[4]);
+ lsx_readw(ft, &maxabschan[5]);
+ lsx_readw(ft, &maxabschan[6]);
+ lsx_readw(ft, &maxabschan[7]);
+
+ /* Can be up to 8 channels */
+ numchannels = 0;
+ for (i = 0; i < 7; i++) {
+ if (maxabschan[i] != 0xffff) {
+ numchannels++;
+ }
+ }
+ if (numchannels == 0) {
+ lsx_fail_errno(ft,SOX_EHDR,"No channels defined");
+ }
+ ft->signal.channels = numchannels;
+ } else if (strncmp(buf, "NOTE", (size_t)4) == 0) {
+ unsigned char nullc = 0;
+ /* NOTE chunk */
+ lsx_readdw(ft, &chunksize);
+ comment = lsx_malloc(chunksize * sizeof(char*));
+ lsx_reads(ft, comment, (size_t)chunksize);
+ if(strlen(comment) != 0)
+ lsx_debug("NSP comment: %s %d", comment);
+ free(comment);
+ lsx_readb(ft, &nullc);
+ } else if (strncmp(buf, "SDA_", (size_t)4) == 0) {
+ lsx_readdw(ft, &chunksize);
+ ssndsize = chunksize;
+ /* if can't seek, just do sound now */
+ if (!ft->seekable)
+ break;
+ /* else, seek to end of sound and hunt for more */
+ seekto = lsx_tell(ft);
+ lsx_seeki(ft, (off_t)chunksize, SEEK_CUR);
+ } else {
+ if (lsx_eof(ft))
+ break;
+ buf[4] = 0;
+ lsx_debug("NSPstartread: ignoring `%s' chunk", buf);
+ lsx_readdw(ft, &chunksize);
+ if (lsx_eof(ft))
+ break;
+ /* Skip the chunk using lsx_readb() so we may read
+ from a pipe */
+ while (chunksize-- > 0) {
+ if (lsx_readb(ft, &trash8) == SOX_EOF)
+ break;
+ }
+ }
+ if (lsx_eof(ft))
+ break;
+ }
+
+ if (ft->seekable) {
+ if (seekto > 0)
+ lsx_seeki(ft, seekto, SEEK_SET);
+ else {
+ lsx_fail_errno(ft,SOX_EOF,"NSP: no sound data on input file");
+ return(SOX_EOF);
+ }
+ }
+
+ return lsx_check_read_params(
+ ft, channels, rate, enc, bits, (uint64_t)ssndsize/2, sox_false);
+}
+
+static int lsx_nspstopread(sox_format_t * ft)
+{
+ ft->sox_errno = SOX_SUCCESS;
+
+ return SOX_SUCCESS;
+}
+
+LSX_FORMAT_HANDLER(nsp)
+{
+ static char const * const names[] = {"nsp", NULL };
+ static sox_format_handler_t const handler = {SOX_LIB_VERSION_CODE,
+ "Computerized Speech Lab NSP file",
+ names, SOX_FILE_LIT_END,
+ lsx_nspstartread, lsx_rawread, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL, 0
+ };
+ return &handler;
+}
[-- Attachment #3: Type: text/plain, Size: 0 bytes --]
[-- Attachment #4: Type: text/plain, Size: 158 bytes --]
_______________________________________________
SoX-devel mailing list
SoX-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sox-devel
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-08-24 12:22 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-02 0:26 NSP support Jim O'Regan
2020-08-24 12:21 ` Jim O'Regan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).