Bläddra i källkod

Simplify & document SGTL5000 control

dds
PaulStoffregen 10 år sedan
förälder
incheckning
5da4cfd94b
6 ändrade filer med 189 tillägg och 124 borttagningar
  1. +1
    -1
      analyze_fft256.h
  2. +54
    -48
      control_sgtl5000.cpp
  3. +11
    -14
      control_sgtl5000.h
  4. +11
    -4
      examples/Analysis/FFT/FFT.ino
  5. +3
    -0
      gui/index.html
  6. +109
    -57
      gui/list.html

+ 1
- 1
analyze_fft256.h Visa fil

@@ -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) {

+ 54
- 48
control_sgtl5000.cpp Visa fil

@@ -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...

+ 11
- 14
control_sgtl5000.h Visa fil

@@ -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:

+ 11
- 4
examples/Analysis/FFT/FFT.ino Visa fil

@@ -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();
}

+ 3
- 0
gui/index.html Visa fil

@@ -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}

+ 109
- 57
gui/list.html Visa fil

@@ -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 &amp; 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 &amp; functions!
</p>
</script>
<script type="text/x-red" data-template-name="AudioControlSGTL5000">

Laddar…
Avbryt
Spara