38static const char*
RxTxModeNames[4] = {
"UNDEFINED_MODE",
"TX_MODE",
"RX_MODE",
64 uint8_t bitsPerSample) {
112 return sample_rate > 0 && sample_rate <= 192000 && channels > 0 &&
122 virtual void logInfo(
const char* source =
"") {
123 LOGI(
"%s sample_rate: %d / channels: %d / bits_per_sample: %d", source,
157 if (pos < 0)
return false;
178 n->setAudioInfo(info);
208 virtual size_t write(
const uint8_t* data,
size_t len) = 0;
211 virtual operator bool() = 0;
225 int result = out->
write(data + written, open);
239 static uint32_t
toTimeUs(uint32_t samplingRate, uint8_t limit = 10) {
240 uint32_t result = 1000000l / samplingRate;
241 if (1000000l % samplingRate != 0) {
244 if (result <= limit) {
245 LOGW(
"Time for samplingRate %u -> %u is < %u μs - we rounded up",
246 (
unsigned int)samplingRate, (
unsigned int)result,
247 (
unsigned int)limit);
260 static uint32_t
toTimeMs(uint32_t samplingRate, uint8_t limit = 1) {
261 uint32_t result = 1000l / samplingRate;
262 if (1000000l % samplingRate != 0) {
265 if (result <= limit) {
266 LOGW(
"Time for samplingRate %u -> %u is < %u μs - we rounded up",
267 (
unsigned int)samplingRate, (
unsigned int)result,
268 (
unsigned int)limit);
274 static float toRateUs(uint32_t time_us) {
return 1000000.0 / time_us; }
276 static float toRateMs(uint32_t time_ms) {
return 1000.0 / time_ms; }
287inline T
mapT(T x, T in_min, T in_max, T out_min, T out_max) {
288 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
298 static int64_t
maxValue(
int value_bits_per_sample) {
299 switch (value_bits_per_sample) {
313 template <
typename T>
319 return std::numeric_limits<T>::max();
325 template <
typename T>
331 return std::numeric_limits<T>::min();
338 template <
typename T>
340 float mv = maxValueT<T>();
343 }
else if (value < -mv) {
350 inline static int32_t
clip(
float value,
int bits) {
354 }
else if (value < -mv) {
361 template <
typename T>
363 return static_cast<float>(value) / maxValueT<T>();
367 template <
typename T>
369 return value * maxValueT<T>();
373 inline static float toFloat(int32_t value,
int bits) {
374 return static_cast<float>(value) /
maxValue(bits);
378 inline static int32_t
fromFloat(
float value,
int bits) {
383 template <
typename FromT,
typename ToT>
385 float value1 = value;
386 float minTo = minValueT<ToT>();
387 float maxTo = maxValueT<ToT>();
388 float maxFrom = maxValueT<FromT>();
389 float minFrom = minValueT<FromT>();
391 if (maxTo - minTo > 1.0f || maxFrom - minFrom > 1.0f) {
392 return mapT<float>(value1, minFrom, maxFrom, minTo, maxTo);
395 return value1 * maxValueT<ToT>() / maxValueT<FromT>();
399 template <
typename FromT,
typename ToT>
404 for (
int j = 0; j < samples; j++) {
405 ToT mapped = convert<FromT, ToT>(from[j]);
406 float scaled =
static_cast<float>(mapped) * vol;
407 to[j] = clipT<ToT>(scaled);
430 "I2S_PHILIPS_FORMAT",
431 "I2S_RIGHT_JUSTIFIED_FORMAT",
432 "I2S_LEFT_JUSTIFIED_FORMAT",
453 uint8_t* p_result = (uint8_t*)&result;
454 int open =
sizeof(T);
458 int read = p_stream->
readBytes(p_result + total, open);
468 int retryCount = -1) {
469 uint8_t* p_result = (uint8_t*)data;
470 int open = samples *
sizeof(T);
475 int read = p_stream->
readBytes(p_result + total, open);
485 if (retryCount >= 0 && count0 > retryCount)
break;
488 return total /
sizeof(T);
492template <
typename T,
class P>
493size_t writeDataT(P* p_out, T* data,
int samples,
int maxSamples = 512) {
494 uint8_t* p_result = (uint8_t*)data;
495 int open = samples *
sizeof(T);
499 int to_write = min(open,
static_cast<int>(maxSamples *
sizeof(T)));
500 int written = p_out->write(p_result + total, to_write);
505 return total /
sizeof(T);
510 return writeDataT<T, Print>(p_out, data, samples, maxSamples);
522inline void waitFor(
bool& flag) {
while (!flag); }
562 virtual const char*
mime() = 0;
587 virtual uint32_t
millis() { return ::millis(); }
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
virtual size_t readBytes(uint8_t *data, size_t len)
Definition Arduino.h:140
MemoryType
Memory types.
Definition AudioTypes.h:33
uint32_t sample_rate_t
Type alias for sample rate values.
Definition AudioTypes.h:19
void waitFor(bool &flag)
wait for flag to be active
Definition AudioTypes.h:522
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition AudioTypes.h:26
TimeUnit
Time Units.
Definition AudioTypes.h:44
@ RAM
Definition AudioTypes.h:33
@ PS_RAM
Definition AudioTypes.h:33
@ FLASH_RAM
Definition AudioTypes.h:33
@ RXTX_MODE
Definition AudioTypes.h:26
@ TX_MODE
Definition AudioTypes.h:26
@ UNDEFINED_MODE
Definition AudioTypes.h:26
@ RX_MODE
Definition AudioTypes.h:26
@ US
Definition AudioTypes.h:44
@ HZ
Definition AudioTypes.h:44
@ MS
Definition AudioTypes.h:44