3#include "AudioTools/CoreAudio/AudioStreams.h"
4#include "AudioTools/CoreAudio/AudioOutput.h"
5#include "AudioTools/CoreAudio/Buffers.h"
6#include "AudioTools/AudioCodecs/AudioEncoded.h"
12enum class RecordType : uint8_t { Undefined, Begin, Send, Receive, End };
13enum class AudioType : uint8_t { PCM, MP3, AAC, WAV, ADPC };
14enum class TransmitRole : uint8_t { Sender, Receiver };
20 RecordType rec = RecordType::Undefined;
33 AudioType type = AudioType::PCM;
39 rec = RecordType::Send;
66 bool begin(
AudioInfo &info, AudioType type) {
77 size_t write(
const uint8_t *data,
size_t len)
override {
82 int available_to_write = waitForRequest();
87 p_dest->write((
const uint8_t *)&send,
sizeof(send));
95 int availableForWrite()
override {
return available_to_write; }
100 p_dest->write((
const uint8_t *)&end,
sizeof(end));
105 int available_to_write = 1024;
110 while (p_dest->available() < size) {
115 int waitForRequest() {
143 int header_size =
sizeof(header);
145 readBytes((
uint8_t *)&header, header_size);
147 switch (header.rec) {
148 case RecordType::Begin:
151 case RecordType::End:
154 case RecordType::Send:
155 processed = receiveData();
167 size_t available = 0;
168 bool is_started =
false;
191 available = data.size;
195 if (data.seq > last_seq ||
198 p_in->readBytes((
uint8_t *)buffer, available);
199 p_out->write((
const uint8_t *)buffer, available);
211 while (p_in->available() < size) {
218 req.size = p_out->availableForWrite();
220 p_in->write((
const uint8_t *)&req,
sizeof(req));
226 static const int header_size =
sizeof(header);
227 memcpy(data, &header, header_size);
228 int read_size = len - header_size;
230 readBytes((
uint8_t *)data + header_size, read_size);