ESPHome  2025.2.0
speaker_media_player.h
Go to the documentation of this file.
1 #pragma once
2 
3 #ifdef USE_ESP_IDF
4 
5 #include "audio_pipeline.h"
6 
8 
11 
13 #include "esphome/core/component.h"
15 
16 #include <deque>
17 #include <freertos/FreeRTOS.h>
18 #include <freertos/queue.h>
19 
20 namespace esphome {
21 namespace speaker {
22 
30 };
31 
32 struct PlaylistItem {
35 };
36 
38  float volume;
39  bool is_muted;
40 };
41 
43  public:
44  float get_setup_priority() const override { return esphome::setup_priority::PROCESSOR; }
45  void setup() override;
46  void loop() override;
47 
48  // MediaPlayer implementations
49  media_player::MediaPlayerTraits get_traits() override;
50  bool is_muted() const override { return this->is_muted_; }
51 
52  void set_buffer_size(size_t buffer_size) { this->buffer_size_ = buffer_size; }
53  void set_task_stack_in_psram(bool task_stack_in_psram) { this->task_stack_in_psram_ = task_stack_in_psram; }
54 
55  // Percentage to increase or decrease the volume for volume up or volume down commands
56  void set_volume_increment(float volume_increment) { this->volume_increment_ = volume_increment; }
57 
58  void set_volume_max(float volume_max) { this->volume_max_ = volume_max; }
59  void set_volume_min(float volume_min) { this->volume_min_ = volume_min; }
60 
61  void set_announcement_speaker(Speaker *announcement_speaker) { this->announcement_speaker_ = announcement_speaker; }
63  this->announcement_format_ = announcement_format;
64  }
65  void set_media_speaker(Speaker *media_speaker) { this->media_speaker_ = media_speaker; }
67  this->media_format_ = media_format;
68  }
69 
70  Trigger<> *get_mute_trigger() const { return this->mute_trigger_; }
71  Trigger<> *get_unmute_trigger() const { return this->unmute_trigger_; }
72  Trigger<float> *get_volume_trigger() const { return this->volume_trigger_; }
73 
74  void play_file(audio::AudioFile *media_file, bool announcement, bool enqueue);
75 
76  uint32_t get_playback_ms() const { return this->playback_ms_; }
77  uint32_t get_playback_us() const { return this->playback_us_; }
78  uint32_t get_decoded_playback_ms() const { return this->decoded_playback_ms_; }
79 
80  void set_playlist_delay_ms(AudioPipelineType pipeline_type, uint32_t delay_ms);
81 
82  protected:
83  // Receives commands from HA or from the voice assistant component
84  // Sends commands to the media_control_commanda_queue_
85  void control(const media_player::MediaPlayerCall &call) override;
86 
88  void set_volume_(float volume, bool publish = true);
89 
93  void set_mute_state_(bool mute_state);
94 
96  void save_volume_restore_state_();
97 
100  inline bool single_pipeline_() { return (this->media_speaker_ == nullptr); }
101 
102  // Processes commands from media_control_command_queue_.
103  void watch_media_commands_();
104 
105  std::unique_ptr<AudioPipeline> announcement_pipeline_;
106  std::unique_ptr<AudioPipeline> media_pipeline_;
107  Speaker *media_speaker_{nullptr};
108  Speaker *announcement_speaker_{nullptr};
109 
112  std::string media_url_{}; // only modified by control function
113  audio::AudioFile *media_file_{}; // only modified by play_file function
114  bool media_repeat_one_{false};
115  uint32_t media_playlist_delay_ms_{0};
116 
118  AudioPipelineState announcement_pipeline_state_{AudioPipelineState::STOPPED};
119  std::string announcement_url_{}; // only modified by control function
120  audio::AudioFile *announcement_file_{}; // only modified by play_file function
121  bool announcement_repeat_one_{false};
122  uint32_t announcement_playlist_delay_ms_{0};
123 
125 
126  std::deque<PlaylistItem> announcement_playlist_;
127  std::deque<PlaylistItem> media_playlist_;
128 
129  size_t buffer_size_;
130 
132 
133  bool is_paused_{false};
134  bool is_muted_{false};
135 
136  // The amount to change the volume on volume up/down commands
138 
139  float volume_max_;
140  float volume_min_;
141 
142  // Used to save volume/mute state for restoration on reboot
144 
145  Trigger<> *mute_trigger_ = new Trigger<>();
146  Trigger<> *unmute_trigger_ = new Trigger<>();
147  Trigger<float> *volume_trigger_ = new Trigger<float>();
148 
149  uint32_t decoded_playback_ms_{0};
150  uint32_t playback_us_{0};
151  uint32_t playback_ms_{0};
152  uint32_t remainder_us_{0};
153  uint32_t pending_ms_{0};
154  uint32_t last_audio_write_timestamp_{0};
155 };
156 
157 } // namespace speaker
158 } // namespace esphome
159 
160 #endif
void setup()
void loop()
Trigger< float > * get_volume_trigger() const
void set_media_speaker(Speaker *media_speaker)
bool single_pipeline_()
Returns true if the media player has only the announcement pipeline defined, false if both the announ...
std::unique_ptr< AudioPipeline > media_pipeline_
void set_announcement_format(const media_player::MediaPlayerSupportedFormat &announcement_format)
void set_volume_increment(float volume_increment)
optional< media_player::MediaPlayerSupportedFormat > announcement_format_
std::unique_ptr< AudioPipeline > announcement_pipeline_
void set_task_stack_in_psram(bool task_stack_in_psram)
optional< audio::AudioFile * > file
optional< media_player::MediaPlayerCommand > command
void set_announcement_speaker(Speaker *announcement_speaker)
void set_buffer_size(size_t buffer_size)
std::deque< PlaylistItem > media_playlist_
const float PROCESSOR
For components that use data from sensors like displays.
Definition: component.cpp:20
optional< media_player::MediaPlayerSupportedFormat > media_format_
void set_media_format(const media_player::MediaPlayerSupportedFormat &media_format)
std::deque< PlaylistItem > announcement_playlist_
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7