home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 3
/
AACD03.BIN
/
AACD
/
Sound
/
SoX
/
Source
/
util.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-07-18
|
6KB
|
300 lines
/*
* July 5, 1991
* Copyright 1991 Lance Norskog And Sundry 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 "st.h"
#include "version.h"
#include "patchlvl.h"
#include <string.h>
#include <ctype.h>
#include <signal.h>
#ifdef __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
/*
* util.c.
* Incorporate Jimen Ching's fixes for real library operation: Aug 3, 1994.
* Redo all work from scratch, unfortunately.
* Separate out all common variables used by effects & handlers,
* and utility routines for other main programs to use.
*/
EXPORT float volume = 1.0; /* expansion coefficient */
EXPORT int dovolume = 0;
EXPORT float amplitude = 1.0; /* Largest sample so far */
EXPORT int writing = 0; /* are we writing to a file? */
/* export flags */
EXPORT int verbose = 0; /* be noisy on stderr */
EXPORT int summary = 0; /* just print summary of information */
EXPORT char *myname;
EXPORT int soxpreview = 0; /* preview mode */
void
#if defined(__STDC__)
report(char *fmt, ...)
#else
report(va_alist)
va_dcl
#endif
{
va_list args;
#if !defined(__STDC__)
char *fmt;
#endif
if (! verbose)
return;
fprintf(stderr, "%s: ", myname);
#if !defined(__STDC__)
va_start(args);
fmt = va_arg(args, char *);
#else
va_start(args, fmt);
#endif
vfprintf(stderr, fmt, args);
va_end(args);
fprintf(stderr, "\n");
}
void
#if defined(__STDC__)
warn(char *fmt, ...)
#else
warn(va_alist)
va_dcl
#endif
{
va_list args;
#if !defined(__STDC__)
char *fmt;
#endif
fprintf(stderr, "%s: ", myname);
#if !defined(__STDC__)
va_start(args);
fmt = va_arg(args, char *);
#else
va_start(args, fmt);
#endif
vfprintf(stderr, fmt, args);
va_end(args);
fprintf(stderr, "\n");
}
void
#if defined(__STDC__)
fail(char *fmt, ...)
#else
fail(va_alist)
va_dcl
#endif
{
va_list args;
#if !defined(__STDC__)
char *fmt;
#endif
extern void cleanup();
fprintf(stderr, "%s: ", myname);
#if !defined(__STDC__)
va_start(args);
fmt = va_arg(args, char *);
#else
va_start(args, fmt);
#endif
vfprintf(stderr, fmt, args);
va_end(args);
fprintf(stderr, "\n");
cleanup();
exit(2);
}
int strcmpcase(s1, s2)
char *s1, *s2;
{
while(*s1 && *s2 && (tolower(*s1) == tolower(*s2)))
s1++, s2++;
return *s1 - *s2;
}
/*
* Check that we have a known format suffix string.
*/
void
gettype(formp)
ft_t formp;
{
char **list;
int i;
if (! formp->filetype)
fail("Must give file type for %s file, either as suffix or with -t option",
formp->filename);
for(i = 0; formats[i].names; i++) {
for(list = formats[i].names; *list; list++) {
char *s1 = *list, *s2 = formp->filetype;
if (! strcmpcase(s1, s2))
break; /* not a match */
}
if (! *list)
continue;
/* Found it! */
formp->h = &formats[i];
return;
}
if (! strcmpcase(formp->filetype, "snd")) {
verbose = 1;
report("File type '%s' is used to name several different formats.", formp->filetype);
report("If the file came from a Macintosh, it is probably");
report("a .ub file with a sample rate of 11025 (or possibly 5012 or 22050).");
report("Use the sequence '-t .ub -r 11025 file.snd'");
report("If it came from a PC, it's probably a Soundtool file.");
report("Use the sequence '-t .sndt file.snd'");
report("If it came from a NeXT, it's probably a .au file.");
fail("Use the sequence '-t .au file.snd'\n");
}
fail("File type '%s' of %s file is not known!",
formp->filetype, formp->filename);
}
/*
* Check that we have a known effect name.
*/
void
geteffect(effp)
eff_t effp;
{
int i;
for(i = 0; effects[i].name; i++) {
char *s1 = effects[i].name, *s2 = effp->name;
while(*s1 && *s2 && (tolower(*s1) == tolower(*s2)))
s1++, s2++;
if (*s1 || *s2)
continue; /* not a match */
/* Found it! */
effp->h = &effects[i];
return;
}
/* Guido Van Rossum fix */
fprintf(stderr, "%s: Known effects: ",myname);
for (i = 1; effects[i].name; i++)
fprintf(stderr, "%s ", effects[i].name);
fprintf(stderr, "\n");
fail("Effect '%s' is not known!", effp->name);
}
/*
* File format routines
*/
void copyformat(ft, ft2)
ft_t ft, ft2;
{
int noise = 0, i;
double factor;
if (ft2->info.rate == 0) {
ft2->info.rate = ft->info.rate;
noise = 1;
}
if (ft2->info.size == -1) {
ft2->info.size = ft->info.size;
noise = 1;
}
if (ft2->info.style == -1) {
ft2->info.style = ft->info.style;
noise = 1;
}
if (ft2->info.channels == -1) {
ft2->info.channels = ft->info.channels;
noise = 1;
}
if (ft2->comment == NULL) {
ft2->comment = ft->comment;
noise = 1;
}
/*
* copy loop info, resizing appropriately
* it's in samples, so # channels don't matter
*/
factor = (double) ft2->info.rate / (double) ft->info.rate;
for(i = 0; i < NLOOPS; i++) {
ft2->loops[i].start = ft->loops[i].start * factor;
ft2->loops[i].length = ft->loops[i].length * factor;
ft2->loops[i].count = ft->loops[i].count;
ft2->loops[i].type = ft->loops[i].type;
}
/* leave SMPTE # alone since it's absolute */
ft2->instr = ft->instr;
}
void cmpformats(ft, ft2)
ft_t ft, ft2;
{
}
/* check that all settings have been given */
void checkformat(ft)
ft_t ft;
{
if (ft->info.rate == 0)
fail("Sampling rate for %s file was not given\n", ft->filename);
if ((ft->info.rate < 100) || (ft->info.rate > 50000L))
fail("Sampling rate %lu for %s file is bogus\n",
ft->info.rate, ft->filename);
if (ft->info.size == -1)
fail("Data size was not given for %s file\nUse one of -b/-w/-l/-f/-d/-D", ft->filename);
if (ft->info.style == -1 && ft->info.size != FLOAT)
fail("Data style was not given for %s file\nUse one of -s/-u/-U/-A", ft->filename);
/* it's so common, might as well default */
if (ft->info.channels == -1)
ft->info.channels = 1;
/* fail("Number of output channels was not given for %s file",
ft->filename); */
}
static ft_t ft_queue[2];
void
sigint(s)
int s;
{
if (s == SIGINT) {
if (ft_queue[0])
ft_queue[0]->file.eof = 1;
if (ft_queue[1])
ft_queue[1]->file.eof = 1;
}
}
void
sigintreg(ft)
ft_t ft;
{
if (ft_queue[0] == 0)
ft_queue[0] = ft;
else
ft_queue[1] = ft;
signal(SIGINT, sigint);
}