Goto: [ Program Documentation ]
// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Sat Apr 25 21:19:21 PDT 1998 // Last Modified: Sat Apr 25 21:19:24 PDT 1998 // Filename: ...sig/doc/examples/sig/sigfile/sndcomment/sndcomment.cpp // Syntax: C++; sig // // Description: extracts or replaces a comment in a soundfile. // #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); char* getcomment(const char* filename); /////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { Options options(argc, argv); checkOptions(options); SoundHeader header(options.getArg(1)); char* comment; if (strlen(options.getString("comment-file")) != 0) { comment = getcomment(options.getString("comment-file")); } else { comment = new char[strlen(options.getString("comment")) + 1]; strcpy(comment, options.getString("comment")); } header.setComment(comment); int numSamples = header.getSamples() * header.getChannels(); // Elements: SoundFileIn insound(options.getArg(1)); SoundFileOut outsound(options.getArg(2), header); // Connections: for (int i=0; i<header.getChannels(); i++) { outsound.connect(insound, i, i); } Action action; action.tick(outsound, numSamples); delete [] comment; return 0; } /////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // checkOptions -- handle command-line options. // void checkOptions(Options& opts) { opts.define("c|comment=s"); opts.define("f|file|comment-file=s"); opts.define("e|extract=b"); 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, March 1998" << 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); } if (opts.getBoolean("extract")) { SoundHeader header(opts.getArg(1)); cout << header.getComment() << endl; exit(0); } // can only have one input and one output filename if (opts.getArgCount() == 0) { cout << "Error: need one output file name." << endl; usage(opts.getCommand()); exit(1); } else if (opts.getArgCount() > 2) { cout << "Error: too many arguments. Given " << opts.getArgCount() << " but need only 2." << endl; usage(opts.getCommand()); exit(1); } } ////////////////////////////// // // example -- gives example calls to the dcblock program. // void example(void) { cout << "# sndcomment examples: \n" " sndcomment -c \"This is a comment\" in.snd out.snd \n" << endl; } ////////////////////////////// // // usage -- how to run the osc program on the command line. // void usage(const char* command) { cout << " \n" "Sets a comment in the soundfile header. Doesn't work with \n" " \n" "Usage: " << command << " [-c comment][-f file][-e] insound outsound \n" " \n" "Options: \n" " -c = comment string \n" " -f = comment file. overrides the -c option \n" " -e = extracts the comment from the input soundfile \n" " --options = list of all options, aliases and defaults \n" << endl; } ////////////////////////////// // // getcomment -- gets a comment from a text file. // char* getcomment(const char* filename) { #ifndef OLDCPP fstream infile(filename, ios::in); #else fstream infile(filename, ios::nocreate | ios::in); #endif // figure out how many bytes in file: infile.seekg(0, ios::end); int size = infile.tellg(); infile.seekg(0, ios::beg); char* output = new char[size + 1]; output[size] = '\0'; infile.read(output, sizeof(char) * size); return output; } // md5sum: 8a8e7d1b16e40c1658c739f6012c7f26 sndcomment.cpp [20050403]