5 #include <driver/i2s.h> 16 static const uint8_t DMA_BUFFER_DURATION_MS = 15;
17 static const size_t DMA_BUFFERS_COUNT = 4;
19 static const size_t TASK_DELAY_MS = DMA_BUFFER_DURATION_MS * DMA_BUFFERS_COUNT / 2;
21 static const size_t TASK_STACK_SIZE = 4096;
22 static const ssize_t TASK_PRIORITY = 23;
24 static const size_t I2S_EVENT_QUEUE_COUNT = DMA_BUFFERS_COUNT + 1;
26 static const char *
const TAG =
"i2s_audio.speaker";
49 static esp_err_t err_bit_to_esp_err(uint32_t bit) {
52 return ESP_ERR_INVALID_STATE;
54 return ESP_ERR_INVALID_ARG;
56 return ESP_ERR_INVALID_SIZE;
58 return ESP_ERR_NO_MEM;
60 return ESP_ERR_NOT_SUPPORTED;
75 static void q15_multiplication(
const int16_t *input, int16_t *output,
size_t len, int16_t c) {
76 for (
int i = 0; i <
len; i++) {
77 int32_t acc = (int32_t) input[i] * (int32_t) c;
78 output[i] = (int16_t) (acc >> 15);
86 static const std::vector<int16_t> Q15_VOLUME_SCALING_FACTORS = {
87 0, 116, 122, 130, 137, 146, 154, 163, 173, 183, 194, 206, 218, 231, 244,
88 259, 274, 291, 308, 326, 345, 366, 388, 411, 435, 461, 488, 517, 548, 580,
89 615, 651, 690, 731, 774, 820, 868, 920, 974, 1032, 1094, 1158, 1227, 1300, 1377,
90 1459, 1545, 1637, 1734, 1837, 1946, 2061, 2184, 2313, 2450, 2596, 2750, 2913, 3085, 3269,
91 3462, 3668, 3885, 4116, 4360, 4619, 4893, 5183, 5490, 5816, 6161, 6527, 6914, 7324, 7758,
92 8218, 8706, 9222, 9770, 10349, 10963, 11613, 12302, 13032, 13805, 14624, 15491, 16410, 17384, 18415,
93 19508, 20665, 21891, 23189, 24565, 26022, 27566, 29201, 30933, 32767};
96 ESP_LOGCONFIG(TAG,
"Setting up I2S Audio Speaker...");
101 ESP_LOGE(TAG,
"Failed to create event group");
108 uint32_t event_group_bits = xEventGroupGetBits(this->
event_group_);
111 ESP_LOGD(TAG,
"Starting Speaker");
113 xEventGroupClearBits(this->
event_group_, SpeakerEventGroupBits::STATE_STARTING);
116 ESP_LOGD(TAG,
"Started Speaker");
118 xEventGroupClearBits(this->
event_group_, SpeakerEventGroupBits::STATE_RUNNING);
123 ESP_LOGD(TAG,
"Stopping Speaker");
125 xEventGroupClearBits(this->
event_group_, SpeakerEventGroupBits::STATE_STOPPING);
129 ESP_LOGD(TAG,
"Stopped Speaker");
138 xEventGroupClearBits(this->
event_group_, SpeakerEventGroupBits::ERR_TASK_FAILED_TO_START);
143 ESP_LOGW(TAG,
"Error writing to I2S: %s", esp_err_to_name(err_bit_to_esp_err(error_bits)));
148 this->
status_set_error(
"Failed to adjust I2S bus to match the incoming audio");
150 "Incompatible audio format: sample rate = %" PRIu32
", channels = %" PRIu8
", bits per sample = %" PRIu8,
170 ssize_t decibel_index = remap<ssize_t, float>(volume, 0.0f, 1.0f, 0, Q15_VOLUME_SCALING_FACTORS.size() - 1);
199 ESP_LOGE(TAG,
"Cannot play audio, speaker failed to setup");
208 vTaskDelay(ticks_to_wait);
212 size_t bytes_written = 0;
219 bytes_written = temp_ring_buffer->write_without_replacement((
void *) data, length, ticks_to_wait);
222 return bytes_written;
236 uint32_t event_group_bits =
253 const uint32_t dma_buffers_duration_ms = DMA_BUFFER_DURATION_MS * DMA_BUFFERS_COUNT;
255 const uint32_t ring_buffer_duration = std::max(dma_buffers_duration_ms, this_speaker->
buffer_duration_ms_);
258 const size_t data_buffer_size = audio_stream_info.
ms_to_bytes(dma_buffers_duration_ms);
259 const size_t ring_buffer_size = audio_stream_info.
ms_to_bytes(ring_buffer_duration);
261 const size_t single_dma_buffer_input_size = data_buffer_size / DMA_BUFFERS_COUNT;
272 bool stop_gracefully =
false;
273 uint32_t last_data_received_time =
millis();
274 bool tx_dma_underflow =
false;
282 event_group_bits = xEventGroupGetBits(this_speaker->
event_group_);
285 xEventGroupClearBits(this_speaker->
event_group_, SpeakerEventGroupBits::COMMAND_STOP);
289 xEventGroupClearBits(this_speaker->
event_group_, SpeakerEventGroupBits::COMMAND_STOP_GRACEFULLY);
290 stop_gracefully =
true;
298 i2s_event_t i2s_event;
300 if (i2s_event.type == I2S_EVENT_TX_Q_OVF) {
301 tx_dma_underflow =
true;
308 delay(TASK_DELAY_MS);
313 pdMS_TO_TICKS(TASK_DELAY_MS));
315 if (bytes_read > 0) {
324 const uint32_t batches = (bytes_read + single_dma_buffer_input_size - 1) / single_dma_buffer_input_size;
326 for (uint32_t i = 0; i < batches; ++i) {
327 size_t bytes_written = 0;
328 size_t bytes_to_write = std::min(single_dma_buffer_input_size, bytes_read);
331 i2s_write(this_speaker->
parent_->get_port(), this_speaker->
data_buffer_ + i * single_dma_buffer_input_size,
332 bytes_to_write, &bytes_written, pdMS_TO_TICKS(DMA_BUFFER_DURATION_MS * 5));
334 i2s_write_expand(this_speaker->
parent_->get_port(),
335 this_speaker->
data_buffer_ + i * single_dma_buffer_input_size, bytes_to_write,
337 pdMS_TO_TICKS(DMA_BUFFER_DURATION_MS * 5));
340 uint32_t write_timestamp =
micros();
342 if (bytes_written != bytes_to_write) {
346 bytes_read -= bytes_written;
349 const uint32_t new_playback_ms =
351 const uint32_t remainder_us =
354 uint32_t pending_frames =
360 tx_dma_underflow =
false;
361 last_data_received_time =
millis();
365 if (stop_gracefully && tx_dma_underflow) {
373 i2s_driver_uninstall(this_speaker->
parent_->get_port());
375 this_speaker->
parent_->unlock();
420 case ESP_ERR_INVALID_STATE:
423 case ESP_ERR_INVALID_ARG:
426 case ESP_ERR_INVALID_SIZE:
432 case ESP_ERR_NOT_SUPPORTED:
449 return ESP_ERR_NO_MEM;
458 return ESP_ERR_NO_MEM;
467 return ESP_ERR_NOT_SUPPORTED;
472 return ESP_ERR_NOT_SUPPORTED;
475 if (!this->
parent_->try_lock()) {
476 return ESP_ERR_INVALID_STATE;
479 i2s_channel_fmt_t channel = this->
channel_;
482 if (this->
channel_ == I2S_CHANNEL_FMT_ONLY_LEFT) {
483 channel = I2S_CHANNEL_FMT_ONLY_LEFT;
485 channel = I2S_CHANNEL_FMT_ONLY_RIGHT;
488 channel = I2S_CHANNEL_FMT_RIGHT_LEFT;
491 int dma_buffer_length = audio_stream_info.
ms_to_frames(DMA_BUFFER_DURATION_MS);
493 i2s_driver_config_t config = {
494 .mode = (i2s_mode_t) (this->
i2s_mode_ | I2S_MODE_TX),
497 .channel_format = channel,
499 .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
500 .dma_buf_count = DMA_BUFFERS_COUNT,
501 .dma_buf_len = dma_buffer_length,
503 .tx_desc_auto_clear =
true,
504 .fixed_mclk = I2S_PIN_NO_CHANGE,
505 .mclk_multiple = I2S_MCLK_MULTIPLE_256,
507 #if SOC_I2S_SUPPORTS_TDM 508 .chan_mask = (i2s_channel_t) (I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1),
512 .bit_order_msb =
false,
516 #if SOC_I2S_SUPPORTS_DAC 518 config.mode = (i2s_mode_t) (config.mode | I2S_MODE_DAC_BUILT_IN);
530 #if SOC_I2S_SUPPORTS_DAC 533 i2s_pin_config_t pin_config = this->
parent_->get_pin_config();
534 pin_config.data_out_num = this->
dout_pin_;
536 err = i2s_set_pin(this->
parent_->get_port(), &pin_config);
537 #if SOC_I2S_SUPPORTS_DAC 545 i2s_driver_uninstall(this->
parent_->get_port());
564 vTaskDelete(
nullptr);
value_type const & value() const
size_t play(const uint8_t *data, size_t length, TickType_t ticks_to_wait) override
Plays the provided audio data.
EventGroupHandle_t event_group_
void stop_(bool wait_on_empty)
Sends a stop command to the speaker task via event_group_.
bool send_esp_err_to_event_group_(esp_err_t err)
Sets the corresponding ERR_ESP event group bits.
esp_err_t allocate_buffers_(size_t data_buffer_size, size_t ring_buffer_size)
Allocates the data buffer and ring buffer.
virtual bool set_mute_off()=0
virtual bool set_mute_on()=0
uint8_t get_channels() const
static void speaker_task(void *params)
Function for the FreeRTOS task handling audio output.
void status_set_warning(const char *message="unspecified")
uint32_t ms_to_frames(uint32_t ms) const
Converts duration to frames.
void set_volume(float volume) override
Sets the volume of the speaker.
i2s_dac_mode_t internal_dac_mode_
uint8_t get_bits_per_sample() const
uint32_t frames_to_milliseconds_with_remainder(uint32_t *frames) const
Computes the duration, in milliseconds, the given amount of frames represents.
uint32_t IRAM_ATTR HOT micros()
CallbackManager< void(uint32_t, uint32_t, uint32_t, uint32_t)> audio_output_callback_
uint32_t IRAM_ATTR HOT millis()
bool status_has_error() const
void status_set_error(const char *message="unspecified")
uint32_t accumulated_frames_written_
i2s_channel_fmt_t channel_
esp_err_t start_i2s_driver_(audio::AudioStreamInfo &audio_stream_info)
Starts the ESP32 I2S driver.
void status_clear_warning()
TaskHandle_t speaker_task_handle_
optional< uint32_t > timeout_
void set_mute_state(bool mute_state) override
Mutes or unmute the speaker.
uint32_t get_sample_rate() const
size_t ms_to_bytes(uint32_t ms) const
Converts duration to bytes.
void deallocate(T *p, size_t n)
virtual bool set_volume(float volume)=0
void status_clear_error()
uint32_t frames_to_microseconds(uint32_t frames) const
Computes the duration, in microseconds, the given amount of frames represents.
i2s_bits_per_sample_t bits_per_sample_
virtual void mark_failed()
Mark this component as failed.
audio_dac::AudioDac * audio_dac_
void delete_task_(size_t buffer_size)
Deletes the speaker's task.
std::shared_ptr< RingBuffer > audio_ring_buffer_
Implementation of SPI Controller mode.
bool has_buffered_data() const override
i2s_bits_per_chan_t bits_per_channel_
QueueHandle_t i2s_event_queue_
uint32_t bytes_to_frames(size_t bytes) const
Convert bytes to frames.
An STL allocator that uses SPI or internal RAM.
static std::unique_ptr< RingBuffer > create(size_t len)
uint32_t buffer_duration_ms_
audio::AudioStreamInfo audio_stream_info_
i2s_comm_format_t i2s_comm_fmt_
void IRAM_ATTR HOT delay(uint32_t ms)
int16_t q15_volume_factor_