Browse Source

Merge pull request #8 from robsoles/master

Add AVC control to control_sgtl5000.* and example
dds
Paul Stoffregen 10 years ago
parent
commit
7e0ccb30d8
7 changed files with 134 additions and 7 deletions
  1. +51
    -0
      control_sgtl5000.cpp
  2. +5
    -3
      control_sgtl5000.h
  3. +4
    -1
      examples/CalcBiquadToneControl/CalcBiquadToneControl.ino
  4. +3
    -1
      examples/SGTL5000_Specific/CalcBiquadToneControlDAP/CalcBiquadToneControlDAP.ino
  5. +4
    -1
      examples/SGTL5000_Specific/balanceDAC/balanceDAC.ino
  6. +4
    -1
      examples/SGTL5000_Specific/balanceHP/balanceHP.ino
  7. +63
    -0
      examples/SGTL5000_Specific/dap_avc_agc/dap_avc_agc.ino

+ 51
- 0
control_sgtl5000.cpp View File

unsigned short m=(0xFC-calcVol(right,0xC0))<<8|(0xFC-calcVol(left,0xC0)); unsigned short m=(0xFC-calcVol(right,0xC0))<<8|(0xFC-calcVol(left,0xC0));
return modify(CHIP_DAC_VOL,m,65535); return modify(CHIP_DAC_VOL,m,65535);
} }

// DAP_CONTROL // DAP_CONTROL
unsigned short AudioControlSGTL5000::dap_mix_enable(uint8_t n) unsigned short AudioControlSGTL5000::dap_mix_enable(uint8_t n)
{ {
modify(DAP_FILTER_COEF_ACCESS,(uint16_t)filterNum,15); modify(DAP_FILTER_COEF_ACCESS,(uint16_t)filterNum,15);
} }


/* Valid values for dap_avc parameters

maxGain; Maximum gain that can be applied
0 - 0 dB
1 - 6.0 dB
2 - 12 dB
lbiResponse; Integrator Response
0 - 0 mS
1 - 25 mS
2 - 50 mS
3 - 100 mS
hardLimit
0 - Hard limit disabled. AVC Compressor/Expander enabled.
1 - Hard limit enabled. The signal is limited to the programmed threshold (signal saturates at the threshold)
threshold
floating point in range 0 to -96 dB
attack
floating point figure is dB/s rate at which gain is increased
decay
floating point figure is dB/s rate at which gain is reduced
*/
unsigned short AudioControlSGTL5000::dap_avc(uint8_t maxGain, uint8_t lbiResponse, uint8_t hardLimit, float threshold, float attack, float decay)
{
if(maxGain>2) maxGain=2;
lbiResponse&=3;
hardLimit&=1;
uint8_t thresh=(pow(10,threshold/20)*0.636)*pow(2,15);
uint8_t att=(1-pow(10,-(attack/(20*44100))))*pow(2,19);
uint8_t dec=(1-pow(10,-(decay/(20*44100))))*pow(2,23);
write(DAP_AVC_THRESHOLD,thresh);
write(DAP_AVC_ATTACK,att);
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::dap_avc_enable(uint8_t n)
{
n&=1;
return modify(DAP_AVC_CTRL,n,1);
}
unsigned short AudioControlSGTL5000::dap_avc_enable(void)
{
return modify(DAP_AVC_CTRL,1,1);
}

unsigned char AudioControlSGTL5000::calcVol(float n, unsigned char range) unsigned char AudioControlSGTL5000::calcVol(float n, unsigned char range)
{ {
n=(n*(((float)range)/100))+0.499; n=(n*(((float)range)/100))+0.499;
return (unsigned char)n; return (unsigned char)n;
} }



// if(SGTL5000_PEQ) quantization_unit=524288; if(AudioFilterBiquad) quantization_unit=2147483648; // if(SGTL5000_PEQ) quantization_unit=524288; if(AudioFilterBiquad) quantization_unit=2147483648;
void calcBiquad(uint8_t filtertype, float fC, float dB_Gain, float Q, uint32_t quantization_unit, uint32_t fS, int *coef) void calcBiquad(uint8_t filtertype, float fC, float dB_Gain, float Q, uint32_t quantization_unit, uint32_t fS, int *coef)
{ {

+ 5
- 3
control_sgtl5000.h View File

void dap_audio_eq_geq(float bass, float mid_bass, float midrange, float mid_treble, float treble); void dap_audio_eq_geq(float bass, float mid_bass, float midrange, float mid_treble, float treble);
void dap_audio_eq_tone(float bass, float treble); void dap_audio_eq_tone(float bass, float treble);
void load_peq(uint8_t filterNum, int *filterParameters); void load_peq(uint8_t filterNum, int *filterParameters);
protected:
unsigned short dap_avc(uint8_t maxGain, uint8_t lbiResponse, uint8_t hardLimit, float threshold, float attack, float decay);
unsigned short dap_avc_enable(uint8_t n);
unsigned short dap_avc_enable(void);

protected:
bool muted; bool muted;
bool volumeInteger(unsigned int n); // range: 0x00 to 0x80 bool volumeInteger(unsigned int n); // range: 0x00 to 0x80
uint16_t ana_ctrl; uint16_t ana_ctrl;

+ 4
- 1
examples/CalcBiquadToneControl/CalcBiquadToneControl.ino View File

// Tone example using AudioFilterBiquad object and calcBiquad filter calculator routine.
/* Tone example using AudioFilterBiquad object and calcBiquad filter calculator routine.

This example code is in the public domain
*/


#include <Audio.h> #include <Audio.h>
#include <Wire.h> #include <Wire.h>

+ 3
- 1
examples/SGTL5000_Specific/CalcBiquadToneControlDAP/CalcBiquadToneControlDAP.ino View File

// Tone example using SGTL5000 DAP PEQ filters and calcBiquad filter calculator routine.
/* Tone example using SGTL5000 DAP PEQ filters and calcBiquad filter calculator routine.


This example code is in the public domain
*/
#include <Audio.h> #include <Audio.h>
#include <Wire.h> #include <Wire.h>
#include <SD.h> #include <SD.h>

+ 4
- 1
examples/SGTL5000_Specific/balanceDAC/balanceDAC.ino View File

// DAC balance example: Will influence both HP & LO outputs.
/* DAC balance example: Will influence both HP & LO outputs.

This example code is in the public domain
*/


#include <Audio.h> #include <Audio.h>
#include <Wire.h> #include <Wire.h>

+ 4
- 1
examples/SGTL5000_Specific/balanceHP/balanceHP.ino View File

// HP balance example: Will influence only HP output.
/* HP balance example: Will influence only HP output.

This example code is in the public domain
*/


#include <Audio.h> #include <Audio.h>
#include <Wire.h> #include <Wire.h>

+ 63
- 0
examples/SGTL5000_Specific/dap_avc_agc/dap_avc_agc.ino View File

/* DAP AVC example; AVC is SGTL5000 equiv of AGC

This example code is in the public domain
*/

#include <Audio.h>
#include <Wire.h>
#include <SD.h>


const int myInput = AUDIO_INPUT_LINEIN;
// const int myInput = AUDIO_INPUT_MIC;

// Create the Audio components. These should be created in the
// order data flows, inputs/sources -> processing -> outputs
//

AudioInputI2S audioInput; // audio shield: mic or line-in
AudioOutputI2S audioOutput; // audio shield: headphones & line-out

// Create Audio connections between the components
//
AudioConnection c1(audioInput, 0, audioOutput, 0); // left passing through
AudioConnection c2(audioInput, 1, audioOutput, 1); // right passing through

// Create an object to control the audio shield.
//
AudioControlSGTL5000 audioShield;

void setup() {
// Audio connections require memory to work. For more
// detailed information, see the MemoryAndCpuUsage example
AudioMemory(4);
// Enable the audio shield and set the output volume.
audioShield.enable();
audioShield.inputSelect(myInput);
audioShield.volume(75);
audioShield.unmuteLineout();
// have to enable DAP to use AVC
audioShield.dap_enable();
// here are some settings for AVC that have a fairly obvious effect
audioShield.dap_avc(2,1,0,-5,0.5,0.5); // see comments starting line #699 of control_sgtl5000.cpp in ./libraries/audio/
// AVC has its own enable/disable bit
audioShield.dap_avc_enable(); // you can use audioShield.dap_avc_enable(0); to turn off AVC
}

elapsedMillis chgMsec=0;
float lastVol=1024;

void loop() {
// every 10 ms, check for adjustment the balance & vol
if (chgMsec > 10) { // more regular updates for actual changes seems better.
float vol1=analogRead(15)/10.23;
vol1=(int)vol1;
if(lastVol!=vol1)
{
audioShield.volume(vol1);
lastVol=vol1;
}
chgMsec = 0;
}
}


Loading…
Cancel
Save