38static const char*
RxTxModeNames[4] = {
"UNDEFINED_MODE",
"TX_MODE",
"RX_MODE",
64 uint8_t bitsPerSample) {
112 return sample_rate > 0 && sample_rate <= 100000 && channels > 0 && channels < 20 && bits_per_sample > 0 &&
bits_per_sample <= 64;
121 virtual void logInfo(
const char* source =
"") {
122 LOGI(
"%s sample_rate: %d / channels: %d / bits_per_sample: %d", source,
156 if (pos < 0)
return false;
177 n->setAudioInfo(info);
207 virtual size_t write(
const uint8_t* data,
size_t len) = 0;
210 virtual operator bool() = 0;
224 int result = out->
write(data + written, open);
238 static uint32_t
toTimeUs(uint32_t samplingRate, uint8_t limit = 10) {
239 uint32_t result = 1000000l / samplingRate;
240 if (1000000l % samplingRate != 0) {
243 if (result <= limit) {
244 LOGW(
"Time for samplingRate %u -> %u is < %u μs - we rounded up",
245 (
unsigned int)samplingRate, (
unsigned int)result,
246 (
unsigned int)limit);
259 static uint32_t
toTimeMs(uint32_t samplingRate, uint8_t limit = 1) {
260 uint32_t result = 1000l / samplingRate;
261 if (1000000l % samplingRate != 0) {
264 if (result <= limit) {
265 LOGW(
"Time for samplingRate %u -> %u is < %u μs - we rounded up",
266 (
unsigned int)samplingRate, (
unsigned int)result,
267 (
unsigned int)limit);
273 static float toRateUs(uint32_t time_us) {
return 1000000.0 / time_us; }
275 static float toRateMs(uint32_t time_ms) {
return 1000.0 / time_ms; }
286inline T
mapT(T x, T in_min, T in_max, T out_min, T out_max) {
287 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
297 static int64_t
maxValue(
int value_bits_per_sample) {
298 switch (value_bits_per_sample) {
312 template <
typename T>
318 return std::numeric_limits<T>::max();
324 template <
typename T>
330 return std::numeric_limits<T>::min();
337 template <
typename T>
339 float mv = maxValueT<T>();
342 }
else if (value < -mv) {
349 inline static int32_t
clip(
float value,
int bits) {
353 }
else if (value < -mv) {
360 template <
typename T>
362 return static_cast<float>(value) / maxValueT<T>();
366 template <
typename T>
368 return value * maxValueT<T>();
372 inline static float toFloat(int32_t value,
int bits) {
373 return static_cast<float>(value) /
maxValue(bits);
377 inline static int32_t
fromFloat(
float value,
int bits) {
382 template <
typename FromT,
typename ToT>
384 float value1 = value;
385 float minTo = minValueT<ToT>();
386 float maxTo = maxValueT<ToT>();
387 float maxFrom = maxValueT<FromT>();
388 float minFrom = minValueT<FromT>();
390 if (maxTo - minTo > 1.0f || maxFrom - minFrom > 1.0f) {
391 return mapT<float>(value1, minFrom, maxFrom, minTo, maxTo);
394 return value1 * maxValueT<ToT>() / maxValueT<FromT>();
398 template <
typename FromT,
typename ToT>
403 for (
int j = 0; j < samples; j++) {
404 ToT mapped = convert<FromT, ToT>(from[j]);
405 float scaled =
static_cast<float>(mapped) * vol;
406 to[j] = clipT<ToT>(scaled);
429 "I2S_PHILIPS_FORMAT",
430 "I2S_RIGHT_JUSTIFIED_FORMAT",
431 "I2S_LEFT_JUSTIFIED_FORMAT",
452 uint8_t* p_result = (uint8_t*)&result;
453 int open =
sizeof(T);
457 int read = p_stream->
readBytes(p_result + total, open);
467 int retryCount = -1) {
468 uint8_t* p_result = (uint8_t*)data;
469 int open = samples *
sizeof(T);
474 int read = p_stream->
readBytes(p_result + total, open);
484 if (retryCount >= 0 && count0 > retryCount)
break;
487 return total /
sizeof(T);
491template <
typename T,
class P>
492size_t writeDataT(P* p_out, T* data,
int samples,
int maxSamples = 512) {
493 uint8_t* p_result = (uint8_t*)data;
494 int open = samples *
sizeof(T);
498 int to_write = min(open,
static_cast<int>(maxSamples *
sizeof(T)));
499 int written = p_out->write(p_result + total, to_write);
504 return total /
sizeof(T);
509 return writeDataT<T, Print>(p_out, data, samples, maxSamples);
521inline void waitFor(
bool& flag) {
while (!flag); }
#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:521
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