annotate core/RTAudioCommandLine.cpp @ 19:c98863e63174 matrix_gpio

Renamed matrixGpio to digital and matrix to analog
author Giulio Moro <giuliomoro@yahoo.it>
date Thu, 30 Apr 2015 16:58:41 +0100
parents 670be80463a3
children 182ae9367104
rev   line source
andrewm@5 1 /*
andrewm@5 2 * RTAudioCommandLine.cpp
andrewm@5 3 *
andrewm@5 4 * Created on: Nov 8, 2014
andrewm@5 5 * Author: parallels
andrewm@5 6 */
andrewm@5 7
andrewm@5 8 #include <iostream>
andrewm@5 9 #include <cstdlib>
andrewm@5 10 #include <cstring>
andrewm@5 11 #include <getopt.h>
andrewm@5 12 #include "../include/RTAudio.h"
andrewm@5 13
andrewm@5 14 // Default command-line options for RTAudio
andrewm@5 15 struct option gDefaultLongOptions[] =
andrewm@5 16 {
andrewm@5 17 {"period", 1, NULL, 'p'},
andrewm@5 18 {"verbose", 0, NULL, 'v'},
giuliomoro@19 19 {"use-analog", 1, NULL, 'm'},
giuliomoro@19 20 {"use-analog-gpio", 1, NULL, 'g'},
giuliomoro@19 21 {"analog-channels", 1, NULL, 'C'},
giuliomoro@19 22 {"analog-gpio-channels", 1, NULL, 'G'},
andrewm@5 23 {"mute-speaker", 1, NULL, 'M'},
andrewm@5 24 {"dac-level", 1, NULL, 'D'},
andrewm@5 25 {"adc-level", 1, NULL, 'A'},
andrewm@5 26 {"hp-level", 1, NULL, 'H'},
giuliomoro@16 27 {"pru-file",1,NULL,'P'},
andrewm@5 28 {NULL, 0, NULL, 0}
andrewm@5 29 };
andrewm@5 30
giuliomoro@16 31 const char gDefaultShortOptions[] = "p:vm:M:C:D:A:H:P:g:G:";
andrewm@5 32
andrewm@5 33 // This function sets the default settings for the RTAudioSettings structure
andrewm@5 34 void BeagleRT_defaultSettings(RTAudioSettings *settings)
andrewm@5 35 {
andrewm@5 36 // Set default values for settings
andrewm@5 37 settings->periodSize = 8;
andrewm@5 38 settings->beginMuted = 0;
andrewm@5 39 settings->dacLevel = DEFAULT_DAC_LEVEL;
andrewm@5 40 settings->adcLevel = DEFAULT_ADC_LEVEL;
andrewm@5 41 settings->headphoneLevel = DEFAULT_HP_LEVEL;
giuliomoro@19 42 settings->useAnalog = 1;
giuliomoro@19 43 settings->useDigital = 1;
giuliomoro@19 44 settings->numAnalogChannels = 8;
giuliomoro@19 45 settings->numDigitalChannels = 16;
andrewm@5 46 settings->verbose = 0;
giuliomoro@16 47 settings->pruFilename[0]='\0';
andrewm@5 48 settings->codecI2CAddress = CODEC_I2C_ADDRESS;
andrewm@5 49 settings->ampMutePin = kAmplifierMutePin;
andrewm@5 50 }
andrewm@5 51
andrewm@5 52 // This function drops in place of getopt() in the main() function
andrewm@5 53 // and handles the initialisation of the RTAudio settings using
andrewm@5 54 // standard command-line arguments. System default arguments will
andrewm@5 55 // be stored in settings, otherwise arguments will be returned
andrewm@5 56 // as getopt() normally does.
andrewm@5 57
andrewm@5 58 int BeagleRT_getopt_long(int argc, char *argv[], const char *customShortOptions, const struct option *customLongOptions, RTAudioSettings *settings)
andrewm@5 59 {
andrewm@5 60 static int firstRun = 1;
andrewm@5 61 static char totalShortOptions[256];
andrewm@5 62 static struct option totalLongOptions[256];
andrewm@5 63
andrewm@5 64 int c;
andrewm@5 65
andrewm@5 66 // Prep total option string the first time this is
andrewm@5 67 // run. As a getopt() substitute, it will be called repeatedly working its
andrewm@5 68 // way through argc and argv.
andrewm@5 69 if(firstRun) {
andrewm@5 70 firstRun = 0;
andrewm@5 71
andrewm@5 72 // Copy short options into one string
andrewm@5 73 strcpy(totalShortOptions, gDefaultShortOptions);
andrewm@5 74 strncat(totalShortOptions, customShortOptions, 256 - strlen(gDefaultShortOptions) - 1);
andrewm@5 75
andrewm@5 76 // Copy long options into one array
andrewm@5 77 int n = 0;
andrewm@5 78 while(1) {
andrewm@5 79 if(gDefaultLongOptions[n].name == NULL)
andrewm@5 80 break;
andrewm@5 81 totalLongOptions[n].name = gDefaultLongOptions[n].name;
andrewm@5 82 totalLongOptions[n].has_arg = gDefaultLongOptions[n].has_arg;
andrewm@5 83 totalLongOptions[n].flag = gDefaultLongOptions[n].flag;
andrewm@5 84 totalLongOptions[n].val = gDefaultLongOptions[n].val;
andrewm@5 85 n++;
andrewm@5 86 }
andrewm@5 87
andrewm@5 88 // Copy custom options into the array, if present
andrewm@5 89 if(customLongOptions == 0) {
andrewm@5 90 // Terminate the array
andrewm@5 91 totalLongOptions[n].name = NULL;
andrewm@5 92 totalLongOptions[n].has_arg = 0;
andrewm@5 93 totalLongOptions[n].flag = NULL;
andrewm@5 94 totalLongOptions[n].val = 0;
andrewm@5 95 }
andrewm@5 96 else {
andrewm@5 97 int customIndex = 0;
andrewm@5 98 while(n < 256) {
andrewm@5 99 if(customLongOptions[customIndex].name == NULL)
andrewm@5 100 break;
andrewm@5 101 totalLongOptions[n].name = customLongOptions[customIndex].name;
andrewm@5 102 totalLongOptions[n].has_arg = customLongOptions[customIndex].has_arg;
andrewm@5 103 totalLongOptions[n].flag = customLongOptions[customIndex].flag;
andrewm@5 104 totalLongOptions[n].val = customLongOptions[customIndex].val;
andrewm@5 105 n++;
andrewm@5 106 customIndex++;
andrewm@5 107 }
andrewm@5 108
andrewm@5 109 // Terminate the array
andrewm@5 110 totalLongOptions[n].name = NULL;
andrewm@5 111 totalLongOptions[n].has_arg = 0;
andrewm@5 112 totalLongOptions[n].flag = NULL;
andrewm@5 113 totalLongOptions[n].val = 0;
andrewm@5 114 }
andrewm@5 115 }
andrewm@5 116
andrewm@5 117 while(1) {
andrewm@5 118 if ((c = getopt_long(argc, argv, totalShortOptions, totalLongOptions, NULL)) < 0)
andrewm@5 119 return c;
andrewm@5 120
andrewm@5 121 switch (c) {
andrewm@5 122 case 'p':
andrewm@5 123 settings->periodSize = atoi(optarg);
andrewm@5 124 if(settings->periodSize < 1)
andrewm@5 125 settings->periodSize = 1;
andrewm@5 126 break;
andrewm@5 127 case 'v':
andrewm@5 128 settings->verbose = 1;
andrewm@5 129 break;
andrewm@5 130 case 'm':
giuliomoro@19 131 settings->useAnalog = atoi(optarg);
andrewm@5 132 break;
giuliomoro@16 133 case 'g':
giuliomoro@19 134 settings->useDigital = atoi(optarg);
giuliomoro@19 135 settings->numDigitalChannels = 0;
giuliomoro@16 136 break;
andrewm@12 137 case 'C':
giuliomoro@19 138 settings->numAnalogChannels = atoi(optarg);
giuliomoro@19 139 if(settings->numAnalogChannels >= 8)
giuliomoro@19 140 settings->numAnalogChannels = 8;
giuliomoro@19 141 else if(settings->numAnalogChannels >= 4)
giuliomoro@19 142 settings->numAnalogChannels = 4;
andrewm@12 143 else
giuliomoro@19 144 settings->numAnalogChannels = 2;
andrewm@12 145 break;
giuliomoro@16 146 case 'G':
giuliomoro@19 147 settings->numDigitalChannels = atoi(optarg);
giuliomoro@19 148 if(settings->numDigitalChannels >= 16)
giuliomoro@19 149 settings->numDigitalChannels = 16;
giuliomoro@19 150 else if (settings->numDigitalChannels < 1){
giuliomoro@19 151 settings->numDigitalChannels = 0;
giuliomoro@19 152 settings->useDigital = 0; //TODO: this actually works only if -G 0 is specified after -g 1.
giuliomoro@19 153 //No worries, though: disabling numDigital will only prevent the pins from being exported.
giuliomoro@16 154 }
giuliomoro@16 155 break;
andrewm@5 156 case 'M':
andrewm@5 157 settings->beginMuted = atoi(optarg);
andrewm@5 158 break;
andrewm@5 159 case 'D':
andrewm@5 160 settings->dacLevel = atof(optarg);
andrewm@5 161 break;
andrewm@5 162 case 'A':
andrewm@5 163 settings->adcLevel = atof(optarg);
andrewm@5 164 break;
andrewm@5 165 case 'H':
andrewm@5 166 settings->headphoneLevel = atof(optarg);
andrewm@5 167 break;
giuliomoro@16 168 case 'P':
giuliomoro@16 169 if(strlen(optarg)<MAX_PRU_FILENAME_LENGTH)
giuliomoro@16 170 strcpy(settings->pruFilename, optarg);
giuliomoro@16 171 else
giuliomoro@16 172 std::cerr << "Warning: filename for the PRU code is too long (>" << MAX_PRU_FILENAME_LENGTH << " characters). Using embedded PRU code instead\n";
giuliomoro@16 173 break;
andrewm@5 174 case '?':
andrewm@5 175 default:
andrewm@5 176 return c;
andrewm@5 177 }
andrewm@5 178 }
andrewm@5 179 }
andrewm@5 180
andrewm@5 181 // This function prints standard usage information for default arguments
andrewm@5 182 // Call from within your own usage function
andrewm@5 183 void BeagleRT_usage()
andrewm@5 184 {
giuliomoro@19 185 std::cerr << " --period [-p] period: Set the hardware period (buffer) size in analog samples\n";
giuliomoro@16 186 std::cerr << " --dac-level [-D] dBs: Set the DAC output level (0dB max; -63.5dB min)\n";
giuliomoro@16 187 std::cerr << " --adc-level [-A] dBs: Set the ADC input level (0dB max; -12dB min)\n";
giuliomoro@16 188 std::cerr << " --hp-level [-H] dBs: Set the headphone output level (0dB max; -63.5dB min)\n";
giuliomoro@16 189 std::cerr << " --mute-speaker [-M] val: Set whether to mute the speaker initially (default: no)\n";
giuliomoro@19 190 std::cerr << " --use-analog [-m] val: Set whether to use ADC/DAC analog (default: yes)\n";
giuliomoro@19 191 std::cerr << " --use-gpio-analog [-g] val: Set whether to use GPIO analog (default: yes)\n";
giuliomoro@19 192 std::cerr << " --analog-channels [-C] val: Set the number of ADC/DAC channels (default: 8)\n";
giuliomoro@19 193 std::cerr << " --analog-gpio-channels [-G] val: Set the number of GPIO channels (default: 16)\n";
giuliomoro@16 194 std::cerr << " --pru-file [-P] val: Set an optional external file to use for the PRU binary code\n";
giuliomoro@16 195 std::cerr << " --verbose [-v]: Enable verbose logging information\n";
andrewm@5 196 }
giuliomoro@16 197