-
-
Save dchaplinsky/a7a32066653a683fbc5d7cc068847e5d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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