arduino-audio-tools
Loading...
Searching...
No Matches
SupportedRatesStream.h
Go to the documentation of this file.
1#pragma once
2
3#include <vector>
4
6
7namespace audio_tools {
8
20 public:
22
25
32
35
42
44 void setSupportedSampleRates(std::vector<int> rates) {
45 supported_rates = rates;
46 }
47
49 std::vector<int> &supportedSampleRates() { return supported_rates; }
50
52 void setOutput(Print &out) { resampler.setOutput(out); }
57 void setStream(Stream &io) {
58 p_source = &io;
60 }
64 p_source = &io;
66 }
67
68 bool begin() override { return begin(audioInfo()); }
69
70 bool begin(AudioInfo newInfo) {
71 setAudioInfo(newInfo);
72 return resampler.begin(newInfo);
73 }
74
75 void end() override { resampler.end(); }
76
77 void setAudioInfo(AudioInfo newInfo) override {
78 info = newInfo;
79 // pick the closest supported rate and resample to it
80 int target = closestSampleRate(newInfo.sample_rate);
81 // rate already supported: readBytes()/available() can bypass the
82 // resampler and its extra buffering, reading straight from the source
83 needs_resample = (target != newInfo.sample_rate);
85 resampler.setAudioInfo(newInfo);
87 }
88
90
91 size_t write(const uint8_t *data, size_t len) override {
92 return resampler.write(data, len);
93 }
94
95 size_t readBytes(uint8_t *data, size_t len) override {
96 if (!needs_resample && p_source != nullptr) {
97 return p_source->readBytes(data, len);
98 }
99 return resampler.readBytes(data, len);
100 }
101
102 // available() must take the same bypass path as readBytes(): the
103 // resampler's available() pulls bytes from the source into its own
104 // queue as a side effect, which would silently steal data from a
105 // readBytes() call that bypasses the resampler.
106 int available() override {
107 if (!needs_resample && p_source != nullptr) {
108 return p_source->available();
109 }
110 return resampler.available();
111 }
112
113 int availableForWrite() override { return resampler.availableForWrite(); }
114
115 void flush() override { resampler.flush(); }
116
117 protected:
119 Stream *p_source = nullptr;
120 std::vector<int> supported_rates;
121 bool needs_resample = true;
122
124 int closestSampleRate(int rate) {
125 if (supported_rates.empty()) return rate;
126 int result = supported_rates[0];
127 long min_diff = labs((long)rate - (long)result);
128 for (int candidate : supported_rates) {
129 long diff = labs((long)rate - (long)candidate);
130 if (diff < min_diff) {
131 min_diff = diff;
132 result = candidate;
133 }
134 }
135 return result;
136 }
137};
138
139} // namespace audio_tools
Definition Arduino.h:56
Definition Arduino.h:136
virtual size_t readBytes(uint8_t *data, size_t len)
Definition Arduino.h:140
virtual int available()
Definition Arduino.h:139
void notifyAudioChange(AudioInfo info)
Definition AudioTypes.h:175
Abstract Audio Ouptut class.
Definition AudioOutput.h:25
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition AudioOutput.h:62
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:120
AudioInfo info
Definition BaseStream.h:171
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition BaseStream.h:151
virtual void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioIO.h:270
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioIO.h:299
void end() override
Definition AudioIO.h:321
int available() override
Definition AudioIO.h:304
virtual void setOutput(AudioOutput &print)
Defines/Changes the output target and registers for audio change notifications.
Definition AudioIO.h:284
int availableForWrite() override
Definition AudioIO.h:308
Dynamic Resampling. We can use a variable factor to speed up or slow down the playback.
Definition ResampleStream.h:33
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition ResampleStream.h:133
void setTargetSampleRate(int rate)
Definition ResampleStream.h:162
size_t write(const uint8_t *data, size_t len) override
Definition ResampleStream.h:175
bool begin(ResampleConfig cfg)
Definition ResampleStream.h:63
AudioInfo audioInfoOut() override
Definition ResampleStream.h:143
void flush()
When buffering is active, writes the buffered audio to the output.
Definition ResampleStream.h:245
Resampling stream that is restricted to a fixed list of supported sample rates (e....
Definition SupportedRatesStream.h:19
std::vector< int > supported_rates
Definition SupportedRatesStream.h:120
void flush() override
Definition SupportedRatesStream.h:115
void setStream(AudioStream &io)
Definition SupportedRatesStream.h:63
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition SupportedRatesStream.h:77
int closestSampleRate(int rate)
Determines the supported sample rate closest to the requested rate.
Definition SupportedRatesStream.h:124
SupportedRatesStream(AudioStream &io)
Definition SupportedRatesStream.h:38
SupportedRatesStream(Print &out)
Support for resampling via write.
Definition SupportedRatesStream.h:24
void setOutput(AudioOutput &out)
Definition SupportedRatesStream.h:55
Stream * p_source
Definition SupportedRatesStream.h:119
size_t readBytes(uint8_t *data, size_t len) override
Definition SupportedRatesStream.h:95
void setSupportedSampleRates(std::vector< int > rates)
Defines the list of sample rates that the downstream consumer supports.
Definition SupportedRatesStream.h:44
SupportedRatesStream(AudioOutput &out)
Definition SupportedRatesStream.h:28
void end() override
Definition SupportedRatesStream.h:75
std::vector< int > & supportedSampleRates()
Provides the list of supported sample rates.
Definition SupportedRatesStream.h:49
int available() override
Definition SupportedRatesStream.h:106
size_t write(const uint8_t *data, size_t len) override
Definition SupportedRatesStream.h:91
SupportedRatesStream(Stream &io)
Support for resampling via write and read.
Definition SupportedRatesStream.h:34
int availableForWrite() override
Definition SupportedRatesStream.h:113
bool begin(AudioInfo newInfo)
Definition SupportedRatesStream.h:70
AudioInfo audioInfoOut() override
Definition SupportedRatesStream.h:89
bool needs_resample
Definition SupportedRatesStream.h:121
ResampleStream resampler
Definition SupportedRatesStream.h:118
bool begin() override
Definition SupportedRatesStream.h:68
void setStream(Stream &io)
Defines/Changes the input & output.
Definition SupportedRatesStream.h:57
void setOutput(Print &out)
Defines/Changes the output target.
Definition SupportedRatesStream.h:52
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:51
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:53