7#include <freertos/event_groups.h>
8#include <freertos/queue.h>
9#include <freertos/FreeRTOS.h>
24static constexpr size_t TASK_STACK_SIZE = 4096;
25static constexpr ssize_t TASK_PRIORITY = 19;
51 void setup()
override;
63 void start()
override;
76 size_t play(
const uint8_t *data,
size_t length, TickType_t ticks_to_wait)
override;
96 void post_software_gain_(
uint32_t rate_samples);
100 static void speaker_task(
void *params);
103 virtual void run_speaker_task() = 0;
107 void stop_(
bool wait_on_empty);
114 static bool i2s_on_sent_cb(i2s_chan_handle_t
handle, i2s_event_data_t *event,
void *user_ctx);
127 esp_err_t init_i2s_channel_(
const i2s_chan_config_t &chan_cfg,
const i2s_std_config_t &std_cfg,
128 size_t event_queue_size);
133 esp_err_t prepare_event_queues_(
size_t event_queue_size);
135#ifdef USE_I2S_AUDIO_FULL_DUPLEX
139 esp_err_t acquire_full_duplex_channel_(
size_t event_queue_size);
143 void stop_i2s_driver_(
bool keep_channel);
146 void park_dout_pin_();
149 void delete_channel_();
152 virtual void on_task_stopped() {}
160 template<
typename F>
bool resync_lockstep_(
uint32_t extra_frames, F &&preload) {
161 this->drain_lockstep_(extra_frames);
162 return preload() && (i2s_channel_enable(this->
tx_handle_) == ESP_OK);
167 void drain_lockstep_(
uint32_t extra_frames);
173 void apply_software_volume_(uint8_t *data,
size_t bytes_read);
176 static bool esp32_mono_swap_needed(
const audio::AudioStreamInfo &stream_info);
178 bool esp32_mono_swap_needed_()
const {
return esp32_mono_swap_needed(this->
output_stream_info_); }
Abstract base class for I2S audio speaker implementations.
uint32_t buffer_duration_ms_
esp_audio_libs::gain::GainRamp gain_ramp_
audio::AudioStreamInfo output_stream_info_
bool get_pause_state() const override
i2s_chan_handle_t tx_handle_
std::weak_ptr< ring_buffer::RingBuffer > audio_ring_buffer_
optional< audio::AudioStreamInfo > rejected_stream_info_
TaskHandle_t speaker_task_handle_
void swap_esp32_mono_samples_(uint8_t *data, size_t bytes_read)
Plays the provided audio data.
audio::AudioStreamInfo current_stream_info_
void dump_config() override
void set_dout_pin(uint8_t pin)
void set_buffer_duration(uint32_t buffer_duration_ms)
optional< uint32_t > timeout_
void set_timeout(uint32_t ms)
void set_pause_state(bool pause_state) override
void set_keep_alive(bool keep_alive)
float get_setup_priority() const override
QueueHandle_t write_records_queue_
QueueHandle_t i2s_event_queue_
EventGroupHandle_t event_group_
i2s_chan_handle_t get_tx_handle() const
Get the I2S TX channel handle.
virtual size_t play(const uint8_t *data, size_t length)=0
Plays the provided audio data.
virtual void set_volume(float volume)
virtual void set_mute_state(bool mute_state)
virtual bool has_buffered_data() const =0
@ COMMAND_STOP_GRACEFULLY
constexpr float PROCESSOR
For components that use data from sensors like displays.
spi_device_handle_t handle