ESPHome  2025.2.0
speaker.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <cstddef>
4 #include <cstdint>
5 #include <vector>
6 
7 #ifdef USE_ESP32
8 #include <freertos/FreeRTOS.h>
9 #endif
10 
11 #include "esphome/core/defines.h"
12 #include "esphome/core/helpers.h"
13 
15 #ifdef USE_AUDIO_DAC
17 #endif
18 
19 namespace esphome {
20 namespace speaker {
21 
22 enum State : uint8_t {
27 };
28 
29 class Speaker {
30  public:
31 #ifdef USE_ESP32
32  virtual size_t play(const uint8_t *data, size_t length, TickType_t ticks_to_wait) {
39  return this->play(data, length);
40  };
41 #endif
42 
49  virtual size_t play(const uint8_t *data, size_t length) = 0;
50 
51  size_t play(const std::vector<uint8_t> &data) { return this->play(data.data(), data.size()); }
52 
53  virtual void start() = 0;
54  virtual void stop() = 0;
55  // In compare between *STOP()* and *FINISH()*; *FINISH()* will stop after emptying the play buffer,
56  // while *STOP()* will break directly.
57  // When finish() is not implemented on the platform component it should just do a normal stop.
58  virtual void finish() { this->stop(); }
59 
60  // Pauses processing incoming audio. Needs to be implemented specifically per speaker component
61  virtual void set_pause_state(bool pause_state) {}
62  virtual bool get_pause_state() const { return false; }
63 
64  virtual bool has_buffered_data() const = 0;
65 
66  bool is_running() const { return this->state_ == STATE_RUNNING; }
67  bool is_stopped() const { return this->state_ == STATE_STOPPED; }
68 
69  // Volume control is handled by a configured audio dac component. Individual speaker components can
70  // override and implement in software if an audio dac isn't available.
71  virtual void set_volume(float volume) {
72  this->volume_ = volume;
73 #ifdef USE_AUDIO_DAC
74  if (this->audio_dac_ != nullptr) {
75  this->audio_dac_->set_volume(volume);
76  }
77 #endif
78  };
79  float get_volume() { return this->volume_; }
80 
81  virtual void set_mute_state(bool mute_state) {
82  this->mute_state_ = mute_state;
83 #ifdef USE_AUDIO_DAC
84  if (this->audio_dac_) {
85  if (mute_state) {
86  this->audio_dac_->set_mute_on();
87  } else {
88  this->audio_dac_->set_mute_off();
89  }
90  }
91 #endif
92  }
93  bool get_mute_state() { return this->mute_state_; }
94 
95 #ifdef USE_AUDIO_DAC
96  void set_audio_dac(audio_dac::AudioDac *audio_dac) { this->audio_dac_ = audio_dac; }
97 #endif
98 
99  void set_audio_stream_info(const audio::AudioStreamInfo &audio_stream_info) {
100  this->audio_stream_info_ = audio_stream_info;
101  }
102 
104 
112  void add_audio_output_callback(std::function<void(uint32_t, uint32_t, uint32_t, uint32_t)> &&callback) {
113  this->audio_output_callback_.add(std::move(callback));
114  }
115 
116  protected:
119  float volume_{1.0f};
120  bool mute_state_{false};
121 
122 #ifdef USE_AUDIO_DAC
124 #endif
125 
127 };
128 
129 } // namespace speaker
130 } // namespace esphome
bool is_running() const
Definition: speaker.h:66
virtual bool set_mute_off()=0
virtual bool set_mute_on()=0
virtual void set_volume(float volume)
Definition: speaker.h:71
void add_audio_output_callback(std::function< void(uint32_t, uint32_t, uint32_t, uint32_t)> &&callback)
Callback function for sending the duration of the audio written to the speaker since the last callbac...
Definition: speaker.h:112
virtual void finish()
Definition: speaker.h:58
virtual bool has_buffered_data() const =0
CallbackManager< void(uint32_t, uint32_t, uint32_t, uint32_t)> audio_output_callback_
Definition: speaker.h:126
bool is_stopped() const
Definition: speaker.h:67
size_t play(const std::vector< uint8_t > &data)
Definition: speaker.h:51
void set_audio_stream_info(const audio::AudioStreamInfo &audio_stream_info)
Definition: speaker.h:99
virtual bool get_pause_state() const
Definition: speaker.h:62
void set_audio_dac(audio_dac::AudioDac *audio_dac)
Definition: speaker.h:96
virtual bool set_volume(float volume)=0
virtual void start()=0
audio_dac::AudioDac * audio_dac_
Definition: speaker.h:123
uint16_t length
Definition: tt21100.cpp:12
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
virtual void set_pause_state(bool pause_state)
Definition: speaker.h:61
audio::AudioStreamInfo & get_audio_stream_info()
Definition: speaker.h:103
virtual size_t play(const uint8_t *data, size_t length, TickType_t ticks_to_wait)
Plays the provided audio data.
Definition: speaker.h:38
virtual void stop()=0
audio::AudioStreamInfo audio_stream_info_
Definition: speaker.h:118
virtual void set_mute_state(bool mute_state)
Definition: speaker.h:81