ESPHome 2025.5.0
Loading...
Searching...
No Matches
i2s_audio_speaker.h
Go to the documentation of this file.
1#pragma once
2
3#ifdef USE_ESP32
4
5#include "../i2s_audio.h"
6
7#include <freertos/event_groups.h>
8#include <freertos/queue.h>
9#include <freertos/FreeRTOS.h>
10
13
15#include "esphome/core/gpio.h"
18
19namespace esphome {
20namespace i2s_audio {
21
22class I2SAudioSpeaker : public I2SAudioOut, public speaker::Speaker, public Component {
23 public:
24 float get_setup_priority() const override { return esphome::setup_priority::PROCESSOR; }
25
26 void setup() override;
27 void loop() override;
28
29 void set_buffer_duration(uint32_t buffer_duration_ms) { this->buffer_duration_ms_ = buffer_duration_ms; }
30 void set_timeout(uint32_t ms) { this->timeout_ = ms; }
31#ifdef USE_I2S_LEGACY
32#if SOC_I2S_SUPPORTS_DAC
33 void set_internal_dac_mode(i2s_dac_mode_t mode) { this->internal_dac_mode_ = mode; }
34#endif
35 void set_dout_pin(uint8_t pin) { this->dout_pin_ = pin; }
36 void set_i2s_comm_fmt(i2s_comm_format_t mode) { this->i2s_comm_fmt_ = mode; }
37#else
38 void set_dout_pin(uint8_t pin) { this->dout_pin_ = (gpio_num_t) pin; }
39 void set_i2s_comm_fmt(std::string mode) { this->i2s_comm_fmt_ = std::move(mode); }
40#endif
41
42 void start() override;
43 void stop() override;
44 void finish() override;
45
46 void set_pause_state(bool pause_state) override { this->pause_state_ = pause_state; }
47 bool get_pause_state() const override { return this->pause_state_; }
48
55 size_t play(const uint8_t *data, size_t length, TickType_t ticks_to_wait) override;
56 size_t play(const uint8_t *data, size_t length) override { return play(data, length, 0); }
57
58 bool has_buffered_data() const override;
59
64 void set_volume(float volume) override;
65
70 void set_mute_state(bool mute_state) override;
71
72 protected:
81 static void speaker_task(void *params);
82
85 void stop_(bool wait_on_empty);
86
90 bool send_esp_err_to_event_group_(esp_err_t err);
91
92#ifndef USE_I2S_LEGACY
93 static bool i2s_overflow_cb(i2s_chan_handle_t handle, i2s_event_data_t *event, void *user_ctx);
94#endif
95
101 esp_err_t allocate_buffers_(size_t data_buffer_size, size_t ring_buffer_size);
102
112 esp_err_t start_i2s_driver_(audio::AudioStreamInfo &audio_stream_info);
113
118 void delete_task_(size_t buffer_size);
119
120 TaskHandle_t speaker_task_handle_{nullptr};
121 EventGroupHandle_t event_group_{nullptr};
122
123 QueueHandle_t i2s_event_queue_;
124
125 uint8_t *data_buffer_;
126 std::shared_ptr<RingBuffer> audio_ring_buffer_;
127
129
131
132 bool task_created_{false};
133 bool pause_state_{false};
134
135 int16_t q15_volume_factor_{INT16_MAX};
136
137 size_t bytes_written_{0};
138
139#ifdef USE_I2S_LEGACY
140#if SOC_I2S_SUPPORTS_DAC
141 i2s_dac_mode_t internal_dac_mode_{I2S_DAC_CHANNEL_DISABLE};
142#endif
143 uint8_t dout_pin_;
144 i2s_comm_format_t i2s_comm_fmt_;
145#else
146 gpio_num_t dout_pin_;
147 std::string i2s_comm_fmt_;
148 i2s_chan_handle_t tx_handle_;
149#endif
150
152};
153
154} // namespace i2s_audio
155} // namespace esphome
156
157#endif // USE_ESP32
BedjetMode mode
BedJet operating mode.
esp_err_t start_i2s_driver_(audio::AudioStreamInfo &audio_stream_info)
Starts the ESP32 I2S driver.
float get_setup_priority() const override
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.
static bool i2s_overflow_cb(i2s_chan_handle_t handle, i2s_event_data_t *event, void *user_ctx)
size_t play(const uint8_t *data, size_t length) override
void set_internal_dac_mode(i2s_dac_mode_t mode)
std::shared_ptr< RingBuffer > audio_ring_buffer_
void set_pause_state(bool pause_state) override
void set_mute_state(bool mute_state) override
Mutes or unmute the speaker.
esp_err_t allocate_buffers_(size_t data_buffer_size, size_t ring_buffer_size)
Allocates the data buffer and ring buffer.
bool has_buffered_data() const override
void set_i2s_comm_fmt(std::string mode)
size_t play(const uint8_t *data, size_t length, TickType_t ticks_to_wait) override
Plays the provided audio data.
void set_buffer_duration(uint32_t buffer_duration_ms)
void set_volume(float volume) override
Sets the volume of the speaker.
static void speaker_task(void *params)
Function for the FreeRTOS task handling audio output.
void delete_task_(size_t buffer_size)
Deletes the speaker's task.
void set_i2s_comm_fmt(i2s_comm_format_t mode)
const float PROCESSOR
For components that use data from sensors like displays.
Definition component.cpp:20
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
uint16_t length
Definition tt21100.cpp:0