arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
DynamicResamplingQueueStream.h
1#pragma once
2
3#include "AudioTools/AudioLibs/PIDController.h"
4#include "AudioTools/CoreAudio/AudioBasic/MovingAverage.h"
5#include "AudioTools/CoreAudio/AudioStreams.h"
6#include "AudioTools/CoreAudio/ResampleStream.h"
7
8namespace audio_tools {
22 public:
24 float stepRangePercent = 0.05) {
25 p_buffer = &buffer;
26 setStepRangePercent(stepRangePercent);
27 addNotifyAudioChange(resample_stream);
28 }
29
30 bool begin() {
31 if (p_buffer == nullptr) return false;
32 queue_stream.setBuffer(*p_buffer);
33 queue_stream.begin();
34 resample_stream.setAudioInfo(audioInfo());
35 resample_stream.setStream(queue_stream);
36 resample_stream.begin(audioInfo());
37 float from_step = 1.0 - resample_range;
38 float to_step = 1.0 + resample_range;
39 return pid.begin(1.0, from_step, to_step, p, i, d);
40 }
41
43 size_t write(const uint8_t* data, size_t len) override {
44 if (p_buffer == 0) return 0;
45 return p_buffer->writeArray(data, len);
46 }
47
48 void end() {
49 queue_stream.end();
50 resample_stream.end();
51 }
52
54 size_t readBytes(uint8_t* data, size_t len) override {
55 if (p_buffer->available() == 0) return 0;
56
57 // calculate new resampling step size
58 moving_average_level_percent.add(p_buffer->levelPercent());
59 step_size = pid.calculate(50.0, moving_average_level_percent.average());
60
61 // log step size every 10th read
62 if (read_count++ % 10 == 0) {
63 LOGI("step_size: %f", step_size);
64 }
65
66 // return resampled result
67 resample_stream.setStepSize(step_size);
68 return resample_stream.readBytes(data, len);
69 }
70
73 void setMovingAvgCount(int size) {
74 moving_average_level_percent.setSize(size);
75 }
76
79 void setStepRangePercent(float rangePercent) {
80 resample_range = rangePercent / 100.0;
81 }
82
84 void setPIDParameters(float p_value, float i_value, float d_value) {
85 p = p_value;
86 i = i_value;
87 d = d_value;
88 }
89
90 protected:
91 PIDController pid; // p=0.005, i=0.00005, d=0.0001
92 QueueStream<uint8_t> queue_stream;
93 BaseBuffer<uint8_t>* p_buffer = nullptr;
94 MovingAverage<float> moving_average_level_percent{50};
95 ResampleStream resample_stream;
96 float step_size = 1.0;
97 float resample_range = 0;
98 float p = 0.005;
99 float i = 0.00005;
100 float d = 0.0001;
101 uint32_t read_count = 0;
102};
103
104} // namespace audio_tools
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition AudioTypes.h:151
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:119
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition BaseStream.h:150
Shared functionality of all buffers.
Definition Buffers.h:22
virtual int writeArray(const T data[], int len)
Fills the buffer data.
Definition Buffers.h:55
virtual float levelPercent()
Returns the level of the buffer in %.
Definition Buffers.h:109
virtual int available()=0
provides the number of entries that are available to read
An Audio Stream backed by a buffer (queue) which tries to correct jitter and automatically adjusts fo...
Definition DynamicResamplingQueueStream.h:21
void setStepRangePercent(float rangePercent)
Definition DynamicResamplingQueueStream.h:79
void setPIDParameters(float p_value, float i_value, float d_value)
Define the PID parameters.
Definition DynamicResamplingQueueStream.h:84
size_t readBytes(uint8_t *data, size_t len) override
Read resampled data from the buffer.
Definition DynamicResamplingQueueStream.h:54
void setMovingAvgCount(int size)
Definition DynamicResamplingQueueStream.h:73
size_t write(const uint8_t *data, size_t len) override
Fill the buffer.
Definition DynamicResamplingQueueStream.h:43
Caclulates the moving average of a number of values.
Definition MovingAverage.h:14
void setSize(size_t size)
Defines the number of values.
Definition MovingAverage.h:36
A simple header only PID Controller.
Definition PIDController.h:15
Stream class which stores the data in a temporary queue buffer. The queue can be consumed e....
Definition BaseStream.h:308
virtual bool begin() override
Activates the output.
Definition BaseStream.h:336
virtual void end() override
stops the processing
Definition BaseStream.h:355
virtual void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioIO.h:158
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition ResampleStream.h:123
void setStepSize(float step)
influence the sample rate
Definition ResampleStream.h:144
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10