parent
6b26c2dc28
commit
09a4b271bc
@ -1,162 +0,0 @@ |
|||||||
/* libSoX text format file. Tom Littlejohn, March 93.
|
|
||||||
* |
|
||||||
* Reads/writes sound files as text. |
|
||||||
* |
|
||||||
* Copyright 1998-2006 Chris Bagwell and SoX Contributors |
|
||||||
* This source code is freely redistributable and may be used for |
|
||||||
* any purpose. This copyright notice must be maintained. |
|
||||||
* Lance Norskog And Sundry Contributors are not responsible for |
|
||||||
* the consequences of using this software. |
|
||||||
*/ |
|
||||||
|
|
||||||
#include "sox_i.h" |
|
||||||
#include <string.h> |
|
||||||
|
|
||||||
#define LINEWIDTH (size_t)256 |
|
||||||
|
|
||||||
/* Private data for dat file */ |
|
||||||
typedef struct { |
|
||||||
double timevalue, deltat; |
|
||||||
int buffered; |
|
||||||
char prevline[LINEWIDTH]; |
|
||||||
} priv_t; |
|
||||||
|
|
||||||
static int sox_datstartread(sox_format_t * ft) |
|
||||||
{ |
|
||||||
char inpstr[LINEWIDTH]; |
|
||||||
long rate; |
|
||||||
int chan; |
|
||||||
int status; |
|
||||||
char sc; |
|
||||||
|
|
||||||
/* Read lines until EOF or first non-comment line */ |
|
||||||
while ((status = lsx_reads(ft, inpstr, LINEWIDTH-1)) != SOX_EOF) { |
|
||||||
inpstr[LINEWIDTH-1] = 0; |
|
||||||
if ((sscanf(inpstr," %c", &sc) != 0) && (sc != ';')) break; |
|
||||||
if (sscanf(inpstr," ; Sample Rate %ld", &rate)) { |
|
||||||
ft->signal.rate=rate; |
|
||||||
} else if (sscanf(inpstr," ; Channels %d", &chan)) { |
|
||||||
ft->signal.channels=chan; |
|
||||||
} |
|
||||||
} |
|
||||||
/* Hold a copy of the last line we read (first non-comment) */ |
|
||||||
if (status != SOX_EOF) { |
|
||||||
strncpy(((priv_t *)ft->priv)->prevline, inpstr, (size_t)LINEWIDTH); |
|
||||||
((priv_t *)ft->priv)->buffered = 1; |
|
||||||
} else { |
|
||||||
((priv_t *)ft->priv)->buffered = 0; |
|
||||||
} |
|
||||||
|
|
||||||
/* Default channels to 1 if not found */ |
|
||||||
if (ft->signal.channels == 0) |
|
||||||
ft->signal.channels = 1; |
|
||||||
|
|
||||||
ft->encoding.encoding = SOX_ENCODING_FLOAT_TEXT; |
|
||||||
|
|
||||||
return (SOX_SUCCESS); |
|
||||||
} |
|
||||||
|
|
||||||
static int sox_datstartwrite(sox_format_t * ft) |
|
||||||
{ |
|
||||||
priv_t * dat = (priv_t *) ft->priv; |
|
||||||
char s[LINEWIDTH]; |
|
||||||
|
|
||||||
dat->timevalue = 0.0; |
|
||||||
dat->deltat = 1.0 / (double)ft->signal.rate; |
|
||||||
/* Write format comments to start of file */ |
|
||||||
sprintf(s,"; Sample Rate %ld\015\n", (long)ft->signal.rate); |
|
||||||
lsx_writes(ft, s); |
|
||||||
sprintf(s,"; Channels %d\015\n", (int)ft->signal.channels); |
|
||||||
lsx_writes(ft, s); |
|
||||||
|
|
||||||
return (SOX_SUCCESS); |
|
||||||
} |
|
||||||
|
|
||||||
static size_t sox_datread(sox_format_t * ft, sox_sample_t *buf, size_t nsamp) |
|
||||||
{ |
|
||||||
char inpstr[LINEWIDTH]; |
|
||||||
int inpPtr = 0; |
|
||||||
int inpPtrInc = 0; |
|
||||||
double sampval = 0.0; |
|
||||||
int retc = 0; |
|
||||||
char sc = 0; |
|
||||||
size_t done = 0; |
|
||||||
size_t i=0; |
|
||||||
|
|
||||||
/* Always read a complete set of channels */ |
|
||||||
nsamp -= (nsamp % ft->signal.channels); |
|
||||||
|
|
||||||
while (done < nsamp) { |
|
||||||
|
|
||||||
/* Read a line or grab the buffered first line */ |
|
||||||
if (((priv_t *)ft->priv)->buffered) { |
|
||||||
strncpy(inpstr, ((priv_t *)ft->priv)->prevline, (size_t)LINEWIDTH); |
|
||||||
inpstr[LINEWIDTH-1] = 0; |
|
||||||
((priv_t *)ft->priv)->buffered=0; |
|
||||||
} else { |
|
||||||
lsx_reads(ft, inpstr, LINEWIDTH-1); |
|
||||||
inpstr[LINEWIDTH-1] = 0; |
|
||||||
if (lsx_eof(ft)) return (done); |
|
||||||
} |
|
||||||
|
|
||||||
/* Skip over comments - ie. 0 or more whitespace, then ';' */ |
|
||||||
if ((sscanf(inpstr," %c", &sc) != 0) && (sc==';')) continue; |
|
||||||
|
|
||||||
/* Read a complete set of channels */ |
|
||||||
sscanf(inpstr," %*s%n", &inpPtr); |
|
||||||
for (i=0; i<ft->signal.channels; i++) { |
|
||||||
SOX_SAMPLE_LOCALS; |
|
||||||
retc = sscanf(&inpstr[inpPtr]," %lg%n", &sampval, &inpPtrInc); |
|
||||||
inpPtr += inpPtrInc; |
|
||||||
if (retc != 1) { |
|
||||||
lsx_fail_errno(ft,SOX_EOF,"Unable to read sample."); |
|
||||||
return 0; |
|
||||||
} |
|
||||||
*buf++ = SOX_FLOAT_64BIT_TO_SAMPLE(sampval, ft->clips); |
|
||||||
done++; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return (done); |
|
||||||
} |
|
||||||
|
|
||||||
static size_t sox_datwrite(sox_format_t * ft, const sox_sample_t *buf, size_t nsamp) |
|
||||||
{ |
|
||||||
priv_t * dat = (priv_t *) ft->priv; |
|
||||||
size_t done = 0; |
|
||||||
double sampval=0.0; |
|
||||||
char s[LINEWIDTH]; |
|
||||||
size_t i=0; |
|
||||||
|
|
||||||
/* Always write a complete set of channels */ |
|
||||||
nsamp -= (nsamp % ft->signal.channels); |
|
||||||
|
|
||||||
/* Write time, then sample values, then CRLF newline */ |
|
||||||
while(done < nsamp) { |
|
||||||
sprintf(s," %15.8g ",dat->timevalue); |
|
||||||
lsx_writes(ft, s); |
|
||||||
for (i=0; i<ft->signal.channels; i++) { |
|
||||||
sampval = SOX_SAMPLE_TO_FLOAT_64BIT(*buf++, ft->clips); |
|
||||||
sprintf(s," %15.11g", sampval); |
|
||||||
lsx_writes(ft, s); |
|
||||||
done++; |
|
||||||
} |
|
||||||
sprintf(s," \r\n"); |
|
||||||
lsx_writes(ft, s); |
|
||||||
dat->timevalue += dat->deltat; |
|
||||||
} |
|
||||||
return done; |
|
||||||
} |
|
||||||
|
|
||||||
LSX_FORMAT_HANDLER(dat) |
|
||||||
{ |
|
||||||
static char const * const names[] = {"dat", NULL}; |
|
||||||
static unsigned const write_encodings[] = {SOX_ENCODING_FLOAT_TEXT, 0, 0}; |
|
||||||
static sox_format_handler_t const handler = {SOX_LIB_VERSION_CODE, |
|
||||||
"Textual representation of the sampled audio", names, 0, |
|
||||||
sox_datstartread, sox_datread, NULL, |
|
||||||
sox_datstartwrite, sox_datwrite, NULL, |
|
||||||
NULL, write_encodings, NULL, sizeof(priv_t) |
|
||||||
}; |
|
||||||
return &handler; |
|
||||||
} |
|
Loading…
Reference in new issue