arduino-audio-tools
Loading...
Searching...
No Matches
URLStreamBufferedT.h
1#pragma once
2#include "AudioToolsConfig.h"
3#if defined(USE_CONCURRENCY)
4#include "AudioTools/AudioLibs/Concurrency.h"
5#include "AudioTools/Communication/HTTP/AbstractURLStream.h"
6#include "AudioTools/CoreAudio/BaseStream.h"
7
8#ifndef URL_STREAM_CORE
9#define URL_STREAM_CORE 0
10#endif
11
12#ifndef URL_STREAM_PRIORITY
13#define URL_STREAM_PRIORITY 2
14#endif
15
16#ifndef URL_STREAM_BUFFER_COUNT
17#define URL_STREAM_BUFFER_COUNT 10
18#endif
19
20#ifndef STACK_SIZE
21#define STACK_SIZE 30000
22#endif
23
24namespace audio_tools {
25
34 public:
35 BufferedTaskStream() { TRACEI(); };
36
38 TRACEI();
39 setInput(input);
40 }
41
43 TRACEI();
44 end();
45 }
46
48 void setBufferSize(int bufferSize, int bufferCount) {
49 buffers.resize(bufferSize, bufferCount);
50 }
51
52 virtual void begin(bool wait = true) {
53 TRACED();
54 active = true;
55 ready = false;
56 task.begin(std::bind(&BufferedTaskStream::processTask, this));
57 if (!wait) ready = true;
58 }
59
60 virtual void end() {
61 TRACED();
62 task.end();
63 active = false;
64 ready = false;
65 }
66
67 virtual void setInput(AudioStream &input) {
68 TRACED();
69 p_stream = &input;
70 }
71
73 virtual size_t write(uint8_t c) override { return 0; }
74
76 virtual size_t write(const uint8_t *data, size_t len) override { return 0; }
77
79 virtual void flush() override {}
80
82 virtual int read() override {
83 // if (!ready) return -1;
84 uint8_t result = 0;
85 if(!buffers.read(result)) return -1;
86 return result;
87 }
88
90 virtual int peek() override {
91 // if (!ready) return -1;
92 uint8_t result = 0;
93 if(!buffers.peek(result)) return -1;
94 return result;
95 };
96
98 virtual size_t readBytes(uint8_t *data, size_t len) override {
99 // if (!ready) return 0;
100 size_t result = 0;
101 result = buffers.readArray(data, len);
102 LOGD("%s: %zu -> %zu", LOG_METHOD, len, result);
103 return result;
104 }
105
107 virtual int available() override {
108 // if (!ready) return 0;
109 int result = 0;
110 result = buffers.available();
111 return result;
112 }
113
114 protected:
115 AudioStream *p_stream = nullptr;
116 bool active = false;
117 Task task{"BufferedTaskStream", STACK_SIZE, URL_STREAM_PRIORITY,
118 URL_STREAM_CORE};
119 SynchronizedNBuffer buffers{DEFAULT_BUFFER_SIZE, URL_STREAM_BUFFER_COUNT};
120 bool ready = false;
121
122 void processTask() {
123 size_t available_to_write = this->buffers.availableForWrite();
124 if (*(this->p_stream) && available_to_write > 0) {
125 size_t to_read = min(available_to_write, (size_t)512);
126 uint8_t buffer[to_read];
127 while (this->p_stream->available() == 0)
128 delay(3); // to avoid task WDT invoked while blocking read
129 size_t avail_read = this->p_stream->readBytes((uint8_t *)buffer, to_read);
130 size_t written = this->buffers.writeArray(buffer, avail_read);
131
132 if (written != avail_read) {
133 LOGE("DATA Lost! %zu reqested, %zu written!", avail_read, written);
134 }
135
136 } else {
137 // 3ms at 44100 stereo is about 529.2 bytes
138 delay(3);
139 }
140 // buffer is full we start to provide data
141 if (available_to_write == 0) {
142 this->ready = true;
143 }
144 }
145};
146
155template <class T>
157 public:
158 URLStreamBufferedT(int readBufferSize = DEFAULT_BUFFER_SIZE) {
159 TRACED();
160 urlStream.setReadBufferSize(readBufferSize);
161 taskStream.setInput(urlStream);
162 }
163
164 URLStreamBufferedT(const char *network, const char *password,
165 int readBufferSize = DEFAULT_BUFFER_SIZE) {
166 TRACED();
167 urlStream.setReadBufferSize(readBufferSize);
168 setSSID(network);
169 setPassword(password);
170 taskStream.setInput(urlStream);
171 }
172
173#ifdef ARDUINO
174
175 URLStreamBufferedT(Client &clientPar,
176 int readBufferSize = DEFAULT_BUFFER_SIZE) {
177 TRACED();
178 urlStream.setReadBufferSize(readBufferSize);
179 setClient(clientPar);
180 taskStream.setInput(urlStream);
181 }
182#endif
183
185 void setBufferSize(int bufferSize, int bufferCount) {
186 taskStream.setBufferSize(bufferSize, bufferCount);
187 }
188
189 bool begin(const char *urlStr, const char *acceptMime = nullptr,
190 MethodID action = GET, const char *reqMime = "",
191 const char *reqData = "") {
192 TRACED();
193 // start real stream
194 bool result = urlStream.begin(urlStr, acceptMime, action, reqMime, reqData);
195 // start buffer task
196 taskStream.begin();
197 return result;
198 }
199
200 virtual int available() { return taskStream.available(); }
201
202 virtual size_t readBytes(uint8_t *data, size_t len) {
203 size_t result = taskStream.readBytes(data, len);
204 LOGD("%s: %zu -> %zu", LOG_METHOD, len, result);
205 return result;
206 }
207
208 virtual int read() { return taskStream.read(); }
209
210 virtual int peek() { return taskStream.peek(); }
211
212 virtual void flush() {}
213
214 void end() {
215 TRACED();
216 taskStream.end();
217 urlStream.end();
218 }
219
221 void setSSID(const char *ssid) override { urlStream.setSSID(ssid); }
222
224 void setPassword(const char *password) override {
225 urlStream.setPassword(password);
226 }
227
229 void setPowerSave(bool ps) override { urlStream.setPowerSave(ps); }
230
232 void setCACert(const char *cert) { urlStream.setCACert(cert); }
233
235 void addRequestHeader(const char* key, const char* value) override {
236 urlStream.addRequestHeader(key, value);
237 }
239 const char* getReplyHeader(const char* key) override {
240 return urlStream.getReplyHeader(key);
241 }
242
244 HttpRequest &httpRequest() { return urlStream.httpRequest(); }
245
247 void setClient(Client &client) override { urlStream.setClient(client); }
248
250 void setConnectionClose(bool flag) override {
251 urlStream.setConnectionClose(flag);
252 }
253
255 const char* urlStr() override {
256 return urlStream.urlStr();
257 }
258
260 size_t totalRead() override {
261 return urlStream.totalRead();
262 }
263
265 int contentLength() override {
266 return urlStream.contentLength();
267 }
268
271 bool waitForData(int timeout) override {
272 return urlStream.waitForData(timeout);
273 }
274
275 protected:
276 BufferedTaskStream taskStream;
277 T urlStream;
278};
279
280} // namespace audio_tools
281
282#endif
Abstract Base class for all URLStream implementations.
Definition AbstractURLStream.h:17
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:122
virtual int readArray(T data[], int len)
reads multiple values
Definition Buffers.h:33
virtual int writeArray(const T data[], int len)
Fills the buffer data.
Definition Buffers.h:55
A FreeRTOS task is filling the buffer from the indicated stream. Only to be used on the ESP32.
Definition URLStreamBufferedT.h:33
virtual size_t write(const uint8_t *data, size_t len) override
Use this method: write an array.
Definition URLStreamBufferedT.h:76
void setBufferSize(int bufferSize, int bufferCount)
Define an explicit the buffer size in bytes.
Definition URLStreamBufferedT.h:48
virtual int read() override
reads a byte - to be avoided
Definition URLStreamBufferedT.h:82
virtual size_t readBytes(uint8_t *data, size_t len) override
Use this method !!
Definition URLStreamBufferedT.h:98
virtual int peek() override
peeks a byte - to be avoided
Definition URLStreamBufferedT.h:90
virtual size_t write(uint8_t c) override
writes a byte to the buffer
Definition URLStreamBufferedT.h:73
virtual void flush() override
empties the buffer
Definition URLStreamBufferedT.h:79
virtual int available() override
Returns the available bytes in the buffer: to be avoided.
Definition URLStreamBufferedT.h:107
Definition NoArduino.h:169
Simple API to process get, put, post, del http requests I tried to use Arduino HttpClient,...
Definition HttpRequest.h:25
bool peek(T &result) override
peeks the actual entry from the buffer
Definition Buffers.h:676
int available()
determines the available entries for the current read buffer
Definition Buffers.h:708
bool read(T &result) override
reads an entry from the buffer
Definition Buffers.h:670
int availableForWrite()
determines the available entries for the write buffer
Definition Buffers.h:726
bool resize(int bufferSize, int bufferCount)
Resize the buffers by defining a new buffer size and buffer count.
Definition SynchronizedNBufferRTOS.h:29
FreeRTOS task.
Definition Task.h:21
void end()
suspends the task
Definition Task.h:65
URLStream implementation for the ESP32 based on a separate FreeRTOS task: the.
Definition URLStreamBufferedT.h:156
size_t totalRead() override
Total amout of data that was consumed so far.
Definition URLStreamBufferedT.h:260
void setBufferSize(int bufferSize, int bufferCount)
Defines the buffer that holds the with encoded data.
Definition URLStreamBufferedT.h:185
bool waitForData(int timeout) override
Definition URLStreamBufferedT.h:271
HttpRequest & httpRequest()
provides access to the HttpRequest
Definition URLStreamBufferedT.h:244
void setPowerSave(bool ps) override
ESP32 only: PowerSave off (= default setting) is much faster.
Definition URLStreamBufferedT.h:229
void addRequestHeader(const char *key, const char *value) override
Adds/Updates a request header.
Definition URLStreamBufferedT.h:235
void setCACert(const char *cert)
Define the Root PEM Certificate for SSL.
Definition URLStreamBufferedT.h:232
void setSSID(const char *ssid) override
Sets the ssid that will be used for logging in (when calling begin)
Definition URLStreamBufferedT.h:221
const char * urlStr() override
Provides the url as string.
Definition URLStreamBufferedT.h:255
void setConnectionClose(bool flag) override
Add Connection: close to request header.
Definition URLStreamBufferedT.h:250
int contentLength() override
Provides the reported data size from the http reply.
Definition URLStreamBufferedT.h:265
void setClient(Client &client) override
(Re-)defines the client
Definition URLStreamBufferedT.h:247
void setPassword(const char *password) override
Sets the password that will be used for logging in (when calling begin)
Definition URLStreamBufferedT.h:224
const char * getReplyHeader(const char *key) override
Provides reply header info.
Definition URLStreamBufferedT.h:239
SynchronizedNBufferRTOS SynchronizedNBuffer
Default synchronized buffer alias <>
Definition SynchronizedNBufferRTOS.h:129
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10