38static const char*
RxTxModeNames[4] = {
"UNDEFINED_MODE",
"TX_MODE",
"RX_MODE",
69 uint8_t bitsPerSample) {
117 return sample_rate > 0 && sample_rate <= 192000 && channels > 0 &&
127 virtual void logInfo(
const char* source =
"") {
128 LOGI(
"%s sample_rate: %d / channels: %d / bits_per_sample: %d", source,
162 if (pos < 0)
return false;
183 n->setAudioInfo(info);
213 virtual size_t write(
const uint8_t* data,
size_t len) = 0;
216 virtual operator bool() = 0;
230 int result = out->
write(data + written, open);
244 static uint32_t
toTimeUs(uint32_t samplingRate, uint8_t limit = 10) {
245 uint32_t result = 1000000l / samplingRate;
246 if (1000000l % samplingRate != 0) {
249 if (result <= limit) {
250 LOGW(
"Time for samplingRate %u -> %u is < %u μs - we rounded up",
251 (
unsigned int)samplingRate, (
unsigned int)result,
252 (
unsigned int)limit);
265 static uint32_t
toTimeMs(uint32_t samplingRate, uint8_t limit = 1) {
266 uint32_t result = 1000l / samplingRate;
267 if (1000000l % samplingRate != 0) {
270 if (result <= limit) {
271 LOGW(
"Time for samplingRate %u -> %u is < %u μs - we rounded up",
272 (
unsigned int)samplingRate, (
unsigned int)result,
273 (
unsigned int)limit);
279 static float toRateUs(uint32_t time_us) {
return 1000000.0 / time_us; }
281 static float toRateMs(uint32_t time_ms) {
return 1000.0 / time_ms; }
292inline T
mapT(T x, T in_min, T in_max, T out_min, T out_max) {
293 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
303 static int64_t
maxValue(
int value_bits_per_sample) {
304 switch (value_bits_per_sample) {
318 template <
typename T>
324 return std::numeric_limits<T>::max();
330 template <
typename T>
336 return std::numeric_limits<T>::min();
343 template <
typename T>
345 float mv = maxValueT<T>();
348 }
else if (value < -mv) {
355 inline static int32_t
clip(
float value,
int bits) {
359 }
else if (value < -mv) {
366 template <
typename T>
368 return static_cast<float>(value) / maxValueT<T>();
372 template <
typename T>
374 return value * maxValueT<T>();
378 inline static float toFloat(int32_t value,
int bits) {
379 return static_cast<float>(value) /
maxValue(bits);
383 inline static int32_t
fromFloat(
float value,
int bits) {
388 template <
typename FromT,
typename ToT>
390 float value1 = value;
391 float minTo = minValueT<ToT>();
392 float maxTo = maxValueT<ToT>();
393 float maxFrom = maxValueT<FromT>();
394 float minFrom = minValueT<FromT>();
396 if (maxTo - minTo > 1.0f || maxFrom - minFrom > 1.0f) {
397 return mapT<float>(value1, minFrom, maxFrom, minTo, maxTo);
400 return value1 * maxValueT<ToT>() / maxValueT<FromT>();
404 template <
typename FromT,
typename ToT>
409 for (
int j = 0; j < samples; j++) {
410 ToT mapped = convert<FromT, ToT>(from[j]);
411 float scaled =
static_cast<float>(mapped) * vol;
412 to[j] = clipT<ToT>(scaled);
435 "I2S_PHILIPS_FORMAT",
436 "I2S_RIGHT_JUSTIFIED_FORMAT",
437 "I2S_LEFT_JUSTIFIED_FORMAT",
458 uint8_t* p_result = (uint8_t*)&result;
459 int open =
sizeof(T);
463 int read = p_stream->
readBytes(p_result + total, open);
473 int retryCount = -1) {
474 uint8_t* p_result = (uint8_t*)data;
475 int open = samples *
sizeof(T);
480 int read = p_stream->
readBytes(p_result + total, open);
490 if (retryCount >= 0 && count0 > retryCount)
break;
493 return total /
sizeof(T);
497template <
typename T,
class P>
498size_t writeDataT(P* p_out, T* data,
int samples,
int maxSamples = 512) {
499 uint8_t* p_result = (uint8_t*)data;
500 int open = samples *
sizeof(T);
504 int to_write = min(open,
static_cast<int>(maxSamples *
sizeof(T)));
505 int written = p_out->write(p_result + total, to_write);
510 return total /
sizeof(T);
515 return writeDataT<T, Print>(p_out, data, samples, maxSamples);
527inline void waitFor(
bool& flag) {
while (!flag); }
567 virtual const char*
mime() = 0;
592 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:527
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:49
@ 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:49
@ HZ
Definition AudioTypes.h:49
@ MS
Definition AudioTypes.h:49