arduino-audio-tools
Loading...
Searching...
No Matches
URLStreamBufferedT.h
Go to the documentation of this file.
1#pragma once
2#include "AudioToolsConfig.h"
3#if defined(USE_CONCURRENCY)
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:
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;
57 if (!wait) ready = true;
58 }
59
60 virtual void end() {
61 TRACED();
62 task.end();
63 buffers.clear();
64 active = false;
65 ready = false;
66 }
67
68 virtual void setInput(AudioStream &input) {
69 TRACED();
70 p_stream = &input;
71 }
72
74 virtual size_t write(uint8_t c) override { return 0; }
75
77 virtual size_t write(const uint8_t *data, size_t len) override { return 0; }
78
80 virtual void flush() override {}
81
83 virtual int read() override {
84 // if (!ready) return -1;
85 uint8_t result = 0;
86 if(!buffers.read(result)) return -1;
87 return result;
88 }
89
91 virtual int peek() override {
92 // if (!ready) return -1;
93 uint8_t result = 0;
94 if(!buffers.peek(result)) return -1;
95 return result;
96 };
97
99 virtual size_t readBytes(uint8_t *data, size_t len) override {
100 // if (!ready) return 0;
101 size_t result = 0;
102 result = buffers.readArray(data, len);
103 LOGD("%s: %zu -> %zu", LOG_METHOD, len, result);
104 return result;
105 }
106
108 virtual int available() override {
109 // if (!ready) return 0;
110 int result = 0;
111 result = buffers.available();
112 return result;
113 }
114
116 void clear() {
117 buffers.clear();
118 }
119
120 protected:
122 bool active = false;
126 bool ready = false;
127
128 void processTask() {
129 size_t available_to_write = this->buffers.availableForWrite();
130 if (*(this->p_stream) && available_to_write > 0) {
131 size_t to_read = min(available_to_write, (size_t)512);
132 uint8_t buffer[to_read];
133 while (this->p_stream->available() == 0)
134 delay(3); // to avoid task WDT invoked while blocking read
135 size_t avail_read = this->p_stream->readBytes((uint8_t *)buffer, to_read);
136 size_t written = this->buffers.writeArray(buffer, avail_read);
137
138 if (written != avail_read) {
139 LOGE("DATA Lost! %zu reqested, %zu written!", avail_read, written);
140 }
141
142 } else {
143 // 3ms at 44100 stereo is about 529.2 bytes
144 delay(3);
145 }
146 // buffer is full we start to provide data
147 if (available_to_write == 0) {
148 this->ready = true;
149 }
150 }
151};
152
161template <class T>
163 public:
169
170 URLStreamBufferedT(const char *network, const char *password,
172 TRACED();
173 urlStream.setReadBufferSize(readBufferSize);
174 setSSID(network);
175 setPassword(password);
177 }
178
179#ifdef ARDUINO
180
183 TRACED();
184 urlStream.setReadBufferSize(readBufferSize);
187 }
188#endif
189
191 void setBufferSize(int bufferSize, int bufferCount) {
192 taskStream.setBufferSize(bufferSize, bufferCount);
193 }
194
195 bool begin(const char *urlStr, const char *acceptMime = nullptr,
196 MethodID action = GET, const char *reqMime = "",
197 const char *reqData = "") {
198 TRACED();
199 // start real stream
200 bool result = urlStream.begin(urlStr, acceptMime, action, reqMime, reqData);
201 // start buffer task
203 return result;
204 }
205
206 virtual int available() { return taskStream.available(); }
207
208 virtual size_t readBytes(uint8_t *data, size_t len) {
209 size_t result = taskStream.readBytes(data, len);
210 LOGD("%s: %zu -> %zu", LOG_METHOD, len, result);
211 return result;
212 }
213
214 virtual int read() { return taskStream.read(); }
215
216 virtual int peek() { return taskStream.peek(); }
217
218 virtual void flush() {}
219
220 void end() {
221 TRACED();
222 taskStream.end();
223 urlStream.end();
224 }
225
227 void setSSID(const char *ssid) override { urlStream.setSSID(ssid); }
228
230 void setPassword(const char *password) override {
231 urlStream.setPassword(password);
232 }
233
235 void setPowerSave(bool ps) override { urlStream.setPowerSave(ps); }
236
238 void setCACert(const char *cert) { urlStream.setCACert(cert); }
239
241 void addRequestHeader(const char* key, const char* value) override {
242 urlStream.addRequestHeader(key, value);
243 }
245 const char* getReplyHeader(const char* key) override {
246 return urlStream.getReplyHeader(key);
247 }
248
250 HttpRequest &httpRequest() { return urlStream.httpRequest(); }
251
253 void setClient(Client &client) override { urlStream.setClient(client); }
254
256 void setConnectionClose(bool flag) override {
257 urlStream.setConnectionClose(flag);
258 }
259
261 const char* urlStr() override {
262 return urlStream.urlStr();
263 }
264
266 size_t totalRead() override {
267 return urlStream.totalRead();
268 }
269
271 int contentLength() override {
272 return urlStream.contentLength();
273 }
274
277 bool waitForData(int timeout) override {
278 return urlStream.waitForData(timeout);
279 }
280
282 void clear() {
284 }
285
286 protected:
289};
290
291} // namespace audio_tools
292
293#endif
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define LOG_METHOD
Definition AudioToolsConfig.h:64
MethodID
supported http methods
Definition HttpTypes.h:3
@ GET
Definition HttpTypes.h:5
#define STACK_SIZE
Definition URLStreamBufferedT.h:21
#define URL_STREAM_BUFFER_COUNT
Definition URLStreamBufferedT.h:17
#define URL_STREAM_PRIORITY
Definition URLStreamBufferedT.h:13
#define URL_STREAM_CORE
Definition URLStreamBufferedT.h:9
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
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:123
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition BaseStream.h:147
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
void clear()
same as reset
Definition Buffers.h:95
virtual int available() override
Definition BaseStream.h:58
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:77
bool active
Definition URLStreamBufferedT.h:122
~BufferedTaskStream()
Definition URLStreamBufferedT.h:42
BufferedTaskStream(AudioStream &input)
Definition URLStreamBufferedT.h:37
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:83
SynchronizedNBuffer buffers
Definition URLStreamBufferedT.h:125
BufferedTaskStream()
Definition URLStreamBufferedT.h:35
virtual size_t readBytes(uint8_t *data, size_t len) override
Use this method !!
Definition URLStreamBufferedT.h:99
bool ready
Definition URLStreamBufferedT.h:126
void processTask()
Definition URLStreamBufferedT.h:128
Task task
Definition URLStreamBufferedT.h:123
AudioStream * p_stream
Definition URLStreamBufferedT.h:121
virtual int peek() override
peeks a byte - to be avoided
Definition URLStreamBufferedT.h:91
virtual size_t write(uint8_t c) override
writes a byte to the buffer
Definition URLStreamBufferedT.h:74
void clear()
Clears the buffer.
Definition URLStreamBufferedT.h:116
virtual void end()
Definition URLStreamBufferedT.h:60
virtual void setInput(AudioStream &input)
Definition URLStreamBufferedT.h:68
virtual void flush() override
empties the buffer
Definition URLStreamBufferedT.h:80
virtual int available() override
Returns the available bytes in the buffer: to be avoided.
Definition URLStreamBufferedT.h:108
virtual void begin(bool wait=true)
Definition URLStreamBufferedT.h:52
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
NBuffer which uses some RTOS queues to manage the available and filled buffers.
Definition SynchronizedNBufferRTOS.h:17
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
bool begin(std::function< void()> process)
Definition Task.h:57
URLStream implementation for the ESP32 based on a separate FreeRTOS task: the.
Definition URLStreamBufferedT.h:162
URLStreamBufferedT(int readBufferSize=DEFAULT_BUFFER_SIZE)
Definition URLStreamBufferedT.h:164
size_t totalRead() override
Total amout of data that was consumed so far.
Definition URLStreamBufferedT.h:266
virtual size_t readBytes(uint8_t *data, size_t len)
Definition URLStreamBufferedT.h:208
void setBufferSize(int bufferSize, int bufferCount)
Defines the buffer that holds the with encoded data.
Definition URLStreamBufferedT.h:191
T urlStream
Definition URLStreamBufferedT.h:288
bool waitForData(int timeout) override
Definition URLStreamBufferedT.h:277
virtual int available()
Definition URLStreamBufferedT.h:206
HttpRequest & httpRequest()
provides access to the HttpRequest
Definition URLStreamBufferedT.h:250
URLStreamBufferedT(const char *network, const char *password, int readBufferSize=DEFAULT_BUFFER_SIZE)
Definition URLStreamBufferedT.h:170
void setPowerSave(bool ps) override
ESP32 only: PowerSave off (= default setting) is much faster.
Definition URLStreamBufferedT.h:235
virtual int read()
Definition URLStreamBufferedT.h:214
void addRequestHeader(const char *key, const char *value) override
Adds/Updates a request header.
Definition URLStreamBufferedT.h:241
bool begin(const char *urlStr, const char *acceptMime=nullptr, MethodID action=GET, const char *reqMime="", const char *reqData="")
Definition URLStreamBufferedT.h:195
void setCACert(const char *cert)
Define the Root PEM Certificate for SSL.
Definition URLStreamBufferedT.h:238
void setSSID(const char *ssid) override
Sets the ssid that will be used for logging in (when calling begin)
Definition URLStreamBufferedT.h:227
void end()
Definition URLStreamBufferedT.h:220
const char * urlStr() override
Provides the url as string.
Definition URLStreamBufferedT.h:261
void setConnectionClose(bool flag) override
Add Connection: close to request header.
Definition URLStreamBufferedT.h:256
BufferedTaskStream taskStream
Definition URLStreamBufferedT.h:287
void clear()
Clears the buffer.
Definition URLStreamBufferedT.h:282
int contentLength() override
Provides the reported data size from the http reply.
Definition URLStreamBufferedT.h:271
virtual void flush()
Definition URLStreamBufferedT.h:218
void setClient(Client &client) override
(Re-)defines the client
Definition URLStreamBufferedT.h:253
void setPassword(const char *password) override
Sets the password that will be used for logging in (when calling begin)
Definition URLStreamBufferedT.h:230
virtual int peek()
Definition URLStreamBufferedT.h:216
const char * getReplyHeader(const char *key) override
Provides reply header info.
Definition URLStreamBufferedT.h:245
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
void delay(unsigned long ms)
Definition Time.h:23
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512