ESPHome 2026.6.0-dev
Loading...
Searching...
No Matches
audio_resampler.h
Go to the documentation of this file.
1#pragma once
2
3#ifdef USE_ESP32
4
5#include "audio.h"
7
11
12#ifdef USE_SPEAKER
14#endif
15
16#include "esp_err.h"
17
18#include <resampler.h> // esp-audio-libs
19
20namespace esphome::audio {
21
22enum class AudioResamplerState : uint8_t {
23 RESAMPLING, // More data is available to resample
24 FINISHED, // All file data has been resampled and transferred
25 FAILED, // Failed to allocate the audio source
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
45 esp_err_t add_source(std::weak_ptr<ring_buffer::RingBuffer> &input_ring_buffer);
46
50 esp_err_t add_sink(std::weak_ptr<ring_buffer::RingBuffer> &output_ring_buffer);
51
52#ifdef USE_SPEAKER
56 esp_err_t add_sink(speaker::Speaker *speaker);
57#endif
58
67 esp_err_t start(AudioStreamInfo &input_stream_info, AudioStreamInfo &output_stream_info, uint16_t number_of_taps,
68 uint16_t number_of_filters);
69
76 AudioResamplerState resample(bool stop_gracefully, int32_t *ms_differential);
77
80 void set_pause_output_state(bool pause_state) { this->pause_output_ = pause_state; }
81
82 protected:
83 std::shared_ptr<ring_buffer::RingBuffer> source_ring_buffer_;
84 std::unique_ptr<RingBufferAudioSource> audio_source_;
85 std::unique_ptr<AudioSinkTransferBuffer> output_transfer_buffer_;
86
89
92
93 bool pause_output_{false};
94
97
98 std::unique_ptr<esp_audio_libs::resampler::Resampler> resampler_;
99};
100
101} // namespace esphome::audio
102
103#endif
AudioResamplerState resample(bool stop_gracefully, int32_t *ms_differential)
Resamples audio from the ring buffer source and writes to the sink.
std::shared_ptr< ring_buffer::RingBuffer > source_ring_buffer_
std::unique_ptr< esp_audio_libs::resampler::Resampler > resampler_
esp_err_t add_source(std::weak_ptr< ring_buffer::RingBuffer > &input_ring_buffer)
Sets the ring buffer the audio is read from and takes shared ownership of it.
std::unique_ptr< AudioSinkTransferBuffer > output_transfer_buffer_
esp_err_t add_sink(std::weak_ptr< ring_buffer::RingBuffer > &output_ring_buffer)
Adds a sink ring buffer for resampled audio.
void set_pause_output_state(bool pause_state)
Pauses sending resampled audio to the sink.
AudioResampler(size_t input_buffer_size, size_t output_buffer_size)
Allocates the output transfer buffer.
esp_err_t start(AudioStreamInfo &input_stream_info, AudioStreamInfo &output_stream_info, uint16_t number_of_taps, uint16_t number_of_filters)
Sets up the class to resample.
std::unique_ptr< RingBufferAudioSource > audio_source_
static void uint32_t