31 virtual bool begin() {
return true; }
34 virtual size_t readBytes(uint8_t *data,
size_t len) {
37 return p_stream->readBytes(data, len);
48 virtual size_t write(
const uint8_t *data,
size_t len) {
124 setValue(source.buffer, source.buffer_size, source.memory_type);
126 source.setValue(
nullptr, 0, source.memory_type);
168 virtual size_t write(uint8_t
byte)
override {
171 if (
buffer ==
nullptr)
return 0;
181 virtual size_t write(
const uint8_t *
data,
size_t len)
override {
185 for (
size_t j = 0; j < len; j++) {
196 if (
buffer ==
nullptr)
return 0;
225 while (count < len) {
245 virtual void end()
override {
251 virtual void clear(
bool reset =
false) {
264 LOGW(
"data is read only");
274 if (memcmp(
"WAVE",
buffer + 8, 4) == 0) {
294#if defined(USE_PSRAM) && defined(ARDUINO)
296 buffer = (
buffer ==
nullptr) ? (uint8_t *)ps_calloc(size, 1)
297 : (uint8_t *)ps_realloc(
buffer, size);
301 buffer = (
buffer ==
nullptr) ? (uint8_t *)calloc(size, 1)
302 : (uint8_t *)realloc(
buffer, size);
330 this->buffer = (uint8_t *)
buffer;
349 if (
this == &source)
return;
404 return buffer.available();
408 return buffer.availableForWrite();
414 if (!
buffer.peek(data))
return -1;
419 if (!
buffer.read(data))
return -1;
423 virtual size_t readBytes(uint8_t *data,
size_t len)
override {
424 return buffer.readArray(data, len);
427 virtual size_t write(
const uint8_t *data,
size_t len)
override {
429 return buffer.writeArray(data, len);
432 virtual size_t write(uint8_t c)
override {
return buffer.write(c); }
453template <
class T =
int16_t>
537 LOGD(
"GeneratedSoundStream::readBytes: %u", (
unsigned int)len);
573 if (buffer_size > 0)
resize(buffer_size);
579 if (buffer_size > 0)
resize(buffer_size);
585 if (buffer_size > 0)
resize(buffer_size);
591 if (buffer_size > 0)
resize(buffer_size);
597 if (buffer_size > 0)
resize(buffer_size);
616 size_t write(
const uint8_t *data,
size_t len)
override {
619 for (
int j = 0; j < len; j++) {
620 result +=
write(data[j]);
628 if (
buffer.available() > 0) {
640 if (!
buffer.read(result))
return -1;
650 if (!
buffer.peek(result))
return -1;
660 return buffer.readArray(data, len);
669 return buffer.peekArray(data, len);
674 if (
p_in ==
nullptr)
return 0;
675 return buffer.available() +
p_in->available();
698 size_t already_available =
buffer.available();
699 size_t free_space =
buffer.availableForWrite();
700 if (free_space == 0) {
705 size_t added =
readExt(
buffer.address() + already_available, free_space);
706 buffer.setAvailable(already_available + added);
711 if (
buffer.available() >= len)
return;
715 virtual size_t writeExt(
const uint8_t *data,
size_t len) {
716 return p_out ==
nullptr ? 0 :
p_out->write(data, len);
718 virtual size_t readExt(uint8_t *data,
size_t len) {
719 return p_in ==
nullptr ? 0 :
p_in->readBytes(data, len);
731template <
typename T =
int16_t>
763 virtual size_t write(
const uint8_t *data,
size_t len) {
764 size_t result =
p_converter->convert((uint8_t *)data, len);
766 size_t result_written =
p_out->write(data, result);
767 return len * result_written / result;
774 size_t result =
p_stream->readBytes(data, len);
895 virtual size_t write(
const uint8_t *data,
size_t len)
override {
896 if (
p_print ==
nullptr)
return 0;
902 if (
p_print ==
nullptr)
return 0;
903 return p_print->availableForWrite();
920 int byte_rate =
info.sample_rate *
info.bits_per_sample *
info.channels / 8;
921 if (byte_rate == 0) {
922 LOGE(
"Audio Info not defined");
970 LOGI(
"begin sample_rate: %d, channels: %d, bits: %d", (
int)
info.sample_rate,
971 (
int)
info.channels, (
int)
info.bits_per_sample);
978 LOGI(
"begin sample_rate: %d, channels: %d, bits: %d", (
int)
info.sample_rate,
979 (
int)
info.channels, (
int)
info.bits_per_sample);
999 return p_out->availableForWrite();
1004 size_t write(
const uint8_t *data,
size_t len)
override {
1005 size_t result =
p_out->write(data, len);
1011 if (
p_in ==
nullptr)
return 0;
1012 return p_in->available();
1016 if (
p_in ==
nullptr) {
1020 size_t result =
p_in->readBytes(data, len);
1033 int64_t waitUs = durationUsToBe - durationUsEff +
cfg.correction_us;
1034 LOGD(
"wait us: %ld",
static_cast<long>(waitUs));
1036 int64_t waitMs = waitUs / 1000;
1037 if (waitMs > 0)
delay(waitMs);
1040 LOGD(
"negative delay!")
1045 return (frames * 1000000) /
cfg.sample_rate;
1074template <
typename T=
int16_t,
typename SumT=
float>
1089 if (index <
size()) {
1093 LOGE(
"Invalid index %d - max is %d", index,
size() - 1);
1113 LOGE(
"Invalid index %d - max is %d", index,
size() - 1);
1133 LOGW(
"readBytes: %d", (
int)len);
1171 if (idx < 0 || idx >=
size()) {
1199 if (idx < 0 || idx >=
size())
return nullptr;
1205 for (
int i = 0; i <
streams.size(); i++) {
1227 for (
int j = 0; j <
weights.size(); j++) {
1232 for (
int j = 0; j <
weights.size(); j++) {
1239 int samples = byteCount /
sizeof(T);
1242 int stream_count =
size();
1244 int samples_eff_max = 0;
1245 for (
int j = 0; j < stream_count; j++) {
1249 if (samples_eff > samples_eff_max) samples_eff_max = samples_eff;
1254 for (
int j = 0; j < samples_eff_max; j++) {
1257 return samples_eff_max *
sizeof(T);
1263 for (
int j = 0; j <
size(); j++) {
1271 for (
int j = 0; j < samples_eff; j++) {
1277 memset(
result_vect.data(), 0,
sizeof(SumT) * samples);
1290template <
typename T>
1324 LOGD(
"readBytes: %d", (
int)len);
1325 T *p_data = (T *)data;
1326 int result_len = min((
size_t)
available(), len);
1329 for (
int j = 0; j < frames; j++) {
1330 for (
int i = 0; i <
records.size(); i++) {
1331 for (
int ch = 0; ch <
records[i].channels; ch++) {
1332 p_data[result_idx++] =
1337 return result_idx *
sizeof(T);
1351 records[channel].weight = weight;
1365 int result =
records[0].stream->available();
1367 int tmp =
records[j].stream->available();
1420 size_t (*
cb_write)(
const uint8_t *data,
size_t len)) {
1476 if (tmp_available < 0)
return result;
1478 return tmp_available;
1490 result =
p_stream->readBytes(data, len);
1498 size_t write(
const uint8_t *data,
size_t len)
override {
1506 size_t result = len;
1508 result =
cb_update((uint8_t *)data, len);
1510 return p_out->write(data, result);
1539 size_t (*
cb_write)(
const uint8_t *data,
size_t len) =
nullptr;
1540 size_t (*
cb_read)(uint8_t *data,
size_t len) =
nullptr;
1556template <
typename T =
int16_t,
class TF =
float>
1590 LOGE(
"channels must not be 0");
1601 virtual size_t write(
const uint8_t *data,
size_t len)
override {
1602 if (
p_out ==
nullptr)
return 0;
1603 size_t result =
converter.convert((uint8_t *)data, len);
1604 return p_out->write(data, result);
1608 if (
p_io ==
nullptr)
return 0;
1609 size_t result =
p_io->readBytes(data, len);
1610 result =
converter.convert(data, result);
1615 if (
p_io ==
nullptr)
return 0;
1616 return p_io->available();
1620 if (
p_out ==
nullptr)
return 0;
1621 return p_out->availableForWrite();
1632 if (channel >=
converter.getChannels()) {
1684 int channels =
info.channels;
1685 LOGI(
"VolumeMeter::setAudioInfo: channels %d", channels);
1690 sum.resize(channels);
1695 size_t write(
const uint8_t *data,
size_t len)
override {
1697 size_t result = len;
1698 if (
p_out !=
nullptr) {
1699 result =
p_out->write(data, len);
1706 size_t result =
p_stream->readBytes(data, len);
1719 LOGE(
"begin not called!");
1722 if (channel >=
volumes.size()) {
1723 LOGE(
"invalid channel %d", channel);
1763 for (
int j = 0; j <
info.channels && j < (int)
sum.size(); j++) {
1767 return count > 0 ? total / count : 0.0f;
1781 for (
int j = 0; j <
info.channels; j++) {
1839 if (data ==
nullptr || len == 0)
return;
1841 switch (
info.bits_per_sample) {
1855 LOGE(
"Unsupported bits_per_sample: %d",
info.bits_per_sample);
1860 template <
typename T>
1862 T *bufferT = (T *)buffer;
1863 int samplesCount = size /
sizeof(T);
1865 for (
int j = 0; j < samplesCount; j++) {
1866 float tmp = abs(
static_cast<float>(bufferT[j]));
1877 int ch = j %
info.channels;
1889 for (
int j = 0; j <
info.channels; j++) {
1902 unsigned long current_time =
millis();
1904 if (above_threshold) {
2042 size_t write(
const uint8_t *data,
size_t len)
override {
2119 uint16_t (*
callback)(uint8_t *data, uint16_t len) =
nullptr;
2155 if (
cfg.sample_rate !=
info.sample_rate ||
cfg.channels !=
info.channels ||
2156 cfg.bits_per_sample !=
info.bits_per_sample) {
2157 bool do_restart =
active;
2158 if (do_restart)
end();
2159 cfg.sample_rate =
info.sample_rate;
2161 cfg.bits_per_sample =
info.bits_per_sample;
2175 if (
cfg.use_timer) {
2180 timer->setTimerFunction(
cfg.timer_function);
2181 if (
cfg.timer_id >= 0) {
2185 LOGI(
"sample_rate: %u -> time: %u milliseconds",
2186 (
unsigned int)
cfg.sample_rate, (
unsigned int)
time);
2187 timer->setCallbackParameter(
this);
2199 if (
cfg.use_timer) {
2210 if (
cfg.use_timer) {
2234 virtual size_t writeExt(
const uint8_t *data,
size_t len)
override {
2238 if (!
cfg.use_timer) {
2241 result =
buffer->writeArray((uint8_t *)data, len);
2248 virtual size_t readExt(uint8_t *data,
size_t len)
override {
2253 if (!
cfg.use_timer) {
2256 result =
buffer->readArray(data, len);
2264 unsigned long ms =
millis();
2268 uint16_t rate = 1 * 1000 / diff;
2283 if (
cfg.adapt_sample_rate &&
2294 if (src !=
nullptr) {
2301 if (buffer_available < available_bytes) {
2303 uint16_t to_clear = available_bytes - buffer_available;
2304 uint8_t tmp[to_clear];
2313 if (src->
buffer !=
nullptr && src->
frame !=
nullptr &&
2315 uint16_t available_bytes =
2317 if (available_bytes !=
2319 LOGE(
"data underflow");
#define URL_CLIENT_TIMEOUT
#define DEFAULT_BUFFER_SIZE
MemoryType
Memory types.
Definition AudioTypes.h:33
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition AudioTypes.h:26
@ RAM
Definition AudioTypes.h:33
@ PS_RAM
Definition AudioTypes.h:33
@ FLASH_RAM
Definition AudioTypes.h:33
@ RX_MODE
Definition AudioTypes.h:26
@ US
Definition AudioTypes.h:49
VolumeMeter VolumeOutput
Legacy alias for VolumeMeter.
Definition AudioStreams.h:1936
VolumeMeter VolumePrint
Legacy alias for VolumeMeter.
Definition AudioStreams.h:1932