4#include "AudioTools/CoreAudio/AudioBasic/Collections/Vector.h"
16 uint8_t *data =
nullptr;
25enum class OSCCompare { Matches, Equals, StartsWith, EndsWith, Contains };
62 binary_content.data =
data;
63 binary_content.len = maxlen;
69 memset(binary_content.data, 0, adr_len);
70 strcpy((
char *)binary_content.data, address);
77 memset(binary_content.data + write_pos, 0, fmt_len);
78 binary_content.data[write_pos] =
',';
79 read_format_start = binary_content.data + write_pos + 1;
80 strcpy((
char *)read_format_start, format);
82 read_data = binary_content.data + write_pos;
87 int32_t number_net = htonl(number);
88 if (write_pos +
sizeof(int32_t) > binary_content.len) {
91 memcpy(binary_content.data + write_pos, &number_net,
sizeof(int32_t));
92 write_pos +=
sizeof(int32_t);
98 if (write_pos +
sizeof(int64_t) > binary_content.len) {
101 int64_t number_net = htonll(number);
102 memcpy(binary_content.data + write_pos, &number_net,
sizeof(int64_t));
103 write_pos +=
sizeof(int64_t);
110 bool write(
unsigned long number) {
return write((uint64_t)number); }
116 if (write_pos +
sizeof(uint64_t) > binary_content.len) {
119 uint64_t number_net = htonll(number);
120 memcpy(binary_content.data + write_pos, &number_net,
sizeof(uint64_t));
121 write_pos +=
sizeof(uint64_t);
131 if (write_pos + str_len > binary_content.len) {
134 memset(binary_content.data + write_pos, 0, str_len);
135 strcpy((
char *)binary_content.data + write_pos, str);
136 write_pos += str_len;
144 bool write(
const uint8_t *dataArg,
int len) {
146 if (write_pos +
size > binary_content.len) {
149 memset(binary_content.data + write_pos, 0,
size);
150 int32_t len_net = htonl(len);
151 memcpy((binary_content.data + write_pos), &len_net,
sizeof(int32_t));
152 memcpy((binary_content.data + write_pos +
sizeof(int32_t)), dataArg, len);
144 bool write(
const uint8_t *dataArg,
int len) {
…}
160 read_format_start =
nullptr;
162 binary_content.data =
nullptr;
163 binary_content.len = 0;
169 uint8_t *
data() {
return binary_content.data; }
172 int size() {
return write_pos; }
177 binary_content.data =
data;
178 binary_content.len = len;
184 if (is_log_active) logMsg(
data, 20);
186 if (
data[0] !=
'/')
return false;
192 read_format_start = (uint8_t *)
getAddress() + addr_len;
195 if (*read_format_start !=
',') {
203 read_data = read_format_start + format_len;
209 if (callbacks.size() > 0) {
210 for (
auto &cb : callbacks) {
211 if (compare(cb.compare, cb.address,
getAddress())) {
212 if (cb.callback !=
nullptr) {
213 if (cb.callback(*
this, reference)) {
226 void logMsg(uint8_t *
data,
int len) {
227 Serial.print(
"OSCData: ");
228 for (
int i = 0; i < len; i++) {
229 Serial.print((
char)
data[i]);
233 Serial.print(
"Hex Data: ");
234 for (
int i = 0; i < len; i++) {
235 Serial.print(
data[i], HEX);
242 const char *
getAddress() {
return (
const char *)binary_content.data; }
245 const char *
getFormat() {
return (
const char *)read_format_start; }
250 return *((
float *)&number);
256 memcpy(&number, read_data,
sizeof(int32_t));
257 read_data +=
sizeof(int32_t);
258 return ntohl(number);
264 memcpy(&number, read_data,
sizeof(int64_t));
265 read_data +=
sizeof(int64_t);
266 return ntohll(number);
275 return *((
double *)&number);
280 const char *str = (
const char *)read_data;
282 read_data += str_len;
290 memcpy(&len, read_data,
sizeof(int32_t));
291 result.len = ntohl(len);
292 result.data = read_data +
sizeof(int32_t);
306 if (len % 4 == 0)
return len;
307 int padding = 4 - (len % 4);
308 return len + padding;
339 OSCCompare compare = OSCCompare::Matches) {
340 if (address ==
nullptr || callback ==
nullptr)
return false;
343 for (
auto &cb : callbacks) {
344 if (cb.address !=
nullptr && strcmp(cb.address, address) == 0) {
345 cb.callback = callback;
346 cb.compare = compare;
352 cb.address = address;
353 cb.callback = callback;
354 callbacks.push_back(cb);
360 uint8_t *read_format_start =
nullptr;
361 uint8_t *read_data =
nullptr;
362 bool is_log_active =
false;
364 void *reference =
nullptr;
367 const char *address =
nullptr;
368 bool (*callback)(
OSCData &
data,
void *ref) =
nullptr;
373 bool compare(OSCCompare compare,
const char *strRef,
const char *strCompare) {
375 case OSCCompare::Matches:
377 case OSCCompare::Equals:
379 case OSCCompare::StartsWith:
381 case OSCCompare::EndsWith:
383 case OSCCompare::Contains:
389 uint8_t *getEnd() {
return binary_content.data + binary_content.len; }