// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Sun Jan 19 07:51:14 PST 2003 // Last Modified: Sun Jan 19 07:51:17 PST 2003 // Filename: ...sig/doc/examples/sig/sigfile/addsnd/addsnd.cpp // Syntax: C++; sig // // Description: Adds multiple sound files into one file. The // channel count of the output file is equal to // the maximum channel count of the input files. // All input soundfiles must contain the same // sampling rete. If they do not, then the sample // rate of the first soundfile in the input list // will be used. // // Usage: addsnd [-a ampscale] insound(s) outsound // // Options: // -a = scale the amplitude of all input soundfiles by this value. // --options = list of all options, aliases and defaults // #include "sigAudio.h" #include <stdlib.h> #ifndef OLDCPP #include <iostream> using namespace std; #else #include <iostream.h> #endif void checkOptions(Options& opts); void example(void); void usage(const char* command); double amplitude = 1.0; // used with -a option /////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { Options options(argc, argv); checkOptions(options); int incount = options.getArgCount() - 1; SoundHeader* headers; headers = new SoundHeader[incount]; int maxchannel = 0; int maxsamples = 0; int i, j; for (i=0; i<incount; i++) { headers[i].setHeader(options.getArg(i+1)); if (maxchannel < headers[i].getChannels()) { maxchannel = headers[i].getChannels(); } if (maxsamples < headers[i].getSamples()) { maxsamples = headers[i].getSamples(); } } SoundHeader outheader; outheader.setChannels(maxchannel); outheader.setSrate(headers[0].getSrate()); // Elements SoundFileOut outsound(options.getArg(incount + 1), outheader); SoundFileIn insounds[incount]; Scale* scales; scales = new Scale[maxchannel]; Add* summation; summation = new Add[maxchannel]; for (i=0; i<maxchannel; i++) { scales[i].setScale(amplitude); } for (i=0; i<incount; i++) { insounds[i].setFile(options.getArg(i+1)); for (j=0; j<headers[i].getChannels(); j++) { summation[j].connect(insounds[i], NONE, j); } } for (i=0; i<maxchannel; i++) { scales[i].connect(summation[i]); outsound.connect(scales[i], i, i); } Action action; action.tick(outsound, maxsamples); return 0; } /////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // checkOptions -- handle command-line options. // void checkOptions(Options& opts) { opts.define("a|amp|amplitude=d:1.0", "amplitude scaling for all channels"); opts.define("author=b"); opts.define("version=b"); opts.define("example=b"); opts.define("help=b"); opts.process(); if (opts.getBoolean("author")) { cout << "Written by Craig Stuart Sapp, " << "craig@ccrma.stanford.edu, January 2003" << endl; exit(0); } if (opts.getBoolean("version")) { cout << "compiled: " << __DATE__ << endl; cout << SIG_VERSION << endl; exit(0); } if (opts.getBoolean("help")) { usage(opts.getCommand()); exit(0); } if (opts.getBoolean("example")) { example(); exit(0); } // must have at least two sound filenames if (opts.getArgCount() < 2) { cout << "Error: need at least one input soundfile." << endl; usage(opts.getCommand()); exit(1); } amplitude = opts.getDouble("amplitude"); } ////////////////////////////// // // example -- gives example calls to the addsnd program. // void example(void) { cout << " \n" "# addsnd examples: \n" << endl; } ////////////////////////////// // // usage -- how to run the addsnd program on the command line. // void usage(const char* command) { cout << " \n" "Usage: " << command << " [-a amp] insound(s) outsound \n" " \n" << endl; } // md5sum: fc5e56969319ff1a24f64241e8d9c78a addsnd.cpp [20050403]