sox-devel@lists.sourceforge.net unofficial mirror
 help / color / mirror / code / Atom feed
From: "Jim O'Regan" <jaoregan@tcd.ie>
To: sox-devel@lists.sourceforge.net
Subject: NSP support
Date: Sun, 2 Aug 2020 01:26:23 +0100	[thread overview]
Message-ID: <CAM6T9X-cYCvfXGJ7HD5HrBATiNuMSeu5Q3iPn0zATP8KZ9hEbA@mail.gmail.com> (raw)


[-- 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

             reply	other threads:[~2020-08-02  2:00 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-02  0:26 Jim O'Regan [this message]
2020-08-24 12:21 ` NSP support Jim O'Regan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://lists.sourceforge.net/lists/listinfo/sox-devel

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAM6T9X-cYCvfXGJ7HD5HrBATiNuMSeu5Q3iPn0zATP8KZ9hEbA@mail.gmail.com \
    --to=sox-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/sox.git

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).