Skip to content

Instantly share code, notes, and snippets.

@dchaplinsky
Created January 6, 2021 14:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dchaplinsky/a7a32066653a683fbc5d7cc068847e5d to your computer and use it in GitHub Desktop.
Save dchaplinsky/a7a32066653a683fbc5d7cc068847e5d to your computer and use it in GitHub Desktop.
#include "simple_dac.h"
Audio::Audio(const uint8_t BCLK, const uint8_t LRC, const uint8_t DOUT) {
//i2s configuration
m_i2s_num = I2S_NUM_0; // i2s port number
m_i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX);
m_i2s_config.sample_rate = 44100;
m_i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT;
m_i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT;
m_i2s_config.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB);
m_i2s_config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1; // high interrupt priority
m_i2s_config.dma_buf_count = 8; // max buffers
m_i2s_config.dma_buf_len = 1024; // max value
m_i2s_config.use_apll = APLL_ENABLE;
m_i2s_config.tx_desc_auto_clear = true; // new in V1.0.1
m_i2s_config.fixed_mclk = I2S_PIN_NO_CHANGE;
i2s_driver_install((i2s_port_t)m_i2s_num, &m_i2s_config, 0, NULL);
m_BCLK=BCLK; // Bit Clock
m_LRC=LRC; // Left/Right Clock
m_DOUT=DOUT; // Data Out
setPinout(m_BCLK, m_LRC, m_DOUT, m_DIN);
}
Audio::~Audio() {
I2Sstop(m_i2s_num);
}
esp_err_t Audio::I2Sstart(uint8_t i2s_num) {
return i2s_start((i2s_port_t) i2s_num);
}
esp_err_t Audio::I2Sstop(uint8_t i2s_num) {
return i2s_stop((i2s_port_t) i2s_num);
}
bool Audio::setPinout(uint8_t BCLK, uint8_t LRC, uint8_t DOUT, int8_t DIN) {
m_BCLK = BCLK; // Bit Clock
m_LRC = LRC; // Left/Right Clock
m_DOUT = DOUT; // Data Out
m_DIN = DIN; // Data In
i2s_pin_config_t pins = {
.bck_io_num = m_BCLK,
.ws_io_num = m_LRC, // wclk,
.data_out_num = m_DOUT,
.data_in_num = m_DIN
};
const esp_err_t result = i2s_set_pin((i2s_port_t) m_i2s_num, &pins);
return (result == ESP_OK);
}
int Audio::play32BitSample(int32_t sample[2]) {
esp_err_t err = i2s_write((i2s_port_t) m_i2s_num, (const char*) sample, sizeof(int32_t) * 2, &m_i2s_bytesWritten, 1000);
if(err != ESP_OK) {
log_e("ESP32 Errorcode %i", err);
return 0;
}
if(m_i2s_bytesWritten < sizeof(int32_t) * 2) {
log_e("Can't stuff any more in I2S..."); // increase waitingtime or outputbuffer
return 0;
}
return m_i2s_bytesWritten;
}
int Audio::play16BitSample(int16_t sample[2]) {
esp_err_t err = i2s_write((i2s_port_t) m_i2s_num, (const char*) sample, sizeof(int16_t) * 2, &m_i2s_bytesWritten, 1000);
if(err != ESP_OK) {
log_e("ESP32 Errorcode %i", err);
return 0;
}
if(m_i2s_bytesWritten < sizeof(int16_t) * 2) {
log_e("Can't stuff any more in I2S..."); // increase waitingtime or outputbuffer
return 0;
}
return m_i2s_bytesWritten;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment