3 #include "AudioTools/AudioStreams.h"
4 #include "AudioTools/AudioOutput.h"
5 #include "AudioTools/Buffers.h"
6 #include "AudioBasic/Str.h"
7 #include "AudioCodecs/AudioEncoded.h"
13 enum class RecordType : uint8_t { Undefined, Begin, Send, Receive, End };
14 enum class AudioType : uint8_t { PCM, MP3, AAC, WAV, ADPC };
15 enum class TransmitRole : uint8_t { Sender, Receiver };
21 RecordType rec = RecordType::Undefined;
25 static uint16_t static_count = 0;
34 AudioType type = AudioType::PCM;
40 rec = RecordType::Send;
67 bool begin(
AudioInfo &info, AudioType type) {
73 int write_len =
sizeof(begin);
74 int len = p_dest->write((
const uint8_t *)&begin, write_len);
75 return len == write_len;
78 size_t write(
const uint8_t *data,
size_t len)
override {
82 while (written_len < len) {
83 int available_to_write = waitForRequest();
84 size_t to_write_len = DEFAULT_BUFFER_SIZE;
85 to_write_len = min(open_len, available_to_write);
87 send.size = to_write_len;
88 p_dest->write((
const uint8_t *)&send,
sizeof(send));
89 int w = p_dest->write(data + written_len, to_write_len);
96 int availableForWrite()
override {
return available_to_write; }
101 p_dest->write((
const uint8_t *)&end,
sizeof(end));
106 int available_to_write = 1024;
111 while (p_dest->available() < size) {
116 int waitForRequest() {
118 size_t rcv_len =
sizeof(rcv);
120 p_dest->readBytes((uint8_t *)&rcv, rcv_len);
136 bool isConfirmer =
true) {
139 is_confirmer = isConfirmer;
144 int header_size =
sizeof(header);
146 readBytes((uint8_t *)&header, header_size);
148 switch (header.rec) {
149 case RecordType::Begin:
152 case RecordType::End:
155 case RecordType::Send:
156 processed = receiveData();
168 size_t available = 0;
169 bool is_started =
false;
192 available = data.size;
196 if (data.seq > last_seq ||
197 (data.seq < max_gap && last_seq >= (32767 - max_gap))) {
198 uint8_t buffer[available];
199 p_in->readBytes((uint8_t *)buffer, available);
200 p_out->write((
const uint8_t *)buffer, available);
212 while (p_in->available() < size) {
219 req.size = p_out->availableForWrite();
221 p_in->write((
const uint8_t *)&req,
sizeof(req));
227 const static int header_size =
sizeof(header);
228 memcpy(data, &header, header_size);
229 int read_size = len - header_size;
231 readBytes((uint8_t *)data + header_size, read_size);