| robert@464 | 1 /* | 
| robert@464 | 2  * main.cpp | 
| robert@464 | 3  * | 
| robert@464 | 4  *  Created on: Oct 24, 2014 | 
| robert@464 | 5  *      Author: parallels | 
| robert@464 | 6  */ | 
| robert@464 | 7 | 
| robert@464 | 8 #include <iostream> | 
| robert@464 | 9 #include <cstdlib> | 
| robert@464 | 10 #include <libgen.h> | 
| robert@464 | 11 #include <signal.h> | 
| robert@464 | 12 #include <getopt.h> | 
| robert@464 | 13 #include <Bela.h> | 
| robert@464 | 14 | 
| robert@464 | 15 using namespace std; | 
| robert@464 | 16 | 
| robert@464 | 17 int gNumOscillators = 32; | 
| robert@464 | 18 int gWavetableLength = 1024; | 
| robert@464 | 19 | 
| robert@464 | 20 // Handle Ctrl-C by requesting that the audio rendering stop | 
| robert@464 | 21 void interrupt_handler(int var) | 
| robert@464 | 22 { | 
| robert@464 | 23 	gShouldStop = true; | 
| robert@464 | 24 } | 
| robert@464 | 25 | 
| robert@464 | 26 // Print usage information | 
| robert@464 | 27 void usage(const char * processName) | 
| robert@464 | 28 { | 
| robert@464 | 29 	cerr << "Usage: " << processName << " [options]" << endl; | 
| robert@464 | 30 | 
| robert@464 | 31 	Bela_usage(); | 
| robert@464 | 32 | 
| robert@464 | 33 	cerr << "   --num-oscillators [-n] oscs: Set the number of oscillators to use (default: 32)\n"; | 
| robert@464 | 34 	cerr << "   --wavetable [-w] length:     Set the wavetable length in samples (default: 1024)\n"; | 
| robert@464 | 35 	cerr << "   --help [-h]:                 Print this menu\n"; | 
| robert@464 | 36 } | 
| robert@464 | 37 | 
| robert@464 | 38 int main(int argc, char *argv[]) | 
| robert@464 | 39 { | 
| robert@464 | 40 	BelaInitSettings settings;	// Standard audio settings | 
| robert@464 | 41 | 
| robert@464 | 42 	struct option customOptions[] = | 
| robert@464 | 43 	{ | 
| robert@464 | 44 		{"help", 0, NULL, 'h'}, | 
| robert@464 | 45 		{"num-oscillators", 1, NULL, 'n'}, | 
| robert@464 | 46 		{"wavetable", 1, NULL, 'w'}, | 
| robert@464 | 47 		{NULL, 0, NULL, 0} | 
| robert@464 | 48 	}; | 
| robert@464 | 49 | 
| robert@464 | 50 	// Set default settings | 
| robert@464 | 51 	Bela_defaultSettings(&settings); | 
| robert@464 | 52 | 
| robert@464 | 53 	// Parse command-line arguments | 
| robert@464 | 54 	while (1) { | 
| robert@464 | 55 		int c; | 
| robert@464 | 56 		if ((c = Bela_getopt_long(argc, argv, "hn:w:", customOptions, &settings)) < 0) | 
| robert@464 | 57 				break; | 
| robert@464 | 58 		switch (c) { | 
| robert@464 | 59 		case 'h': | 
| robert@464 | 60 				usage(basename(argv[0])); | 
| robert@464 | 61 				exit(0); | 
| robert@464 | 62 		case 'n': | 
| robert@464 | 63 				gNumOscillators = atoi(optarg); | 
| robert@464 | 64 				if(gNumOscillators <= 0) { | 
| robert@464 | 65 					usage(basename(argv[0])); | 
| robert@464 | 66 					exit(0); | 
| robert@464 | 67 				} | 
| robert@464 | 68 				break; | 
| robert@464 | 69 		case 'w': | 
| robert@464 | 70 				gWavetableLength = atoi(optarg); | 
| robert@464 | 71 				if(gWavetableLength < 4) | 
| robert@464 | 72 					gWavetableLength = 4; | 
| robert@464 | 73 				if(gWavetableLength > 16384) | 
| robert@464 | 74 					gWavetableLength = 16384; | 
| robert@464 | 75 				break; | 
| robert@464 | 76 		case '?': | 
| robert@464 | 77 		default: | 
| robert@464 | 78 				usage(basename(argv[0])); | 
| robert@464 | 79 				exit(1); | 
| robert@464 | 80 		} | 
| robert@464 | 81 	} | 
| robert@464 | 82 | 
| robert@464 | 83 	// Initialise the PRU audio device | 
| robert@464 | 84 	if(Bela_initAudio(&settings, 0) != 0) { | 
| robert@464 | 85 		cout << "Error: unable to initialise audio" << endl; | 
| robert@464 | 86 		return -1; | 
| robert@464 | 87 	} | 
| robert@464 | 88 | 
| robert@464 | 89 	if(settings.verbose) { | 
| robert@464 | 90 		cout << "--> Using " << gNumOscillators << " oscillators and wavetable of " << gWavetableLength << " samples\n"; | 
| robert@464 | 91 	} | 
| robert@464 | 92 | 
| robert@464 | 93 	// Start the audio device running | 
| robert@464 | 94 	if(Bela_startAudio()) { | 
| robert@464 | 95 		cout << "Error: unable to start real-time audio" << endl; | 
| robert@464 | 96 		return -1; | 
| robert@464 | 97 	} | 
| robert@464 | 98 | 
| robert@464 | 99 	// Set up interrupt handler to catch Control-C and SIGTERM | 
| robert@464 | 100 	signal(SIGINT, interrupt_handler); | 
| robert@464 | 101 	signal(SIGTERM, interrupt_handler); | 
| robert@464 | 102 | 
| robert@464 | 103 	// Run until told to stop | 
| robert@464 | 104 	while(!gShouldStop) { | 
| robert@464 | 105 		usleep(100000); | 
| robert@464 | 106 	} | 
| robert@464 | 107 | 
| robert@464 | 108 	// Stop the audio device | 
| robert@464 | 109 	Bela_stopAudio(); | 
| robert@464 | 110 | 
| robert@464 | 111 	// Clean up any resources allocated for audio | 
| robert@464 | 112 	Bela_cleanupAudio(); | 
| robert@464 | 113 | 
| robert@464 | 114 	// All done! | 
| robert@464 | 115 	return 0; | 
| robert@464 | 116 } |