| robert@464 | 1 /* | 
| robert@464 | 2  ____  _____ _        _ | 
| robert@464 | 3 | __ )| ____| |      / \ | 
| robert@464 | 4 |  _ \|  _| | |     / _ \ | 
| robert@464 | 5 | |_) | |___| |___ / ___ \ | 
| robert@464 | 6 |____/|_____|_____/_/   \_\ | 
| robert@464 | 7 | 
| robert@464 | 8 The platform for ultra-low latency audio and sensor processing | 
| robert@464 | 9 | 
| robert@464 | 10 http://bela.io | 
| robert@464 | 11 | 
| robert@464 | 12 A project of the Augmented Instruments Laboratory within the | 
| robert@464 | 13 Centre for Digital Music at Queen Mary University of London. | 
| robert@464 | 14 http://www.eecs.qmul.ac.uk/~andrewm | 
| robert@464 | 15 | 
| robert@464 | 16 (c) 2016 Augmented Instruments Laboratory: Andrew McPherson, | 
| robert@464 | 17   Astrid Bin, Liam Donovan, Christian Heinrichs, Robert Jack, | 
| robert@464 | 18   Giulio Moro, Laurel Pardue, Victor Zappi. All rights reserved. | 
| robert@464 | 19 | 
| robert@464 | 20 The Bela software is distributed under the GNU Lesser General Public License | 
| robert@464 | 21 (LGPL 3.0), available here: https://www.gnu.org/licenses/lgpl-3.0.txt | 
| robert@464 | 22 */ | 
| robert@464 | 23 | 
| robert@464 | 24 | 
| robert@464 | 25 #include <unistd.h> | 
| robert@464 | 26 #include <iostream> | 
| robert@464 | 27 #include <cstdlib> | 
| robert@464 | 28 #include <libgen.h> | 
| robert@464 | 29 #include <signal.h> | 
| robert@464 | 30 #include <getopt.h> | 
| robert@464 | 31 #include <Bela.h> | 
| robert@464 | 32 | 
| robert@464 | 33 using namespace std; | 
| robert@464 | 34 | 
| robert@464 | 35 // Handle Ctrl-C by requesting that the audio rendering stop | 
| robert@464 | 36 void interrupt_handler(int var) | 
| robert@464 | 37 { | 
| robert@464 | 38 	gShouldStop = true; | 
| robert@464 | 39 } | 
| robert@464 | 40 | 
| robert@464 | 41 // Print usage information | 
| robert@464 | 42 void usage(const char * processName) | 
| robert@464 | 43 { | 
| robert@464 | 44 	cerr << "Usage: " << processName << " [options]" << endl; | 
| robert@464 | 45 | 
| robert@464 | 46 	Bela_usage(); | 
| robert@464 | 47 | 
| robert@464 | 48 	cerr << "   --frequency [-f] frequency: Set the frequency of the oscillator\n"; | 
| robert@464 | 49 	cerr << "   --help [-h]:                Print this menu\n"; | 
| robert@464 | 50 } | 
| robert@464 | 51 | 
| robert@464 | 52 int main(int argc, char *argv[]) | 
| robert@464 | 53 { | 
| robert@464 | 54 	BelaInitSettings settings;	// Standard audio settings | 
| robert@464 | 55 	float frequency = 440.0;	// Frequency of oscillator | 
| robert@464 | 56 | 
| robert@464 | 57 	struct option customOptions[] = | 
| robert@464 | 58 	{ | 
| robert@464 | 59 		{"help", 0, NULL, 'h'}, | 
| robert@464 | 60 		{"frequency", 1, NULL, 'f'}, | 
| robert@464 | 61 		{NULL, 0, NULL, 0} | 
| robert@464 | 62 	}; | 
| robert@464 | 63 | 
| robert@464 | 64 	// Set default settings | 
| robert@464 | 65 	Bela_defaultSettings(&settings); | 
| robert@464 | 66 | 
| robert@464 | 67 	// Parse command-line arguments | 
| robert@464 | 68 	while (1) { | 
| robert@464 | 69 		int c; | 
| robert@464 | 70 		if ((c = Bela_getopt_long(argc, argv, "hf:", customOptions, &settings)) < 0) | 
| robert@464 | 71 				break; | 
| robert@464 | 72 		switch (c) { | 
| robert@464 | 73 		case 'h': | 
| robert@464 | 74 				usage(basename(argv[0])); | 
| robert@464 | 75 				exit(0); | 
| robert@464 | 76 		case 'f': | 
| robert@464 | 77 				frequency = atof(optarg); | 
| robert@464 | 78 				break; | 
| robert@464 | 79 		case '?': | 
| robert@464 | 80 		default: | 
| robert@464 | 81 				usage(basename(argv[0])); | 
| robert@464 | 82 				exit(1); | 
| robert@464 | 83 		} | 
| robert@464 | 84 	} | 
| robert@464 | 85 | 
| robert@464 | 86 	// Initialise the PRU audio device | 
| robert@464 | 87 	if(Bela_initAudio(&settings, &frequency) != 0) { | 
| robert@464 | 88 		cout << "Error: unable to initialise audio" << endl; | 
| robert@464 | 89 		return -1; | 
| robert@464 | 90 	} | 
| robert@464 | 91 | 
| robert@464 | 92 	// Start the audio device running | 
| robert@464 | 93 	if(Bela_startAudio()) { | 
| robert@464 | 94 		cout << "Error: unable to start real-time audio" << endl; | 
| robert@464 | 95 		return -1; | 
| robert@464 | 96 	} | 
| robert@464 | 97 | 
| robert@464 | 98 	// Set up interrupt handler to catch Control-C and SIGTERM | 
| robert@464 | 99 	signal(SIGINT, interrupt_handler); | 
| robert@464 | 100 	signal(SIGTERM, interrupt_handler); | 
| robert@464 | 101 | 
| robert@464 | 102 	// Run until told to stop | 
| robert@464 | 103 	while(!gShouldStop) { | 
| robert@464 | 104 		usleep(100000); | 
| robert@464 | 105 	} | 
| robert@464 | 106 | 
| robert@464 | 107 	// Stop the audio device | 
| robert@464 | 108 	Bela_stopAudio(); | 
| robert@464 | 109 | 
| robert@464 | 110 	// Clean up any resources allocated for audio | 
| robert@464 | 111 	Bela_cleanupAudio(); | 
| robert@464 | 112 | 
| robert@464 | 113 	// All done! | 
| robert@464 | 114 	return 0; | 
| robert@464 | 115 } |