initial commit
This commit is contained in:
5
lib/audio_input/library.json
Normal file
5
lib/audio_input/library.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"build": {
|
||||
"flags": "-Ofast"
|
||||
}
|
||||
}
|
||||
32
lib/audio_input/src/ADCSampler.cpp
Normal file
32
lib/audio_input/src/ADCSampler.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
#include "ADCSampler.h"
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
|
||||
|
||||
ADCSampler::ADCSampler(adc_unit_t adcUnit, adc1_channel_t adcChannel, const i2s_config_t &i2s_config) : I2SSampler(I2S_NUM_0, i2s_config)
|
||||
{
|
||||
m_adcUnit = adcUnit;
|
||||
m_adcChannel = adcChannel;
|
||||
}
|
||||
|
||||
void ADCSampler::configureI2S()
|
||||
{
|
||||
//init ADC pad
|
||||
i2s_set_adc_mode(m_adcUnit, m_adcChannel);
|
||||
// enable the adc
|
||||
i2s_adc_enable(m_i2sPort);
|
||||
}
|
||||
|
||||
int ADCSampler::read(int16_t *samples, int count)
|
||||
{
|
||||
// read from i2s
|
||||
size_t bytes_read = 0;
|
||||
i2s_read(m_i2sPort, samples, sizeof(int16_t) * count, &bytes_read, portMAX_DELAY);
|
||||
int samples_read = bytes_read / sizeof(int16_t);
|
||||
for (int i = 0; i < samples_read; i++)
|
||||
{
|
||||
samples[i] = (2048 - (uint16_t(samples[i]) & 0xfff)) * 15;
|
||||
}
|
||||
return samples_read;
|
||||
}
|
||||
|
||||
#endif
|
||||
18
lib/audio_input/src/ADCSampler.h
Normal file
18
lib/audio_input/src/ADCSampler.h
Normal file
@@ -0,0 +1,18 @@
|
||||
#pragma once
|
||||
|
||||
#include <driver/adc.h>
|
||||
#include "I2SSampler.h"
|
||||
|
||||
class ADCSampler : public I2SSampler
|
||||
{
|
||||
private:
|
||||
adc_unit_t m_adcUnit;
|
||||
adc1_channel_t m_adcChannel;
|
||||
|
||||
protected:
|
||||
void configureI2S();
|
||||
|
||||
public:
|
||||
ADCSampler(adc_unit_t adc_unit, adc1_channel_t adc_channel, const i2s_config_t &i2s_config);
|
||||
virtual int read(int16_t *samples, int count);
|
||||
};
|
||||
52
lib/audio_input/src/I2SMEMSSampler.cpp
Normal file
52
lib/audio_input/src/I2SMEMSSampler.cpp
Normal file
@@ -0,0 +1,52 @@
|
||||
#include "I2SMEMSSampler.h"
|
||||
#include "soc/i2s_reg.h"
|
||||
|
||||
I2SMEMSSampler::I2SMEMSSampler(
|
||||
i2s_port_t i2s_port,
|
||||
i2s_pin_config_t &i2s_pins,
|
||||
i2s_config_t i2s_config,
|
||||
int raw_samples_size,
|
||||
bool fixSPH0645) : I2SSampler(i2s_port, i2s_config)
|
||||
{
|
||||
m_i2sPins = i2s_pins;
|
||||
m_fixSPH0645 = fixSPH0645;
|
||||
m_raw_samples_size = raw_samples_size;
|
||||
m_raw_samples = (int32_t *)malloc(sizeof(int32_t) * raw_samples_size);
|
||||
}
|
||||
|
||||
I2SMEMSSampler::~I2SMEMSSampler()
|
||||
{
|
||||
free(m_raw_samples);
|
||||
}
|
||||
|
||||
void I2SMEMSSampler::configureI2S()
|
||||
{
|
||||
if (m_fixSPH0645)
|
||||
{
|
||||
// FIXES for SPH0645
|
||||
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
|
||||
REG_SET_BIT(I2S_TIMING_REG(m_i2sPort), BIT(9));
|
||||
REG_SET_BIT(I2S_CONF_REG(m_i2sPort), I2S_RX_MSB_SHIFT);
|
||||
#endif
|
||||
}
|
||||
|
||||
i2s_set_pin(m_i2sPort, &m_i2sPins);
|
||||
}
|
||||
|
||||
int I2SMEMSSampler::read(int16_t *samples, int count)
|
||||
{
|
||||
// read from i2s
|
||||
size_t bytes_read = 0;
|
||||
if (count>m_raw_samples_size)
|
||||
{
|
||||
count = m_raw_samples_size; // Buffer is too small
|
||||
}
|
||||
i2s_read(m_i2sPort, m_raw_samples, sizeof(int32_t) * count, &bytes_read, portMAX_DELAY);
|
||||
int samples_read = bytes_read / sizeof(int32_t);
|
||||
for (int i = 0; i < samples_read; i++)
|
||||
{
|
||||
int32_t temp = m_raw_samples[i] >> 11;
|
||||
samples[i] = (temp > INT16_MAX) ? INT16_MAX : (temp < -INT16_MAX) ? -INT16_MAX : (int16_t)temp;
|
||||
}
|
||||
return samples_read;
|
||||
}
|
||||
25
lib/audio_input/src/I2SMEMSSampler.h
Normal file
25
lib/audio_input/src/I2SMEMSSampler.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
#include "I2SSampler.h"
|
||||
|
||||
class I2SMEMSSampler : public I2SSampler
|
||||
{
|
||||
private:
|
||||
i2s_pin_config_t m_i2sPins;
|
||||
bool m_fixSPH0645;
|
||||
int32_t *m_raw_samples;
|
||||
int m_raw_samples_size;
|
||||
|
||||
protected:
|
||||
void configureI2S();
|
||||
|
||||
public:
|
||||
I2SMEMSSampler(
|
||||
i2s_port_t i2s_port,
|
||||
i2s_pin_config_t &i2s_pins,
|
||||
i2s_config_t i2s_config,
|
||||
int raw_samples_size,
|
||||
bool fixSPH0645 = false);
|
||||
~I2SMEMSSampler();
|
||||
virtual int read(int16_t *samples, int count);
|
||||
};
|
||||
21
lib/audio_input/src/I2SSampler.cpp
Normal file
21
lib/audio_input/src/I2SSampler.cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
#include "I2SSampler.h"
|
||||
#include "driver/i2s.h"
|
||||
|
||||
I2SSampler::I2SSampler(i2s_port_t i2sPort, const i2s_config_t &i2s_config) : m_i2sPort(i2sPort), m_i2s_config(i2s_config)
|
||||
{
|
||||
}
|
||||
|
||||
void I2SSampler::start()
|
||||
{
|
||||
//install and start i2s driver
|
||||
i2s_driver_install(m_i2sPort, &m_i2s_config, 0, NULL);
|
||||
// set up the I2S configuration from the subclass
|
||||
configureI2S();
|
||||
}
|
||||
|
||||
void I2SSampler::stop()
|
||||
{
|
||||
// stop the i2S driver
|
||||
i2s_driver_uninstall(m_i2sPort);
|
||||
}
|
||||
28
lib/audio_input/src/I2SSampler.h
Normal file
28
lib/audio_input/src/I2SSampler.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#pragma once
|
||||
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <driver/i2s.h>
|
||||
|
||||
/**
|
||||
* Base Class for both the ADC and I2S sampler
|
||||
**/
|
||||
class I2SSampler
|
||||
{
|
||||
protected:
|
||||
i2s_port_t m_i2sPort = I2S_NUM_0;
|
||||
i2s_config_t m_i2s_config;
|
||||
virtual void configureI2S() = 0;
|
||||
virtual void processI2SData(void *samples, size_t count){
|
||||
// nothing to do for the default case
|
||||
};
|
||||
|
||||
public:
|
||||
I2SSampler(i2s_port_t i2sPort, const i2s_config_t &i2sConfig);
|
||||
void start();
|
||||
virtual int read(int16_t *samples, int count) = 0;
|
||||
void stop();
|
||||
int sample_rate()
|
||||
{
|
||||
return m_i2s_config.sample_rate;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user