Files
stk/projects/eguitar/utilities.cpp
Gary Scavone fc877b87bf Version 4.4.4
2013-09-29 23:22:28 +02:00

208 lines
5.5 KiB
C++

// Miscellaneous parsing and error functions for use with STK projects.
//
// Gary P. Scavone, 1999.
#include "utilities.h"
#include <cstring>
#include <stdlib.h>
#if defined(__STK_REALTIME__)
#include "RtAudio.h"
#endif
using namespace stk;
void usage(char *function) {
// Error function in case of incorrect command-line argument specifications
printf("\nusage: %s flag(s)\n", function);
printf(" where flag(s) = \n");
printf(" -s RATE to specify a sample rate,\n");
printf(" -ow <file name> for .wav audio output file,\n");
printf(" -os <file name> for .snd audio output file,\n");
printf(" -om <file name> for .mat audio output file,\n");
printf(" -oa <file name> for .aif audio output file,\n");
printf(" -if <file name> to read control input from SKINI file,\n");
#if defined(__STK_REALTIME__)
printf(" -or for realtime audio output,\n");
printf(" -ip for realtime control input by pipe,\n");
printf(" -im <port> for realtime control input by MIDI (virtual port = 0, default = 1).");
#endif
printf("\n");
printf("\n Simultaneous multiple output types are supported.\n");
printf(" Likewise, simultaneous control input types are supported.\n");
printf(" SKINI formatted scorefiles can be piped or redirected\n");
printf(" to %s, though realtime control flags should be omitted\n", function);
printf(" when doing so. If the optional <file names> are not\n");
printf(" specified, default names will be indicated. Each flag\n");
printf(" must include its own '-' sign.\n\n");
exit(0);
}
int checkArgs(int nArgs, char *args[])
{
int w, i = 1, j = 0;
int nWvOuts = 0;
char flags[2][50] = {""};
bool realtime = false;
if (nArgs < 3 || nArgs > 22) usage(args[0]);
while (i < nArgs) {
if (args[i][0] == '-') {
if (args[i][1] == 'o') {
if ( args[i][2] == 'r' ) realtime = true;
if ( (args[i][2] == 's') || (args[i][2] == 'w') ||
(args[i][2] == 'm') || (args[i][2] == 'a') )
nWvOuts++;
flags[0][j] = 'o';
flags[1][j++] = args[i][2];
}
else if (args[i][1] == 'i') {
if ( (args[i][2] != 'p') &&
(args[i][2] != 'm') && (args[i][2] != 'f') ) usage(args[0]);
flags[0][j] = 'i';
flags[1][j++] = args[i][2];
}
else if (args[i][1] == 's' && (i+1 < nArgs) && args[i+1][0] != '-' ) {
Stk::setSampleRate( atoi(args[i+1]) );
flags[0][j++] = 's';
}
else usage(args[0]);
}
i++;
}
// Check for multiple flags of the same type
for ( i=0; i<=j; i++ ) {
w = i+1;
while (w <= j ) {
if ( flags[0][i] == flags[0][w] && flags[1][i] == flags[1][w] ) {
printf("\nError: Multiple command line flags of the same type specified.\n\n");
usage(args[0]);
}
w++;
}
}
// Make sure we have at least one output type
if ( nWvOuts < 1 && !realtime ) usage(args[0]);
return nWvOuts;
}
bool parseArgs(int nArgs, char *args[], WvOut **output, Messager& messager)
{
int i = 1, j = 0, nWvIns = 0;
bool realtime = false;
char fileName[256];
while (i < nArgs) {
if ( (args[i][0] == '-') && (args[i][1] == 'i') ) {
switch(args[i][2]) {
case 'f':
strcpy(fileName,args[++i]);
if ( !messager.setScoreFile( fileName ) ) exit(0);
nWvIns++;
break;
case 'p':
#if defined(__STK_REALTIME__)
if ( !messager.startStdInput() ) exit(0);
nWvIns++;
break;
#else
usage(args[0]);
#endif
case 'm':
#if defined(__STK_REALTIME__)
// Check for an optional MIDI port argument.
if ((i+1 < nArgs) && args[i+1][0] != '-') {
int port = atoi(args[++i]);
if ( !messager.startMidiInput( port-1 ) ) exit(0);
}
else if ( !messager.startMidiInput() ) exit(0);
nWvIns++;
break;
#else
usage(args[0]);
#endif
default:
usage(args[0]);
break;
}
}
else if ( (args[i][0] == '-') && (args[i][1] == 'o') ) {
switch(args[i][2]) {
case 'r':
#if defined(__STK_REALTIME__)
realtime = true;
break;
#else
usage(args[0]);
#endif
case 'w':
if ((i+1 < nArgs) && args[i+1][0] != '-') {
i++;
strcpy(fileName,args[i]);
}
else strcpy(fileName,"testwav");
output[j] = new FileWvOut(fileName, 1, FileWrite::FILE_WAV );
j++;
break;
case 's':
if ((i+1 < nArgs) && args[i+1][0] != '-') {
i++;
strcpy(fileName,args[i]);
}
else strcpy(fileName,"testsnd");
output[j] = new FileWvOut(fileName,1, FileWrite::FILE_SND);
j++;
break;
case 'm':
if ((i+1 < nArgs) && args[i+1][0] != '-') {
i++;
strcpy(fileName,args[i]);
}
else strcpy(fileName,"testmat");
output[j] = new FileWvOut(fileName,1, FileWrite::FILE_MAT);
j++;
break;
case 'a':
if ((i+1 < nArgs) && args[i+1][0] != '-') {
i++;
strcpy(fileName,args[i]);
}
else strcpy(fileName,"testaif");
output[j] = new FileWvOut(fileName,1, FileWrite::FILE_AIF );
j++;
break;
default:
usage(args[0]);
break;
}
}
i++;
}
if ( nWvIns == 0 ) {
#if defined(__STK_REALTIME__)
if ( !messager.startStdInput() ) exit(0);
#else
printf("\nError: The -if file input flag must be specified for non-realtime use.\n\n");
usage(args[0]);
#endif
}
return realtime;
}