arduino-audio-tools
Loading...
Searching...
No Matches
AudioSync.h
Go to the documentation of this file.
1
2#pragma once
7
8
9namespace audio_tools {
10
11
13enum class AudioType : uint8_t { PCM, MP3, AAC, WAV, ADPC };
15
18 AudioHeader() = default;
19 uint8_t app = 123;
22 // record counter
23 void increment() {
24 static uint16_t static_count = 0;
25 seq = static_count++;
26 }
27};
28
35
43
49
54
55
63 public:
65
66 bool begin(AudioInfo &info, AudioType type) {
67 is_sync = true;
69 begin.info = info;
70 begin.type = type;
71 begin.increment();
72 int write_len = sizeof(begin);
73 int len = p_dest->write((const uint8_t *)&begin, write_len);
74 return len == write_len;
75 }
76
77 size_t write(const uint8_t *data, size_t len) override {
78 int written_len = 0;
79 int open_len = len;
80 AudioSendData send;
81 while (written_len < len) {
85 send.increment();
86 send.size = to_write_len;
87 p_dest->write((const uint8_t *)&send, sizeof(send));
88 int w = p_dest->write(data + written_len, to_write_len);
89 written_len += w;
90 open_len -= w;
91 }
92 return written_len;
93 }
94
95 int availableForWrite() override { return available_to_write; }
96
97 void end() {
99 end.increment();
100 p_dest->write((const uint8_t *)&end, sizeof(end));
101 }
102
103 protected:
107
109 void waitFor(int size) {
110 while (p_dest->available() < size) {
111 delay(10);
112 }
113 }
114
117 size_t rcv_len = sizeof(rcv);
120 return rcv.size;
121 }
122};
123
133 public:
135 bool isConfirmer = true) {
136 p_in = &in;
137 p_out = &out;
139 }
140
141 size_t copy() {
142 int processed = 0;
143 int header_size = sizeof(header);
144 waitFor(header_size);
145 readBytes((uint8_t *)&header, header_size);
146
147 switch (header.rec) {
150 break;
151 case RecordType::End:
152 audioDataEnd();
153 break;
154 case RecordType::Send:
155 processed = receiveData();
156 break;
157 }
158 return processed;
159 }
160
161 protected:
167 size_t available = 0; // initial value
168 bool is_started = false;
170 int last_seq = 0;
171
174 readProtocol(&begin, sizeof(begin));
175 p_out->begin();
177 requestData();
178 }
179
183 readProtocol(&end, sizeof(end));
184 p_out->end();
185 }
186
187 // Receives audio data
189 AudioSendData data;
190 readProtocol(&data, sizeof(data));
191 available = data.size;
192 // receive and process audio data
194 int max_gap = 10;
195 if (data.seq > last_seq ||
196 (data.seq < max_gap && last_seq >= (32767 - max_gap))) {
197 uint8_t buffer[available];
198 p_in->readBytes((uint8_t *)buffer, available);
199 p_out->write((const uint8_t *)buffer, available);
200 // only one reader should be used as confirmer
201 if (is_confirmer) {
202 requestData();
203 }
204 last_seq = data.seq;
205 }
206 return available;
207 }
208
210 void waitFor(int size) {
211 while (p_in->available() < size) {
212 delay(10);
213 }
214 }
215
217 void requestData() {
219 req.increment();
220 p_in->write((const uint8_t *)&req, sizeof(req));
221 p_in->flush();
222 }
223
225 void readProtocol(AudioHeader *data, int len) {
226 static const int header_size = sizeof(header);
227 memcpy(data, &header, header_size);
228 int read_size = len - header_size;
229 waitFor(read_size);
230 readBytes((uint8_t *)data + header_size, read_size);
231 }
232};
233
234} // namespace audio_tools
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
Abstract Audio Ouptut class.
Definition AudioOutput.h:25
virtual bool begin()
Definition AudioOutput.h:78
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
Receving Audio Data over the wire and requesting for more data when done to synchronize the processin...
Definition AudioSync.h:132
void audioDataEnd()
Ends the processing.
Definition AudioSync.h:181
void audioDataBegin()
Starts the processing.
Definition AudioSync.h:173
int receiveData()
Definition AudioSync.h:188
Stream * p_in
Definition AudioSync.h:162
void waitFor(int size)
Waits for the data to be available.
Definition AudioSync.h:210
void readProtocol(AudioHeader *data, int len)
Reads the protocol record.
Definition AudioSync.h:225
size_t available
Definition AudioSync.h:167
bool is_started
Definition AudioSync.h:168
AudioHeader header
Definition AudioSync.h:165
void requestData()
Request new data from writer.
Definition AudioSync.h:217
int last_seq
Definition AudioSync.h:170
AudioSyncReader(Stream &in, EncodedAudioStream &out, bool isConfirmer=true)
Definition AudioSync.h:134
bool is_confirmer
Definition AudioSync.h:169
AudioDataBegin begin
Definition AudioSync.h:166
size_t copy()
Definition AudioSync.h:141
EncodedAudioStream * p_out
Definition AudioSync.h:163
AudioConfirmDataToReceive req
Definition AudioSync.h:164
Audio Writer which is synchronizing the amount of data that can be processed with the AudioReceiver.
Definition AudioSync.h:62
void waitFor(int size)
Waits for the data to be available.
Definition AudioSync.h:109
int available_to_write
Definition AudioSync.h:105
size_t write(const uint8_t *data, size_t len) override
Definition AudioSync.h:77
Stream * p_dest
Definition AudioSync.h:104
int availableForWrite() override
Definition AudioSync.h:95
int waitForRequest()
Definition AudioSync.h:115
bool is_sync
Definition AudioSync.h:106
void end()
Definition AudioSync.h:97
AudioSyncWriter(Stream &dest)
Definition AudioSync.h:64
bool begin(AudioInfo &info, AudioType type)
Definition AudioSync.h:66
virtual void end()
Definition BaseStream.h:44
A more natural Stream class to process encoded data (aac, wav, mp3...) which also supports the decodi...
Definition AudioEncoded.h:271
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioEncoded.h:406
void end() override
Definition AudioEncoded.h:366
size_t write(const uint8_t *data, size_t len) override
Definition AudioEncoded.h:373
int availableForWrite() override
Definition AudioEncoded.h:371
bool begin(AudioInfo info)
Definition AudioEncoded.h:353
virtual size_t write(const uint8_t *data, size_t len)
Definition NoArduino.h:126
virtual void flush()
Definition NoArduino.h:136
Definition NoArduino.h:142
virtual size_t readBytes(uint8_t *data, size_t len)
Definition NoArduino.h:147
virtual int available()
Definition NoArduino.h:146
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
AudioType
Definition AudioSync.h:13
TransmitRole
Definition AudioSync.h:14
void delay(unsigned long ms)
Definition Time.h:23
RecordType
Definition AudioSync.h:12
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512
Protocol Record for Request.
Definition AudioSync.h:45
AudioConfirmDataToReceive()
Definition AudioSync.h:46
uint16_t size
Definition AudioSync.h:47
Protocal Record To Start.
Definition AudioSync.h:30
AudioInfo info
Definition AudioSync.h:32
AudioType type
Definition AudioSync.h:33
AudioDataBegin()
Definition AudioSync.h:31
Protocol Record for End.
Definition AudioSync.h:51
AudioDataEnd()
Definition AudioSync.h:52
Common Header for all records.
Definition AudioSync.h:17
uint16_t seq
Definition AudioSync.h:21
uint8_t app
Definition AudioSync.h:19
RecordType rec
Definition AudioSync.h:20
void increment()
Definition AudioSync.h:23
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:55
Protocol Record for Data.
Definition AudioSync.h:37
AudioSendData()
Definition AudioSync.h:38
uint16_t size
Definition AudioSync.h:41