Mercurial > hg > beaglert
comparison projects/basic_analog_output/main.cpp @ 5:09f03ac40fcc
API improvements and cleanups. Now all common audio command-line options can be parsed automatically.
| author | andrewm |
|---|---|
| date | Sat, 08 Nov 2014 16:16:55 +0100 |
| parents | 8a575ba3ab52 |
| children | 901d205d1a3c |
comparison
equal
deleted
inserted
replaced
| 4:f34c63568523 | 5:09f03ac40fcc |
|---|---|
| 7 | 7 |
| 8 #include <iostream> | 8 #include <iostream> |
| 9 #include <cstdlib> | 9 #include <cstdlib> |
| 10 #include <libgen.h> | 10 #include <libgen.h> |
| 11 #include <signal.h> | 11 #include <signal.h> |
| 12 #include <getopt.h> | |
| 12 #include "../../include/RTAudio.h" | 13 #include "../../include/RTAudio.h" |
| 13 | 14 |
| 14 using namespace std; | 15 using namespace std; |
| 15 | 16 |
| 16 // Handle Ctrl-C by requesting that the audio rendering stop | 17 // Handle Ctrl-C by requesting that the audio rendering stop |
| 20 } | 21 } |
| 21 | 22 |
| 22 // Print usage information | 23 // Print usage information |
| 23 void usage(const char * processName) | 24 void usage(const char * processName) |
| 24 { | 25 { |
| 25 cerr << "Usage: " << processName << " [-h] [-v] [-p period] [-f input] [-a input]" << endl; | 26 cerr << "Usage: " << processName << " [options]" << endl; |
| 26 cerr << " -h: Print this menu\n"; | 27 |
| 27 cerr << " -v: Enable verbose messages\n"; | 28 BeagleRT_usage(); |
| 28 cerr << " -p period: Set the period (hardware buffer) size in sensor frames\n"; | 29 |
| 29 cerr << " -f frequency: Set frequency of LED fade (default: 1.0)\n"; | 30 cerr << " --frequency [-f] frequency: Set the frequency of the LED fade (default: 1.0)\n"; |
| 31 cerr << " --help [-h]: Print this menu\n"; | |
| 30 } | 32 } |
| 31 | 33 |
| 32 int main(int argc, char *argv[]) | 34 int main(int argc, char *argv[]) |
| 33 { | 35 { |
| 34 int periodSize = 8; // Period size in sensor frames | 36 RTAudioSettings settings; // Standard audio settings |
| 35 int verbose = 0; // Verbose printing level | 37 float frequency = 1.0; // Frequency of LED fades |
| 36 float frequency = 1.0; // Frequency of LED fades | 38 |
| 39 struct option customOptions[] = | |
| 40 { | |
| 41 {"help", 0, NULL, 'h'}, | |
| 42 {"frequency", 1, NULL, 'f'}, | |
| 43 {NULL, 0, NULL, 0} | |
| 44 }; | |
| 45 | |
| 46 // Set default settings | |
| 47 BeagleRT_defaultSettings(&settings); | |
| 48 | |
| 49 // In this example, audio isn't used so might as well leave speaker muted | |
| 50 settings.beginMuted = 1; | |
| 37 | 51 |
| 38 // Parse command-line arguments | 52 // Parse command-line arguments |
| 39 while (1) { | 53 while (1) { |
| 40 int c; | 54 int c; |
| 41 if ((c = getopt(argc, argv, "hp:vf:")) < 0) | 55 if ((c = BeagleRT_getopt_long(argc, argv, "hf:", customOptions, &settings)) < 0) |
| 42 break; | 56 break; |
| 43 switch (c) { | 57 switch (c) { |
| 44 case 'h': | 58 case 'h': |
| 45 usage(basename(argv[0])); | 59 usage(basename(argv[0])); |
| 46 exit(0); | 60 exit(0); |
| 47 case 'p': | |
| 48 periodSize = atoi(optarg); | |
| 49 if(periodSize < 1) | |
| 50 periodSize = 1; | |
| 51 break; | |
| 52 case 'v': | |
| 53 verbose = 1; | |
| 54 break; | |
| 55 case 'f': | 61 case 'f': |
| 56 frequency = atof(optarg); | 62 frequency = atof(optarg); |
| 57 if(frequency < 0) | 63 if(frequency < 0) |
| 58 frequency = 0; | 64 frequency = 0; |
| 59 if(frequency > 11025.0) | 65 if(frequency > 11025.0) |
| 64 usage(basename(argv[0])); | 70 usage(basename(argv[0])); |
| 65 exit(1); | 71 exit(1); |
| 66 } | 72 } |
| 67 } | 73 } |
| 68 | 74 |
| 69 | |
| 70 // Set verbose logging information (optional by using value > 0; default is 0) | |
| 71 setVerboseLevel(verbose); | |
| 72 | |
| 73 if(verbose) { | |
| 74 cout << "Starting with period size " << periodSize << " and frequency " << frequency << endl; | |
| 75 } | |
| 76 | |
| 77 // Initialise the PRU audio device | 75 // Initialise the PRU audio device |
| 78 if(initAudio(periodSize, 1, &frequency) != 0) { | 76 if(BeagleRT_initAudio(&settings, &frequency) != 0) { |
| 79 cout << "Error: unable to initialise audio" << endl; | 77 cout << "Error: unable to initialise audio" << endl; |
| 80 return -1; | 78 return -1; |
| 81 } | 79 } |
| 82 | 80 |
| 83 // Start the audio device running | 81 // Start the audio device running |
| 84 if(startAudio()) { | 82 if(BeagleRT_startAudio()) { |
| 85 cout << "Error: unable to start real-time audio" << endl; | 83 cout << "Error: unable to start real-time audio" << endl; |
| 86 return -1; | 84 return -1; |
| 87 } | 85 } |
| 88 | 86 |
| 89 // Set up interrupt handler to catch Control-C | 87 // Set up interrupt handler to catch Control-C |
| 93 while(!gShouldStop) { | 91 while(!gShouldStop) { |
| 94 usleep(100000); | 92 usleep(100000); |
| 95 } | 93 } |
| 96 | 94 |
| 97 // Stop the audio device | 95 // Stop the audio device |
| 98 stopAudio(); | 96 BeagleRT_stopAudio(); |
| 99 | |
| 100 if(verbose) { | |
| 101 cout << "Cleaning up..." << endl; | |
| 102 } | |
| 103 | 97 |
| 104 // Clean up any resources allocated for audio | 98 // Clean up any resources allocated for audio |
| 105 cleanupAudio(); | 99 BeagleRT_cleanupAudio(); |
| 106 | 100 |
| 107 // All done! | 101 // All done! |
| 108 return 0; | 102 return 0; |
| 109 } | 103 } |
