ESPHome 2026.5.3
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, // 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<ring_buffer::RingBuffer> &input_ring_buffer);
44
48 esp_err_t add_sink(std::weak_ptr<ring_buffer::RingBuffer> &output_ring_buffer);
49
50#ifdef USE_SPEAKER
54 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
89
90 bool pause_output_{false};
91
94
95 std::unique_ptr<esp_audio_libs::resampler::Resampler> resampler_;
96};
97
98} // namespace esphome::audio
99
100#endif
AudioResamplerState resample(bool stop_gracefully, int32_t *ms_differential)
Resamples audio from the ring buffer source and writes to the sink.
std::unique_ptr< esp_audio_libs::resampler::Resampler > resampler_
esp_err_t add_source(std::weak_ptr< ring_buffer::RingBuffer > &input_ring_buffer)
Adds a source ring buffer for audio data.
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 input and output transfer buffers.
std::unique_ptr< AudioSourceTransferBuffer > input_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.
static void uint32_t