ref: 1e2e146fe7ef2b968ab1d3acadd743e031833ece
dir: /src/util.c/
/* * 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); }