parent
a383fc0d58
commit
e6567e8112
@ -1,218 +0,0 @@ |
|||||||
/* libSoX skeleton file format handler.
|
|
||||||
* |
|
||||||
* Copyright 1999 Chris Bagwell And Sundry Contributors |
|
||||||
* |
|
||||||
* This library is free software; you can redistribute it and/or modify it |
|
||||||
* under the terms of the GNU Lesser General Public License as published by |
|
||||||
* the Free Software Foundation; either version 2.1 of the License, or (at |
|
||||||
* your option) any later version. |
|
||||||
* |
|
||||||
* This library is distributed in the hope that it will be useful, but |
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser |
|
||||||
* General Public License for more details. |
|
||||||
* |
|
||||||
* You should have received a copy of the GNU Lesser General Public License |
|
||||||
* along with this library; if not, write to the Free Software Foundation, |
|
||||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
||||||
*/ |
|
||||||
|
|
||||||
#include "sox_i.h" |
|
||||||
|
|
||||||
#include <string.h> |
|
||||||
|
|
||||||
/* Private data for SKEL file */ |
|
||||||
typedef struct { |
|
||||||
size_t remaining_samples; |
|
||||||
} priv_t; |
|
||||||
|
|
||||||
/* Note that if any of your methods doesn't need to do anything, you
|
|
||||||
can instead use the relevant sox_*_nothing* method */ |
|
||||||
|
|
||||||
/*
|
|
||||||
* Do anything required before you start reading samples. |
|
||||||
* Read file header. |
|
||||||
* Find out sampling rate, |
|
||||||
* size and encoding of samples, |
|
||||||
* mono/stereo/quad. |
|
||||||
*/ |
|
||||||
static int startread(sox_format_t * ft) |
|
||||||
{ |
|
||||||
priv_t * sk = (priv_t *)ft->priv; |
|
||||||
size_t samples_in_file; |
|
||||||
|
|
||||||
/* If you need to seek around the input file. */ |
|
||||||
if (!ft->seekable) { |
|
||||||
lsx_fail_errno(ft, SOX_EOF, "skel inputfile must be a file"); |
|
||||||
return SOX_EOF; |
|
||||||
} |
|
||||||
|
|
||||||
/*
|
|
||||||
* If your format is headerless and has fixed values for |
|
||||||
* the following items, you can hard code them here (see cdr.c). |
|
||||||
* If your format contains a header with format information |
|
||||||
* then you should set it here. |
|
||||||
*/ |
|
||||||
ft->signal.rate = 44100; /* or 8000, 16000, 32000, 48000, ... */ |
|
||||||
ft->signal.channels = 1; /* or 2 or 3 ... */ |
|
||||||
ft->encoding.bits_per_sample = 8; /* or 16 ... */ |
|
||||||
ft->encoding.encoding = SOX_ENCODING_UNSIGNED; /* or SIGN2 ... */ |
|
||||||
sox_append_comment(&ft->oob.comments, "any comment in file header."); |
|
||||||
|
|
||||||
/* If your format doesn't have a header then samples_in_file
|
|
||||||
* can be determined by the file size. |
|
||||||
*/ |
|
||||||
samples_in_file = lsx_filelength(ft) / (ft->encoding.bits_per_sample >> 3); |
|
||||||
|
|
||||||
/* If you can detect the length of your file, record it here. */ |
|
||||||
ft->signal.length = samples_in_file; |
|
||||||
sk->remaining_samples = samples_in_file; |
|
||||||
|
|
||||||
return SOX_SUCCESS; |
|
||||||
} |
|
||||||
|
|
||||||
/*
|
|
||||||
* Read up to len samples of type sox_sample_t from file into buf[]. |
|
||||||
* Return number of samples read, or 0 if at end of file. |
|
||||||
*/ |
|
||||||
static size_t read_samples(sox_format_t * ft, sox_sample_t *buf, size_t len) |
|
||||||
{ |
|
||||||
priv_t * UNUSED sk = (priv_t *)ft->priv; |
|
||||||
size_t done; |
|
||||||
unsigned char sample; |
|
||||||
|
|
||||||
for (done = 0; done < len; done++) { |
|
||||||
if (lsx_eof(ft) || lsx_readb(ft, &sample)) /* no more samples */ |
|
||||||
break; |
|
||||||
switch (ft->encoding.bits_per_sample) { |
|
||||||
case 8: |
|
||||||
switch (ft->encoding.encoding) { |
|
||||||
case SOX_ENCODING_UNSIGNED: |
|
||||||
*buf++ = SOX_UNSIGNED_8BIT_TO_SAMPLE(sample,); |
|
||||||
break; |
|
||||||
default: |
|
||||||
lsx_fail("Undetected sample encoding in read!"); |
|
||||||
return 0; |
|
||||||
} |
|
||||||
break; |
|
||||||
default: |
|
||||||
lsx_fail("Undetected bad sample size in read!"); |
|
||||||
return 0; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return done; |
|
||||||
} |
|
||||||
|
|
||||||
/*
|
|
||||||
* Do anything required when you stop reading samples. |
|
||||||
* Don't close input file! |
|
||||||
*/ |
|
||||||
static int stopread(sox_format_t UNUSED * ft) |
|
||||||
{ |
|
||||||
return SOX_SUCCESS; |
|
||||||
} |
|
||||||
|
|
||||||
static int startwrite(sox_format_t * ft) |
|
||||||
{ |
|
||||||
priv_t * UNUSED sk = (priv_t *)ft->priv; |
|
||||||
|
|
||||||
/* If you have to seek around the output file. */ |
|
||||||
/* If header contains a length value then seeking will be
|
|
||||||
* required. Instead of failing, it's sometimes nice to |
|
||||||
* just set the length to max value and not fail. |
|
||||||
*/ |
|
||||||
if (!ft->seekable) { |
|
||||||
lsx_fail("Output .skel file must be a file, not a pipe"); |
|
||||||
return SOX_EOF; |
|
||||||
} |
|
||||||
|
|
||||||
if (ft->signal.rate != 44100) |
|
||||||
lsx_fail("Output .skel file must have a sample rate of 44100Hz"); |
|
||||||
|
|
||||||
if (ft->encoding.bits_per_sample == 0) { |
|
||||||
lsx_fail("Did not specify a size for .skel output file"); |
|
||||||
return SOX_EOF; |
|
||||||
} |
|
||||||
|
|
||||||
/* error check ft->encoding.encoding */ |
|
||||||
/* error check ft->signal.channels */ |
|
||||||
|
|
||||||
/* Write file header, if any */ |
|
||||||
/* Write comment field, if any */ |
|
||||||
|
|
||||||
return SOX_SUCCESS; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/*
|
|
||||||
* Write len samples of type sox_sample_t from buf[] to file. |
|
||||||
* Return number of samples written. |
|
||||||
*/ |
|
||||||
static size_t write_samples(sox_format_t * ft, const sox_sample_t *buf, size_t len) |
|
||||||
{ |
|
||||||
priv_t * sk = (priv_t *)ft->priv; |
|
||||||
size_t done = 0; |
|
||||||
|
|
||||||
(void)sk; |
|
||||||
switch (ft->encoding.bits_per_sample) { |
|
||||||
case 8: |
|
||||||
switch (ft->encoding.encoding) { |
|
||||||
SOX_SAMPLE_LOCALS; |
|
||||||
case SOX_ENCODING_UNSIGNED: |
|
||||||
while (done < len && lsx_writeb(ft, SOX_SAMPLE_TO_UNSIGNED_8BIT(*buf++, ft->clips)) == SOX_SUCCESS) |
|
||||||
++done; |
|
||||||
break; |
|
||||||
default: |
|
||||||
lsx_fail("Undetected bad sample encoding in write!"); |
|
||||||
return 0; |
|
||||||
} |
|
||||||
break; |
|
||||||
default: |
|
||||||
lsx_fail("Undetected bad sample size in write!"); |
|
||||||
return 0; |
|
||||||
} |
|
||||||
return done; |
|
||||||
} |
|
||||||
|
|
||||||
static int stopwrite(sox_format_t UNUSED * ft) |
|
||||||
{ |
|
||||||
/* All samples are already written out. */ |
|
||||||
/* If file header needs fixing up, for example it needs the number
|
|
||||||
of samples in a field, seek back and write them here. */ |
|
||||||
return SOX_SUCCESS; |
|
||||||
} |
|
||||||
|
|
||||||
static int seek(sox_format_t UNUSED * ft, uint64_t UNUSED offset) |
|
||||||
{ |
|
||||||
/* Seek relative to current position. */ |
|
||||||
return SOX_SUCCESS; |
|
||||||
} |
|
||||||
|
|
||||||
LSX_FORMAT_HANDLER(skel) |
|
||||||
{ |
|
||||||
/* Format file suffixes */ |
|
||||||
static const char *names[] = {"skel",NULL }; |
|
||||||
|
|
||||||
/* Encoding types and sizes that this handler can write */ |
|
||||||
static const unsigned encodings[] = { |
|
||||||
SOX_ENCODING_SIGN2, 16, 0, |
|
||||||
SOX_ENCODING_UNSIGNED, 8, 0, |
|
||||||
0}; |
|
||||||
|
|
||||||
/* Format descriptor
|
|
||||||
* If no specific processing is needed for any of |
|
||||||
* the 7 functions, then the function above can be deleted |
|
||||||
* and NULL used in place of the its name below. |
|
||||||
*/ |
|
||||||
static sox_format_handler_t handler = { |
|
||||||
SOX_LIB_VERSION_CODE, |
|
||||||
"My first SoX format!", |
|
||||||
names, 0, |
|
||||||
startread, read_samples, stopread, |
|
||||||
startwrite, write_samples, stopwrite, |
|
||||||
seek, encodings, NULL, sizeof(priv_t) |
|
||||||
}; |
|
||||||
|
|
||||||
return &handler; |
|
||||||
} |
|
Loading…
Reference in new issue