ESPHome  2025.2.0
audio_resampler.h
Go to the documentation of this file.
1 #pragma once
2 
3 #ifdef USE_ESP32
4 
5 #include "audio.h"
7 
8 #include "esphome/core/defines.h"
10 
11 #ifdef USE_SPEAKER
13 #endif
14 
15 #include "esp_err.h"
16 
17 #include <resampler.h> // esp-audio-libs
18 
19 namespace esphome {
20 namespace audio {
21 
22 enum class AudioResamplerState : uint8_t {
23  RESAMPLING, // More data is available to resample
24  FINISHED, // All file data has been resampled and transferred
25  FAILED, // Unused state included for consistency among Audio classes
26 };
27 
29  /*
30  * @brief Class that facilitates resampling audio.
31  * The audio data is read from a ring buffer source, resampled, and sent to an audio sink (ring buffer or speaker
32  * component). Also supports converting bits per sample.
33  */
34  public:
38  AudioResampler(size_t input_buffer_size, size_t output_buffer_size);
39 
43  esp_err_t add_source(std::weak_ptr<RingBuffer> &input_ring_buffer);
44 
48  esp_err_t add_sink(std::weak_ptr<RingBuffer> &output_ring_buffer);
49 
50 #ifdef USE_SPEAKER
51  esp_err_t add_sink(speaker::Speaker *speaker);
55 #endif
56 
65  esp_err_t start(AudioStreamInfo &input_stream_info, AudioStreamInfo &output_stream_info, uint16_t number_of_taps,
66  uint16_t number_of_filters);
67 
74  AudioResamplerState resample(bool stop_gracefully, int32_t *ms_differential);
75 
78  void set_pause_output_state(bool pause_state) { this->pause_output_ = pause_state; }
79 
80  protected:
81  std::unique_ptr<AudioSourceTransferBuffer> input_transfer_buffer_;
82  std::unique_ptr<AudioSinkTransferBuffer> output_transfer_buffer_;
83 
86 
87  uint32_t accumulated_frames_used_{0};
88  uint32_t accumulated_frames_generated_{0};
89 
90  bool pause_output_{false};
91 
94 
95  std::unique_ptr<esp_audio_libs::resampler::Resampler> resampler_;
96 };
97 
98 } // namespace audio
99 } // namespace esphome
100 
101 #endif
void set_pause_output_state(bool pause_state)
Pauses sending resampled audio to the sink.
std::unique_ptr< esp_audio_libs::resampler::Resampler > resampler_
std::unique_ptr< AudioSourceTransferBuffer > input_transfer_buffer_
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
std::unique_ptr< AudioSinkTransferBuffer > output_transfer_buffer_