// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Wed Oct 16 22:51:28 PDT 2002 // Last Modified: Wed Oct 16 22:51:31 PDT 2002 // Filename: ...sig/doc/examples/sig/sigfile/setsrate/setsrate.cpp // Syntax: C++; sig // // Description: Set the sampling rate of a soundfile to the secified // sampling rate value without changing the data. Currently // only works with WAVE files. // #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); // command line intervace variables: int srate = 44100; // used with the -r option /////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { Options options(argc, argv); checkOptions(options); // first check if the file is probably a WAVE soundfile #ifndef OLDCPP #ifdef VISUAL fstream soundfile(options.getArg(1), ios::in | ios::out | ios::binary); #else fstream soundfile(options.getArg(1), ios::in | ios::out); #endif #else #ifdef VISUAL fstream soundfile(options.getArg(1), ios::in | ios::out | ios::nocreate | ios::binary); #else fstream soundfile(options.getArg(1), ios::in | ios::out | ios::nocreate); #endif #endif if (!soundfile.is_open()) { cout << "Error: cannot open soundfile: " << options.getArg(1) << endl; exit(1); } union { long i; unsigned char c[4]; } data; union { long i; unsigned char c[4]; } sdata; soundfile.read((char*)data.c, 4); if (data.c[0] != 'R' || data.c[1] != 'I' || data.c[2] != 'F' || data.c[3] != 'F') { cout << "The soundfile: " << options.getArg(1) << " is not a WAVE file" << endl; exit(1); } sdata.i = (long)srate; data.c[0] = sdata.c[3]; data.c[1] = sdata.c[2]; data.c[2] = sdata.c[1]; data.c[3] = sdata.c[0]; soundfile.seekp(24); soundfile.write((char*)sdata.c, 4); soundfile.close(); return 0; } /////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // checkOptions -- handle command-line options. // void checkOptions(Options& opts) { opts.define("s|r|samplerate|rate|srate=i:44100"); 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, Oct 2002" << 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); } // can only have one filename if (opts.getArgCount() == 0) { cout << "Error: need one soundfile name." << endl; usage(opts.getCommand()); exit(1); } else if (opts.getArgCount() > 1) { cout << "Error: too many arguments. Given " << opts.getArgCount() << " but need only 1." << endl; usage(opts.getCommand()); exit(1); } srate = opts.getInteger("samplerate"); } ////////////////////////////// // // example -- gives example calls to the osc program. // void example(void) { cout << "# setsrate examples: \n" << endl; } ////////////////////////////// // // usage -- how to run the osc program on the command line. // void usage(const char* command) { cout << " \n" "Creates a frequency and amplitude varying sinusoid. \n" " \n" "Usage: " << command << " [-s srate] soundfile \n" " \n" "Options: \n" " -s = sampling rate to set the soundfile to \n" " --options = list of all options, aliases and default values. \n" " \n" " \n" << endl; } // md5sum: 4ff1da78a2f59dd1380cbfcee64b9276 setsrate.cpp [20050403]