Skip to content

Commit 817ad32

Browse files
committed
is_auto_center_read for AnalogAudioStream/ESP32
1 parent 5449cdd commit 817ad32

File tree

7 files changed

+110
-25
lines changed

7 files changed

+110
-25
lines changed

examples/examples-stream/streams-adc-i2s/streams-adc-i2s.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ AudioInfo info(44100, 2, 16);
1313
AnalogAudioStream in;
1414
I2SStream out;
1515
StreamCopy copier(out, in); // copy in to out
16-
ConverterAutoCenter<int16_t> converter;
16+
ConverterAutoCenterT<int16_t> converter;
1717

1818
// Arduino Setup
1919
void setup(void) {

src/AudioAnalog/AnalogAudioArduino.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ class AnalogDriverArduino : public AnalogDriverBase {
5656
return buffer->readArray(values, bytes);
5757
}
5858

59-
int availableForWrite() {
59+
int availableForWrite() override {
6060
if (config.rx_tx_mode == RX_MODE) return 0;
6161
if (buffer == nullptr) return 0;
6262
return config.is_blocking_write ? config.buffer_size : buffer->availableForWrite();
6363
}
6464

65-
size_t write(const uint8_t *data, size_t len) {
65+
size_t write(const uint8_t *data, size_t len) ovrride {
6666
LOGD("write: %d", (int)len);
6767
if (config.rx_tx_mode == RX_MODE) return 0;
6868
// only process full frames

src/AudioAnalog/AnalogAudioBase.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,13 @@ class AnalogConfig : public AudioInfo {
151151

152152
class AnalogDriverBase {
153153
public:
154-
virtual bool begin(AnalogConfig cfg);
155-
virtual void end();
154+
virtual bool begin(AnalogConfig cfg) = 0;
155+
virtual void end() = 0;
156156
// virtual void setMaxSampleRate() {}
157157
virtual size_t write(const uint8_t *src, size_t size_bytes) { return 0;}
158-
virtual size_t readBytes(uint8_t *dest, size_t size_bytes);
159-
virtual int available();
158+
virtual size_t readBytes(uint8_t *dest, size_t size_bytes) = 0;
159+
virtual int available() = 0;
160+
virtual int availableForWrite() { return DEFAULT_BUFFER_SIZE; }
160161
};
161162

162163
} // ns

src/AudioAnalog/AnalogAudioESP32.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ class AnalogDriverESP32 : public AnalogDriverBase {
4848
TRACEI();
4949
cfg.logInfo();
5050

51+
if (adc_config.is_auto_center_read){
52+
LOGI("auto_center")
53+
auto_center.begin(cfg.channels, cfg.bits_per_sample);
54+
}
55+
5156
if (!is_driver_installed){
5257
port_no = (i2s_port_t) cfg.port_no;
5358

@@ -182,6 +187,10 @@ class AnalogDriverESP32 : public AnalogDriverBase {
182187
if (i2s_read(port_no, dest, size_bytes, &result, portMAX_DELAY)!=ESP_OK){
183188
TRACEE();
184189
}
190+
// make sure that the center is at 0
191+
if (adc_config.is_auto_center_read){
192+
auto_center.convert(dest, result);
193+
}
185194
LOGD( "%s - len: %d -> %d", __func__, size_bytes, result);
186195
return result;
187196
}
@@ -192,6 +201,7 @@ class AnalogDriverESP32 : public AnalogDriverBase {
192201

193202
protected:
194203
AnalogConfig adc_config;
204+
ConverterAutoCenter auto_center;
195205
i2s_port_t port_no;
196206
bool active = false;
197207
bool is_driver_installed = false;

src/AudioAnalog/AnalogAudioMBED.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class AnalogDriverMBED : public AnalogDriverBase {
3737
return false;
3838
}
3939
info = cfg;
40+
auto_center.begin(config.channels, config.bits_per.sample);
4041
int n_samples = cfg.buffer_size / (cfg.bits_per_sample / 8);
4142
ring_buffer.resize(n_samples);
4243
switch (info.channels) {
@@ -114,6 +115,12 @@ class AnalogDriverMBED : public AnalogDriverBase {
114115
}
115116
break;
116117
}
118+
119+
// make sure that the center is at 0
120+
if (adc_config.is_auto_center_read){
121+
auto_center.convert(dest, result);
122+
}
123+
117124
return result;
118125
}
119126

@@ -122,6 +129,7 @@ class AnalogDriverMBED : public AnalogDriverBase {
122129
protected:
123130
audio_tools::RingBuffer<Sample> ring_buffer{0};
124131
AnalogConfig info;
132+
ConverterAutoCenter auto_center;
125133
AdvancedDAC dac1{PIN_DAC_1};
126134
AdvancedDAC dac2{PIN_DAC_2};
127135
AdvancedADC adc1{PIN_ANALOG_START};

src/AudioConfig.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,10 @@ typedef WiFiClient WiFiClientSecure;
679679
# define INLINE_VAR static
680680
#endif
681681

682+
#ifndef ANALOG_MAX_SAMPLE_RATE
683+
# define ANALOG_MAX_SAMPLE_RATE 44000
684+
#endif
685+
682686
#pragma GCC diagnostic ignored "-Wunused-variable"
683687
#pragma GCC diagnostic ignored "-Wunused-function"
684688
#pragma GCC diagnostic ignored "-Wvla"

src/AudioTools/BaseConverter.h

Lines changed: 80 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -111,16 +111,17 @@ class ConverterScaler : public BaseConverter {
111111
* @tparam T
112112
*/
113113
template<typename T>
114-
class ConverterAutoCenter : public BaseConverter {
114+
class ConverterAutoCenterT : public BaseConverter {
115115
public:
116-
ConverterAutoCenter(int channels=2){
116+
ConverterAutoCenterT(int channels=2){
117117
this->channels = channels;
118118
}
119119

120120
size_t convert(uint8_t(*src), size_t byte_count) {
121121
int size = byte_count / channels / sizeof(T);
122122
T *sample = (T*) src;
123123
setup((T*)src, size);
124+
// convert data
124125
if (is_setup){
125126
for (size_t j=0; j<size; j++){
126127
for (int i=0;i<channels;i++){
@@ -133,33 +134,94 @@ class ConverterAutoCenter : public BaseConverter {
133134
}
134135

135136
protected:
136-
T offset;
137-
float left;
138-
float right;
137+
T offset = 0;
138+
float left = 0.0;
139+
float right = 0.0;
139140
bool is_setup = false;
140141
int channels;
141142

142143
void setup(T *src, size_t size){
144+
if (size==0) return;
143145
if (!is_setup) {
144-
T *sample = (T*) src;
145-
for (size_t j=0;j<size;j++){
146-
left += *sample++;
147-
right += *sample++;
148-
}
149-
left = left / size;
150-
right = right / size;
151-
152-
if (left>0){
153-
offset = left;
154-
is_setup = true;
155-
} else if (right>0){
156-
offset = right;
146+
if (channels==1){
147+
T *sample = (T*) src;
148+
for (size_t j=0;j<size;j++){
149+
left += *sample++;
150+
}
151+
offset = left / size;
157152
is_setup = true;
153+
LOGD("offset: %d",offset);
154+
} else if (channels==2){
155+
T *sample = (T*) src;
156+
for (size_t j=0;j<size;j++){
157+
left += *sample++;
158+
right += *sample++;
159+
}
160+
left = left / size;
161+
right = right / size;
162+
163+
if (left>0){
164+
offset = left;
165+
is_setup = true;
166+
} else if (right>0){
167+
offset = right;
168+
is_setup = true;
169+
}
170+
LOGD("offset: %d",offset);
158171
}
159172
}
160173
}
161174
};
162175

176+
/**
177+
* @brief Makes sure that the avg of the signal is set to 0
178+
* @ingroup convert
179+
*/
180+
class ConverterAutoCenter : public BaseConverter {
181+
public:
182+
ConverterAutoCenter() = default;
183+
184+
ConverterAutoCenter(int channels, int bitsPerSample){
185+
begin(channels, bitsPerSample);
186+
}
187+
~ConverterAutoCenter(){
188+
if (p_converter!=nullptr) delete p_converter;
189+
}
190+
191+
void begin(int channels, int bitsPerSample){
192+
this->channels = channels;
193+
this->bits_per_sample = bitsPerSample;
194+
if (p_converter!=nullptr) delete p_converter;
195+
switch(bits_per_sample){
196+
case 16:{
197+
p_converter = new ConverterAutoCenterT<int16_t>(channels);
198+
break;
199+
}
200+
case 24:{
201+
p_converter = new ConverterAutoCenterT<int24_t>(channels);
202+
break;
203+
}
204+
case 32:{
205+
p_converter = new ConverterAutoCenterT<int32_t>(channels);
206+
break;
207+
}
208+
}
209+
}
210+
211+
size_t convert(uint8_t *src, size_t size) override {
212+
if(p_converter==nullptr) return 0;
213+
return p_converter->convert(src, size);
214+
}
215+
216+
217+
protected:
218+
int channels;
219+
int bits_per_sample;
220+
BaseConverter *p_converter = nullptr;
221+
};
222+
223+
224+
163225
/**
164226
* @brief Switches the left and right channel
165227
* @ingroup convert

0 commit comments

Comments
 (0)