forked from PaulStoffregen/Audio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
control_tlv320aic3206.h
128 lines (105 loc) · 5.21 KB
/
control_tlv320aic3206.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
control_tlv320aic3206
Created: Brendan Flynn (http://www.flexvoltbiosensor.com/) for Tympan, Jan-Feb 2017
Modified: Chip Audette (https://openaudio.blogspot.com) for Tympan 2017-2018
Purpose: Control module for Texas Instruments TLV320AIC3206 compatible with Teensy Audio Library
License: MIT License. Use at your own risk.
Note that the TLV320AIC3206 has a reset that should be connected to microcontroller.
This code defaults to Teensy Pin 21, which was used on Tympan Rev C.
You can set the reset pin in the constructor
Note that this can configure the AIC for 32-bit per sample I2S transfers or 16-bit per sample.
Defaults to 16 bits per sample to allow it to work with default Teensy audio library.
Example Usage for Teensy:
#include <Audio.h> //Teensy Audio Library
int AIC3206_RESET_PIN=21; //What pin is your AIC3206 reset pin connected to?
AudioControlTLV320AIC3206 audioHardware(AIC3206_RESET_PIN);
AudioInputI2S i2s_in; //Digital audio *from* the AIC.
AudioOutputI2S i2s_out; //Digital audio *to* the AIC.
AudioConnection patchCord1(i2s_in, 0, i2s_out, 0); //connect left input to left output
AudioConnection patchCord2(i2s_in, 1, i2s_out, 1); //connect right input to right output
void setup(void)
{
//begin the serial comms (for debugging)
Serial.begin(115200); delay(500);
Serial.println("AudioPassThru: Starting setup()...");
//allocate the dynamic memory for audio processing blocks
AudioMemory(10);
//Enable the TLV32AIC3206 to start the audio flowing!
audioHardware.enable(); // activate AIC
//Choose the desired input
audioHardware.inputSelect(AIC3206_INPUT_IN1); // use Input 1
//Set the desired volume levels
audioHardware.volume_dB(0); // headphone amplifier. -63.6 to +24 dB in 0.5dB steps.
audioHardware.setInputGain_dB(10.0); // set input volume, 0-47.5dB in 0.5dB setps
}
void loop(void)
{
// Nothing to do
}
*/
#ifndef control_tlv320aic3206_h_
#define control_tlv320aic3206_h_
#include "AudioControl.h"
#include <Arduino.h>
//convenience names to use with inputSelect() to set whnch analog inputs to use
#define AIC3206_INPUT_IN1 1 //uses IN1
#define AIC3206_INPUT_IN2 2 //uses IN2 analog inputs
#define AIC3206_INPUT_IN3 3 //uses IN3 analog inputs
#define AIC3206_INPUT_IN3_MICBIAS 4 //uses IN3 analog inputs *and* enables mic bias
//convenience names to use with outputSelect()
#define AIC3206_OUTPUT_HEADPHONE_JACK_OUT 1
#define AIC3206_OUTPUT_LINE_OUT 2
#define AIC3206_OUTPUT_HEADPHONE_AND_LINE_OUT 3
//names to use with setMicBias() to set the amount of bias voltage to use
#define AIC3206_MIC_BIAS_OFF 0
#define AIC3206_MIC_BIAS_1_25 1
#define AIC3206_MIC_BIAS_1_7 2
#define AIC3206_MIC_BIAS_2_5 3
#define AIC3206_MIC_BIAS_VSUPPLY 4
#define AIC3206_DEFAULT_MIC_BIAS AIC3206_MIC_BIAS_2_5
#define AIC3206_BOTH_CHAN 0
#define AIC3206_LEFT_CHAN 1
#define AIC3206_RIGHT_CHAN 2
class AudioControlTLV320AIC3206: public AudioControl
{
public:
//GUI: inputs:0, outputs:0 //this line used for automatic generation of GUI node
AudioControlTLV320AIC3206(void) { debugToSerial = false; };
AudioControlTLV320AIC3206(bool _debugToSerial) { debugToSerial = _debugToSerial; };
AudioControlTLV320AIC3206(int _resetPin) { debugToSerial = false; resetPinAIC = _resetPin; }
AudioControlTLV320AIC3206(int _resetPin, bool _debugToSerial) { resetPinAIC = _resetPin; debugToSerial = _debugToSerial; };
bool enable(void);
bool disable(void);
bool outputSelect(int n); //use AIC3206_OUTPUT_HEADPHONE_JACK_OUT or one of other choices defined earlier
bool volume(float n);
bool volume_dB(float n);
bool inputLevel(float n); //dummy to be compatible with Teensy Audio Library
bool inputSelect(int n); //use AIC3206_INPUT_IN1 or one of other choices defined earlier
bool setInputGain_dB(float n);
bool setMicBias(int n); //use AIC3206_MIC_BIAS_OFF or AIC3206_MIC_BIAS_2_5 or one of other choices defined earlier
bool updateInputBasedOnMicDetect(int setting = AIC3206_INPUT_IN1); //which input to monitor
bool enableMicDetect(bool);
int readMicDetect(void);
bool debugToSerial;
unsigned int aic_readPage(uint8_t page, uint8_t reg);
bool aic_writePage(uint8_t page, uint8_t reg, uint8_t val);
void setHPFonADC(bool enable, float cutoff_Hz, float fs_Hz);
float getHPCutoff_Hz(void) { return HP_cutoff_Hz; }
float getSampleRate_Hz(void) { return sample_rate_Hz; }
void setIIRCoeffOnADC(int chan, uint32_t *coeff); //for chan, use AIC3206_BOTH_CHAN or AIC3206_LEFT_CHAN or AIC3206_RIGHT_CHAN
bool enableAutoMuteDAC(bool, uint8_t);
private:
void aic_reset(void);
void aic_init(void);
void aic_initDAC(void);
void aic_initADC(void);
bool aic_writeAddress(uint16_t address, uint8_t val);
bool aic_goToPage(uint8_t page);
int prevMicDetVal = -1;
int resetPinAIC = 21; //AIC reset pin, Tympan Rev C
float HP_cutoff_Hz = 0.0f;
float sample_rate_Hz = 44100; //only used with HP_cutoff_Hz to design HP filter on ADC, if used
void setIIRCoeffOnADC_Left(uint32_t *coeff);
void setIIRCoeffOnADC_Right(uint32_t *coeff);
};
#endif