Mercurial > hg > beaglert
comparison core/RTAudio.cpp @ 12:a6beeba3a648
Initial support for higher matrix sample rates by reducing the number of channels. Input not tested yet, and not all examples updated to new format.
| author | andrewm |
|---|---|
| date | Thu, 22 Jan 2015 19:00:22 +0000 |
| parents | 09f03ac40fcc |
| children | 6adb088196a7 |
comparison
equal
deleted
inserted
replaced
| 11:517715b23df0 | 12:a6beeba3a648 |
|---|---|
| 65 // initAudio() prepares the infrastructure for running PRU-based real-time | 65 // initAudio() prepares the infrastructure for running PRU-based real-time |
| 66 // audio, but does not actually start the calculations. | 66 // audio, but does not actually start the calculations. |
| 67 // periodSize indicates the number of _sensor_ frames per period: the audio period size | 67 // periodSize indicates the number of _sensor_ frames per period: the audio period size |
| 68 // is twice this value. In total, the audio latency in frames will be 4*periodSize, | 68 // is twice this value. In total, the audio latency in frames will be 4*periodSize, |
| 69 // plus any latency inherent in the ADCs and DACs themselves. | 69 // plus any latency inherent in the ADCs and DACs themselves. |
| 70 // useMatrix indicates whether to use the ADC and DAC or just the audio codec. | 70 // useMatrix indicates whether to enable the ADC and DAC or just use the audio codec. |
| 71 // numMatrixChannels indicates how many ADC and DAC channels to use. | |
| 71 // userData is an opaque pointer which will be passed through to the initialise_render() | 72 // userData is an opaque pointer which will be passed through to the initialise_render() |
| 72 // function for application-specific use | 73 // function for application-specific use |
| 73 // | 74 // |
| 74 // Returns 0 on success. | 75 // Returns 0 on success. |
| 75 | 76 |
| 112 cout << "Couldn't set value on amplifier mute pin\n"; | 113 cout << "Couldn't set value on amplifier mute pin\n"; |
| 113 return -1; | 114 return -1; |
| 114 } | 115 } |
| 115 } | 116 } |
| 116 | 117 |
| 118 // Limit the matrix channels to sane values | |
| 119 if(settings->numMatrixChannels >= 8) | |
| 120 settings->numMatrixChannels = 8; | |
| 121 else if(settings->numMatrixChannels >= 4) | |
| 122 settings->numMatrixChannels = 4; | |
| 123 else | |
| 124 settings->numMatrixChannels = 2; | |
| 125 | |
| 126 // Sanity check the combination of channels and period size | |
| 127 if(settings->numMatrixChannels <= 4 && settings->periodSize < 2) { | |
| 128 cout << "Error: " << settings->numMatrixChannels << " channels and period size of " << settings->periodSize << " not supported.\n"; | |
| 129 return 1; | |
| 130 } | |
| 131 if(settings->numMatrixChannels <= 2 && settings->periodSize < 4) { | |
| 132 cout << "Error: " << settings->numMatrixChannels << " channels and period size of " << settings->periodSize << " not supported.\n"; | |
| 133 return 1; | |
| 134 } | |
| 135 | |
| 117 // Use PRU for audio | 136 // Use PRU for audio |
| 118 gPRU = new PRU(); | 137 gPRU = new PRU(); |
| 119 gAudioCodec = new I2c_Codec(); | 138 gAudioCodec = new I2c_Codec(); |
| 120 | 139 |
| 121 if(gPRU->prepareGPIO(settings->useMatrix, 1, 1)) { | 140 if(gPRU->prepareGPIO(settings->useMatrix, 1, 1)) { |
| 122 cout << "Error: unable to prepare GPIO for PRU audio\n"; | 141 cout << "Error: unable to prepare GPIO for PRU audio\n"; |
| 123 return 1; | 142 return 1; |
| 124 } | 143 } |
| 125 if(gPRU->initialise(0, settings->periodSize, true)) { | 144 if(gPRU->initialise(0, settings->periodSize, settings->numMatrixChannels, true)) { |
| 126 cout << "Error: unable to initialise PRU\n"; | 145 cout << "Error: unable to initialise PRU\n"; |
| 127 return 1; | 146 return 1; |
| 128 } | 147 } |
| 129 if(gAudioCodec->initI2C_RW(2, settings->codecI2CAddress, -1)) { | 148 if(gAudioCodec->initI2C_RW(2, settings->codecI2CAddress, -1)) { |
| 130 cout << "Unable to open codec I2C\n"; | 149 cout << "Unable to open codec I2C\n"; |
| 138 // Set default volume levels | 157 // Set default volume levels |
| 139 BeagleRT_setDACLevel(settings->dacLevel); | 158 BeagleRT_setDACLevel(settings->dacLevel); |
| 140 BeagleRT_setADCLevel(settings->adcLevel); | 159 BeagleRT_setADCLevel(settings->adcLevel); |
| 141 BeagleRT_setHeadphoneLevel(settings->headphoneLevel); | 160 BeagleRT_setHeadphoneLevel(settings->headphoneLevel); |
| 142 | 161 |
| 143 if(!initialise_render(2, settings->useMatrix ? settings->periodSize : 0, settings->periodSize * 2, 22050.0, 44100.0, userData)) { | 162 // Initialise the rendering environment: pass the number of audio and matrix |
| 163 // channels, the period size for matrix and audio, and the sample rates | |
| 164 | |
| 165 int audioPeriodSize = settings->periodSize * 2; | |
| 166 float audioSampleRate = 44100.0; | |
| 167 float matrixSampleRate = 22050.0; | |
| 168 if(settings->useMatrix) { | |
| 169 audioPeriodSize = settings->periodSize * settings->numMatrixChannels / 4; | |
| 170 matrixSampleRate = audioSampleRate * 4.0 / (float)settings->numMatrixChannels; | |
| 171 } | |
| 172 | |
| 173 if(!initialise_render(settings->useMatrix ? settings->numMatrixChannels : 0, /* matrix channels */ | |
| 174 2, /* audio channels */ | |
| 175 settings->useMatrix ? settings->periodSize : 0, /* matrix period size */ | |
| 176 audioPeriodSize, | |
| 177 matrixSampleRate, audioSampleRate, | |
| 178 userData)) { | |
| 144 cout << "Couldn't initialise audio rendering\n"; | 179 cout << "Couldn't initialise audio rendering\n"; |
| 145 return 1; | 180 return 1; |
| 146 } | 181 } |
| 147 | 182 |
| 148 return 0; | 183 return 0; |
