@@ -79,7 +79,7 @@ public: | |||
return (float)sum * (1.0 / 16384.0); | |||
} | |||
void averageTogether(uint8_t n) { | |||
if (n == 0) n == 1; | |||
if (n == 0) n = 1; | |||
naverage = n; | |||
} | |||
void windowFunction(const int16_t *w) { |
@@ -565,16 +565,6 @@ unsigned int AudioControlSGTL5000::modify(unsigned int reg, unsigned int val, un | |||
return val1; | |||
} | |||
unsigned short AudioControlSGTL5000::route(uint8_t i2s_out, uint8_t dac, uint8_t dap, uint8_t dap_mix) | |||
{ | |||
i2s_out&=3; | |||
dac&=3; | |||
dap&=3; | |||
dap_mix&=3; | |||
if((i2s_out==SGTL_AUDIO_PROCESSOR)||(dac==SGTL_AUDIO_PROCESSOR)) modify(DAP_CONTROL,1,1); // enable DAP | |||
return modify(CHIP_SSS_CTRL,(dap_mix<<8)|(dap<<6)|(dac<<4)|i2s_out,(3<<8)|(3<<6)|(3<<4)|3); | |||
} | |||
bool AudioControlSGTL5000::volumeInteger(unsigned int n) | |||
{ | |||
if (n == 0) { | |||
@@ -688,47 +678,58 @@ unsigned short AudioControlSGTL5000::lineOutLevel(uint8_t left, uint8_t right) | |||
unsigned short AudioControlSGTL5000::dacVolume(float n) // set both directly | |||
{ | |||
if(read(CHIP_ADCDAC_CTRL)&(3<<2)!=((n>0 ? 0:3)<<2)) modify(CHIP_ADCDAC_CTRL,(n>0 ? 0:3)<<2,3<<2); | |||
if ((read(CHIP_ADCDAC_CTRL)&(3<<2)) != ((n>0 ? 0:3)<<2)) { | |||
modify(CHIP_ADCDAC_CTRL,(n>0 ? 0:3)<<2,3<<2); | |||
} | |||
unsigned char m=calcVol(n,0xC0); | |||
return modify(CHIP_DAC_VOL,((0xFC-m)<<8)|(0xFC-m),65535); | |||
} | |||
unsigned short AudioControlSGTL5000::dacVolume(float left, float right) | |||
{ | |||
unsigned short adcdac=((right>0 ? 0:2)|(left>0 ? 0:1))<<2; | |||
if(read(CHIP_ADCDAC_CTRL)&(3<<2)!=adcdac) modify(CHIP_ADCDAC_CTRL,adcdac,1<<2); | |||
if ((read(CHIP_ADCDAC_CTRL)&(3<<2)) != adcdac) { | |||
modify(CHIP_ADCDAC_CTRL,adcdac,1<<2); | |||
} | |||
unsigned short m=(0xFC-calcVol(right,0xC0))<<8|(0xFC-calcVol(left,0xC0)); | |||
return modify(CHIP_DAC_VOL,m,65535); | |||
} | |||
unsigned short AudioControlSGTL5000::adcHighPassFilterControl(uint8_t bypass, uint8_t freeze) | |||
unsigned short AudioControlSGTL5000::adcHighPassFilterEnable(void) | |||
{ | |||
return modify(CHIP_ADCDAC_CTRL, (freeze&1)<<1|bypass&1,3); | |||
return modify(CHIP_ADCDAC_CTRL, 0, 3); | |||
} | |||
unsigned short AudioControlSGTL5000::adcHighPassFilterControl(uint8_t bypass) | |||
unsigned short AudioControlSGTL5000::adcHighPassFilterFreeze(void) | |||
{ | |||
return modify(CHIP_ADCDAC_CTRL, bypass&1,1); | |||
return modify(CHIP_ADCDAC_CTRL, 2, 3); | |||
} | |||
unsigned short AudioControlSGTL5000::adcHighPassFilterDisable(void) | |||
{ | |||
return modify(CHIP_ADCDAC_CTRL, 1, 3); | |||
} | |||
// DAP_CONTROL | |||
unsigned short AudioControlSGTL5000::audioMixerEnable(uint8_t n) | |||
unsigned short AudioControlSGTL5000::audioPreProcessorEnable(void) | |||
{ | |||
return modify(DAP_CONTROL,(n&1)<<4,1<<4); | |||
// audio processor used to pre-process analog input before Teensy | |||
return write(DAP_CONTROL, 1) && write(CHIP_SSS_CTRL, 0x0013); | |||
} | |||
unsigned short AudioControlSGTL5000::audioProcessorEnable(uint8_t n) | |||
unsigned short AudioControlSGTL5000::audioPostProcessorEnable(void) | |||
{ | |||
if(n) n=1; | |||
unsigned char i2s_sel=3*n; // ADC if n==0 else DAP | |||
modify(DAP_CONTROL,n,1); | |||
return route(i2s_sel,SGTL_I2S_TEENSY,SGTL_ADC); | |||
// audio processor used to post-process Teensy output before headphones/lineout | |||
return write(DAP_CONTROL, 1) && write(CHIP_SSS_CTRL, 0x0070); | |||
} | |||
unsigned short AudioControlSGTL5000::audioProcessorEnable(void) | |||
unsigned short AudioControlSGTL5000::audioProcessorDisable(void) | |||
{ | |||
return audioProcessorEnable(1); | |||
return write(CHIP_SSS_CTRL, 0x0010) && write(DAP_CONTROL, 0); | |||
} | |||
// DAP_PEQ | |||
unsigned short AudioControlSGTL5000::eqFilterCount(uint8_t n) // valid to n&7, 0 thru 7 filters enabled. | |||
{ | |||
@@ -809,7 +810,7 @@ void AudioControlSGTL5000::eqFilter(uint8_t filterNum, int *filterParameters) | |||
*/ | |||
unsigned short AudioControlSGTL5000::autoVolumeControl(uint8_t maxGain, uint8_t lbiResponse, uint8_t hardLimit, float threshold, float attack, float decay) | |||
{ | |||
if(semi_automated&&(!read(DAP_CONTROL)&1)) audioProcessorEnable(1); | |||
//if(semi_automated&&(!read(DAP_CONTROL)&1)) audioProcessorEnable(); | |||
if(maxGain>2) maxGain=2; | |||
lbiResponse&=3; | |||
hardLimit&=1; | |||
@@ -821,32 +822,31 @@ unsigned short AudioControlSGTL5000::autoVolumeControl(uint8_t maxGain, uint8_t | |||
write(DAP_AVC_DECAY,dec); | |||
return modify(DAP_AVC_CTRL,maxGain<<12|lbiResponse<<8|hardLimit<<5,3<<12|3<<8|1<<5); | |||
} | |||
unsigned short AudioControlSGTL5000::autoVolumeEnable(uint8_t n) | |||
unsigned short AudioControlSGTL5000::autoVolumeEnable(void) | |||
{ | |||
n&=1; | |||
return modify(DAP_AVC_CTRL,n,1); | |||
return modify(DAP_AVC_CTRL, 1, 1); | |||
} | |||
unsigned short AudioControlSGTL5000::autoVolumeEnable(void) | |||
unsigned short AudioControlSGTL5000::autoVolumeDisable(void) | |||
{ | |||
return modify(DAP_AVC_CTRL,1,1); | |||
return modify(DAP_AVC_CTRL, 0, 1); | |||
} | |||
unsigned short AudioControlSGTL5000::enhanceBass(float lr_lev, float bass_lev) | |||
{ | |||
return modify(DAP_BASS_ENHANCE_CTRL,(0x3F-calcVol(lr_lev,0x3F))<<8|0x7F-calcVol(bass_lev,0x7F),0x3F<<8|0x7F); | |||
return modify(DAP_BASS_ENHANCE_CTRL,((0x3F-calcVol(lr_lev,0x3F))<<8) | (0x7F-calcVol(bass_lev,0x7F)), (0x3F<<8) | 0x7F); | |||
} | |||
unsigned short AudioControlSGTL5000::enhanceBass(float lr_lev, float bass_lev, uint8_t hpf_bypass, uint8_t cutoff) | |||
{ | |||
modify(DAP_BASS_ENHANCE,(hpf_bypass&1)<<8|(cutoff&7)<<4,1<<8|7<<4); | |||
return enhanceBass(lr_lev,bass_lev); | |||
} | |||
unsigned short AudioControlSGTL5000::enhanceBassEnable(uint8_t n) | |||
unsigned short AudioControlSGTL5000::enhanceBassEnable(void) | |||
{ | |||
return modify(DAP_BASS_ENHANCE,n&1,1); | |||
return modify(DAP_BASS_ENHANCE, 1, 1); | |||
} | |||
unsigned short AudioControlSGTL5000::enhanceBassEnable(void) | |||
unsigned short AudioControlSGTL5000::enhanceBassDisable(void) | |||
{ | |||
return enhanceBassEnable(1); | |||
return modify(DAP_BASS_ENHANCE, 0, 1); | |||
} | |||
unsigned short AudioControlSGTL5000::surroundSound(uint8_t width) | |||
{ | |||
@@ -854,16 +854,15 @@ unsigned short AudioControlSGTL5000::surroundSound(uint8_t width) | |||
} | |||
unsigned short AudioControlSGTL5000::surroundSound(uint8_t width, uint8_t select) | |||
{ | |||
return modify(DAP_SGTL_SURROUND,(width&7)<<4|select&3,7<<4|3); | |||
return modify(DAP_SGTL_SURROUND,((width&7)<<4)|(select&3), (7<<4)|3); | |||
} | |||
unsigned short AudioControlSGTL5000::surroundSoundEnable(uint8_t n) | |||
unsigned short AudioControlSGTL5000::surroundSoundEnable(void) | |||
{ | |||
if(n) n=3; | |||
return modify(DAP_SGTL_SURROUND,n,3); | |||
return modify(DAP_SGTL_SURROUND, 3, 3); | |||
} | |||
unsigned short AudioControlSGTL5000::surroundSoundEnable(void) | |||
unsigned short AudioControlSGTL5000::surroundSoundDisable(void) | |||
{ | |||
surroundSoundEnable(1); | |||
return modify(DAP_SGTL_SURROUND, 0, 3); | |||
} | |||
unsigned char AudioControlSGTL5000::calcVol(float n, unsigned char range) | |||
@@ -886,14 +885,14 @@ unsigned short AudioControlSGTL5000::dap_audio_eq_band(uint8_t bandNum, float n) | |||
void AudioControlSGTL5000::automate(uint8_t dap, uint8_t eq) | |||
{ | |||
if((dap!=0)&&(!read(DAP_CONTROL)&1)) audioProcessorEnable(1); | |||
if(read(DAP_AUDIO_EQ)&3!=eq) eqSelect(eq); | |||
//if((dap!=0)&&(!(read(DAP_CONTROL)&1))) audioProcessorEnable(); | |||
if((read(DAP_AUDIO_EQ)&3) != eq) eqSelect(eq); | |||
} | |||
void AudioControlSGTL5000::automate(uint8_t dap, uint8_t eq, uint8_t filterCount) | |||
{ | |||
automate(dap,eq); | |||
if(filterCount>read(DAP_PEQ)&7) eqFilterCount(filterCount); | |||
if (filterCount > (read(DAP_PEQ)&7)) eqFilterCount(filterCount); | |||
} | |||
@@ -909,12 +908,12 @@ void calcBiquad(uint8_t filtertype, float fC, float dB_Gain, float Q, uint32_t q | |||
float A; | |||
if(filtertype<FILTER_PARAEQ) A=pow(10,dB_Gain/20); else A=pow(10,dB_Gain/40); | |||
float W0 = 2*3.14159265358979323846*fC/fS; | |||
float cosw=cos(W0); | |||
float sinw=sin(W0); | |||
float cosw=cosf(W0); | |||
float sinw=sinf(W0); | |||
//float alpha = sinw*sinh((log(2)/2)*BW*W0/sinw); | |||
//float beta = sqrt(2*A); | |||
float alpha = sinw / (2 * Q); | |||
float beta = sqrt(A)/Q; | |||
float beta = sqrtf(A)/Q; | |||
float b0,b1,b2,a0,a1,a2; | |||
switch(filtertype) { | |||
@@ -973,6 +972,13 @@ void calcBiquad(uint8_t filtertype, float fC, float dB_Gain, float Q, uint32_t q | |||
a0 = (A+1.0F) - ((A-1.0F)*cosw) + (beta*sinw); | |||
a1 = -2.0F * ((A-1.0F) - ((A+1.0F)*cosw)); | |||
a2 = -((A+1.0F) - ((A-1.0F)*cosw) - (beta*sinw)); | |||
default: | |||
b0 = 0.5; | |||
b1 = 0.0; | |||
b2 = 0.0; | |||
a0 = 1.0; | |||
a1 = 0.0; | |||
a2 = 0.0; | |||
} | |||
a0=(a0*2)/(float)quantization_unit; // once here instead of five times there... |
@@ -29,10 +29,6 @@ | |||
#include "AudioControl.h" | |||
#define SGTL_ADC 0 | |||
#define SGTL_I2S_TEENSY 1 | |||
#define SGTL_AUDIO_PROCESSOR 3 | |||
class AudioControlSGTL5000 : public AudioControl | |||
{ | |||
public: | |||
@@ -56,8 +52,6 @@ public: | |||
return false; | |||
} | |||
} | |||
unsigned short route(uint8_t i2s_out, uint8_t dac, uint8_t dap, uint8_t dap_mix); | |||
unsigned short route(uint8_t i2s_out, uint8_t dac, uint8_t dap) { return route(i2s_out,dac,dap,0); } | |||
bool volume(float left, float right); | |||
bool micGain(unsigned int dB); | |||
bool lineInLevel(uint8_t n) { return lineInLevel(n, n); } | |||
@@ -66,11 +60,14 @@ public: | |||
unsigned short lineOutLevel(uint8_t left, uint8_t right); | |||
unsigned short dacVolume(float n); | |||
unsigned short dacVolume(float left, float right); | |||
unsigned short adcHighPassFilterControl(uint8_t bypass, uint8_t freeze); | |||
unsigned short adcHighPassFilterControl(uint8_t bypass); | |||
unsigned short audioMixerEnable(uint8_t n); | |||
unsigned short audioProcessorEnable(uint8_t n); | |||
unsigned short audioProcessorEnable(void); | |||
unsigned short adcHighPassFilterEnable(void); | |||
unsigned short adcHighPassFilterFreeze(void); | |||
unsigned short adcHighPassFilterDisable(void); | |||
//unsigned short adcHighPassFilterControl(uint8_t bypass, uint8_t freeze); | |||
//unsigned short adcHighPassFilterControl(uint8_t bypass); | |||
unsigned short audioPreProcessorEnable(void); | |||
unsigned short audioPostProcessorEnable(void); | |||
unsigned short audioProcessorDisable(void); | |||
unsigned short eqFilterCount(uint8_t n); | |||
unsigned short eqSelect(uint8_t n); | |||
unsigned short eqBand(uint8_t bandNum, float n); | |||
@@ -78,16 +75,16 @@ public: | |||
void eqBands(float bass, float treble); | |||
void eqFilter(uint8_t filterNum, int *filterParameters); | |||
unsigned short autoVolumeControl(uint8_t maxGain, uint8_t lbiResponse, uint8_t hardLimit, float threshold, float attack, float decay); | |||
unsigned short autoVolumeEnable(uint8_t n); | |||
unsigned short autoVolumeEnable(void); | |||
unsigned short autoVolumeDisable(void); | |||
unsigned short enhanceBass(float lr_lev, float bass_lev); | |||
unsigned short enhanceBass(float lr_lev, float bass_lev, uint8_t hpf_bypass, uint8_t cutoff); | |||
unsigned short enhanceBassEnable(uint8_t n); | |||
unsigned short enhanceBassEnable(void); | |||
unsigned short enhanceBassDisable(void); | |||
unsigned short surroundSound(uint8_t width); | |||
unsigned short surroundSound(uint8_t width, uint8_t select); | |||
unsigned short surroundSoundEnable(uint8_t n); | |||
unsigned short surroundSoundEnable(void); | |||
unsigned short surroundSoundDisable(void); | |||
void killAutomation(void) { semi_automated=false; } | |||
protected: |
@@ -41,14 +41,21 @@ void setup() { | |||
} | |||
void loop() { | |||
float n; | |||
int i; | |||
if (myFFT.available()) { | |||
// each time new FFT data is available | |||
// print it all to the Arduino Serial Monitor | |||
Serial.print("FFT: "); | |||
for (int i=0; i<40; i++) { | |||
Serial.print(myFFT.read(i)); | |||
//Serial.print(myFFT.output[i]); | |||
Serial.print(" "); | |||
for (i=0; i<40; i++) { | |||
n = myFFT.read(i); | |||
if (n >= 0.01) { | |||
Serial.print(n); | |||
Serial.print(" "); | |||
} else { | |||
Serial.print(" - "); | |||
} | |||
} | |||
Serial.println(); | |||
} |
@@ -37,6 +37,9 @@ tr.odd {background-color:#F0F0F0} | |||
tr.even {background-color:#E0E0E0} | |||
p.func {padding-bottom:0; margin:0px} | |||
p.desc {padding-left:2em; margin:0px; padding-top:0.2em; padding-bottom:0.8em; font-size:0.75em} | |||
pre.desc {padding-left:3em; margin:0px; padding-top:0em; padding-bottom:0.8em; font-size:0.75em; | |||
background-color:#FFFFFF; border:0px; line-height:100%; | |||
} | |||
span.indent {padding-left:2em} | |||
span.literal {color: #006699} | |||
span.comment {color: #777755} |
@@ -1793,70 +1793,137 @@ | |||
The input number is in decibels, from 0 to 63. | |||
</p> | |||
<h3>Signal Adjustment</h3> | |||
<h3>Signal Levels</h3> | |||
<p>The SGTL5000 supports flexible signal routing (inside the chip) and | |||
many optional signal conditioning features.</p> | |||
<p>The default signal levels should be used for most applications, | |||
but these functions allow you to customize the analog signals.</p> | |||
<p class=func><span class=keyword>route</span>(i2s, dac, dap);</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=func><span class=keyword>route</span>(i2s, dac, dap, dapmix);</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=func><span class=keyword>muteHeadphone</span>();</p> | |||
<p class=desc>Silence the headphone output. | |||
</p> | |||
<p class=func><span class=keyword>unmuteHeadphone</span>();</p> | |||
<p class=desc>Turn the headphone output on. | |||
</p> | |||
<p class=func><span class=keyword>unmuteLineout</span>();</p> | |||
<p class=desc>Turn the line level outputs on. | |||
</p> | |||
<p class=func><span class=keyword>muteLineout</span>();</p> | |||
<p class=desc>Silence the line level outputs. | |||
</p> | |||
<p class=func><span class=keyword>lineInLevel</span>(both);</p> | |||
<p class=desc>blah blah blah blah | |||
<p class=func><span class=keyword>unmuteLineout</span>();</p> | |||
<p class=desc>Turn the line level outputs on. | |||
</p> | |||
<p class=func><span class=keyword>lineInLevel</span>(both);</p> | |||
<p class=desc style="padding-bottom:0.2em;">Adjust the sensitivity of the line-level inputs. | |||
Fifteen settings are possible: | |||
</p> | |||
<pre class="desc"> | |||
0: 3.12 Volts p-p | |||
1: 2.63 Volts p-p | |||
2: 2.22 Volts p-p | |||
3: 1.87 Volts p-p | |||
4: 1.58 Volts p-p | |||
5: 1.33 Volts p-p (default) | |||
6: 1.11 Volts p-p | |||
7: 0.94 Volts p-p | |||
8: 0.79 Volts p-p | |||
9: 0.67 Volts p-p | |||
10: 0.56 Volts p-p | |||
11: 0.48 Volts p-p | |||
12: 0.40 Volts p-p | |||
13: 0.34 Volts p-p | |||
14: 0.29 Volts p-p | |||
15: 0.24 Volts p-p | |||
</pre> | |||
<p class=func><span class=keyword>lineInLevel</span>(left, right);</p> | |||
<p class=desc>blah blah blah blah | |||
<p class=desc>Adjust the sensitivity of the line-level inputs, with different | |||
settings for left and right. The same 15 settings are available. | |||
</p> | |||
<p class=func><span class=keyword>lineOutLevel</span>(both);</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=desc style="padding-bottom:0.2em;">Adjust the line level outout voltage range. The following | |||
settings are possible: | |||
</p> | |||
<pre class="desc"> | |||
13: 3.16 Volts p-p | |||
14: 2.98 Volts p-p | |||
15: 2.83 Volts p-p | |||
16: 2.67 Volts p-p | |||
17: 2.53 Volts p-p | |||
18: 2.39 Volts p-p | |||
19: 2.26 Volts p-p | |||
20: 2.14 Volts p-p | |||
21: 2.02 Volts p-p | |||
22: 1.91 Volts p-p | |||
23: 1.80 Volts p-p | |||
24: 1.71 Volts p-p | |||
25: 1.62 Volts p-p | |||
26: 1.53 Volts p-p | |||
27: 1.44 Volts p-p | |||
28: 1.37 Volts p-p | |||
29: 1.29 Volts p-p (default) | |||
30: 1.22 Volts p-p | |||
31: 1.16 Volts p-p | |||
</pre> | |||
<p class=func><span class=keyword>lineOutLevel</span>(left, right);</p> | |||
<p class=desc>blah blah blah blah | |||
<p class=desc>Adjust the line level outout voltage range, with separate | |||
settings for left and right. The same settings (13 to 31) are available. | |||
</p> | |||
<p class=func><span class=keyword>dacVolume</span>(both);</p> | |||
<p class=desc>blah blah blah blah | |||
<h3>Signal Conditioning</h3> | |||
<p>Usually these digital signal conditioning features should be left at their | |||
default settings. | |||
</p> | |||
<p class=func><span class=keyword>dacVolume</span>(left, right);</p> | |||
<p class=desc>blah blah blah blah | |||
<p class=func><span class=keyword>adcHighPassFilterFreeze</span>();</p> | |||
<p class=desc>By default, the analog input (either line-level inputs or mic) | |||
is high-pass filtered, to remove any DC component. This function | |||
freezes the filter, so the DC component is still substracted, but | |||
the filter stops tracking any DC or low frequency changes. | |||
</p> | |||
<p class=func><span class=keyword>adcHighPassFilterControl</span>(bypass, freeze);</p> | |||
<p class=desc>blah blah blah blah | |||
<p class=func><span class=keyword>adcHighPassFilterDisable</span>();</p> | |||
<p class=desc>Completely disable the analog input filter. DC and sub-audible | |||
low frequencies are allowed to enter the digital signal. | |||
</p> | |||
<p class=func><span class=keyword>adcHighPassFilterControl</span>(bypass);</p> | |||
<p class=desc>blah blah blah blah | |||
<p class=func><span class=keyword>adcHighPassFilterEnable</span>();</p> | |||
<p class=desc>Turn the DC-blocking filter back on, if disabled, or | |||
allows it to resume tracking DC and low frequency changes, if | |||
previously frozen. | |||
</p> | |||
<p class=func><span class=keyword>audioMixerEnable</span>(n);</p> | |||
<p class=desc>blah blah blah blah | |||
<p class=func><span class=keyword>dacVolume</span>(both);</p> | |||
<p class=desc>Normally output volume should be used with volume(), which | |||
changes the analog gain in the headphone amplifier. This function | |||
controls digital attenuation before conversion to analog, which | |||
reduces resolution, but allows another fine control of output | |||
signal level. The ranges is 0 to 1.0, with the default at 1.0. | |||
</p> | |||
<p class=func><span class=keyword>dacVolume</span>(left, right);</p> | |||
<p class=desc>Adjust the digital output volume separately on left and | |||
right channels. | |||
</p> | |||
<h3>Audio Processor</h3> | |||
<p>An optional digital audio processor, capable of implementing a | |||
<p>The optional digital audio processor is capable of implementing | |||
automatic volume control, a | |||
simple equalizer, filtering, bass enhancement and surround sound | |||
is available. It can process audio input before the SGTL5000 | |||
sends it by I2S to Teensy, or it can process Teensy's I2S output | |||
before converting the digital data to analog signals.</p> | |||
is available. | |||
</p> | |||
<p>These signal processing features are implemented in the SGTL5000 chip, | |||
so they do not consume CPU time on Teensy. | |||
</p> | |||
<p class=func><span class=keyword>audioProcessorEnable</span>(n);</p> | |||
<p class=desc>blah blah blah blah | |||
<p class=func><span class=keyword>audioPreProcessorEnable</span>();</p> | |||
<p class=desc>Enable the audio processor to pre-process the input | |||
(from either line-level inputs or microphone) before it's sent | |||
to Teensy by I2S. | |||
</p> | |||
<p class=func><span class=keyword>audioProcessorEnable</span>();</p> | |||
<p class=desc>blah blah blah blah | |||
<p class=func><span class=keyword>audioPostProcessorEnable</span>();</p> | |||
<p class=desc>Enable the audio processor to post-process Teensy's | |||
I2S output before it's turned into analog signals for the | |||
headphones and/or line level outputs. | |||
</p> | |||
<p class=func><span class=keyword>audioProcessorDisable</span>();</p> | |||
<p class=desc>Disable the audio processor. | |||
</p> | |||
<p class=func><span class=keyword>eqFilterCount</span>(n);</p> | |||
<p class=desc>blah blah blah blah | |||
@@ -1879,10 +1946,10 @@ | |||
<p class=func><span class=keyword>autoVolumeControl</span>(maxGain, response, hardLimit, threshold, attack, decay);</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=func><span class=keyword>autoVolumeEnable</span>(n);</p> | |||
<p class=func><span class=keyword>autoVolumeEnable</span>();</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=func><span class=keyword>autoVolumeEnable</span>();</p> | |||
<p class=func><span class=keyword>autoVolumeDisable</span>();</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=func><span class=keyword>enhanceBass</span>(lr_lev, bass_lev);</p> | |||
@@ -1891,10 +1958,10 @@ | |||
<p class=func><span class=keyword>enhanceBass</span>(lr_lev, bass_lev, hpf_bypass, cutoff);</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=func><span class=keyword>enhanceBassEnable</span>(n);</p> | |||
<p class=func><span class=keyword>enhanceBassEnable</span>();</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=func><span class=keyword>enhanceBassEnable</span>();</p> | |||
<p class=func><span class=keyword>enhanceBassDisable</span>();</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=func><span class=keyword>surroundSound</span>(width);</p> | |||
@@ -1903,29 +1970,14 @@ | |||
<p class=func><span class=keyword>surroundSound</span>(width, select);</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=func><span class=keyword>surroundSoundEnable</span>(n);</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=func><span class=keyword>surroundSoundEnable</span>();</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<p class=func><span class=keyword>killAutomation</span>();</p> | |||
<p class=func><span class=keyword>surroundSoundDisable</span>();</p> | |||
<p class=desc>blah blah blah blah | |||
</p> | |||
<h3>Notes</h3> | |||
<p>TODO: how does the input AGC work | |||
</p> | |||
<p>TODO: document signal routing | |||
</p> | |||
<p>TODO: line level output adjust is weird arbitrary integers. Should this be | |||
made into more sensible numbers, or do we just document the integer-voltage | |||
measurements that correspond to the audio shield's hardware? | |||
</p> | |||
<p>TODO: make some sense out of the terribly complex audio processor features & options! | |||
</p> | |||
<p>TODO: can some of these enable functions be eliminated and have those features | |||
automatically enabled or disabled depending on whether the route() function has | |||
configured signals to/from them? | |||
<p>TODO: document the many audio processor features & functions! | |||
</p> | |||
</script> | |||
<script type="text/x-red" data-template-name="AudioControlSGTL5000"> |