8#define READ_BUFFER_SIZE 512
9#define MAX_WAV_HEADER_LEN 200
73 int write(uint8_t *data,
size_t data_len) {
83 if (!
setPos(
"RIFF"))
return false;
86 if (!
setPos(
"WAVE"))
return false;
87 if (!
setPos(
"fmt "))
return false;
95 if (!
setPos(
"data"))
return false;
121 return pos > 0 ? pos + 8 : 0;
147 if (written != len) {
148 LOGE(
"Failed to write WAV header to output: written %d of %d bytes", written, len);
150 return written == len;
192 LOGI(
"Header: %s", msg);
201 int id_len = strlen(
id);
203 if (pos < 0)
return false;
243 for (i = 0; i < n; i++)
getChar();
253 void seek(
long int offset,
int origin) {
254 if (origin == SEEK_SET) {
256 }
else if (origin == SEEK_CUR) {
278 LOGI(
"writeRiffHeader: file_size=%u riff_size=%u", info.
file_size, chunk_size);
286 uint16_t fmt_len = 16;
287 if (is_ima_adpcm) fmt_len = 20;
288 else if (is_ms_adpcm) fmt_len = 50;
292 if ((is_ms_adpcm || is_ima_adpcm) && spb > 0 && info.
block_align > 0) {
309 }
else if (is_ms_adpcm) {
311 static const int16_t ms_adpcm_coef[7][2] = {
312 {256, 0}, {512, -256}, {0, 0}, {192, 64},
313 {240, 0}, {460, -208}, {392, -232}};
317 for (
auto &c : ms_adpcm_coef) {
329 uint32_t sample_length = 0;
345 data_length = info.
file_size - header_bytes;
347 LOGI(
"writeDataHeader: data_length=%u", data_length);
351 uint8_t empty[offset];
352 memset(empty, 0, offset);
476 virtual size_t write(
const uint8_t *data,
size_t len)
override {
483 if (data_start == 0)
return len;
485 result = data_start +
486 write_out((uint8_t *)data + data_start, len - data_start);
489 result =
write_out((uint8_t *)data, len);
496 virtual operator bool()
override {
return active; }
527 virtual size_t write_out(
const uint8_t *in_ptr,
size_t in_size) {
538 result =
out().
write(in_ptr, in_size);
545 size_t total_written = 0;
546 size_t samples_remaining = in_size;
549 while (samples_remaining > 0) {
550 size_t current_batch =
552 for (
size_t i = 0; i < current_batch; ++i) {
553 out_buf[i] = ((int16_t)in_ptr[offset + i] - 128) << 8;
555 writeDataT<int16_t>(&
out(), out_buf, current_batch);
556 offset += current_batch;
557 samples_remaining -= current_batch;
568 for (
size_t i = 0; i < in_size; i++) {
575 int32_t converted_sample = sample24.scale32();
591 int result = in_size;
595 LOGW(
"WAV header misses 'data' section in len: %d",
602 LOGE(
"WAV header parsing failed");
628 LOGE(
"WAV format not supported: %d", (
int)format);
688 info.is_streamed =
true;
689 info.is_valid =
true;
690 info.data_length = 0x7fff0000;
691 info.file_size =
info.data_length + 36;
736 LOGI(
"is_streamed! because length is %u",
756 virtual size_t write(
const uint8_t *data,
size_t len)
override {
758 LOGE(
"The WAVEncoder is not open - please call begin()");
763 LOGE(
"No output stream was provided");
768 LOGI(
"Writing Header");
770 LOGE(
"Failed to write WAV header");
781 result = p_out->
write((uint8_t *)data, len);
783 size_t write_size = min((
size_t)len, (
size_t)
size_limit);
784 result = p_out->
write((uint8_t *)data, write_size);
788 LOGI(
"The defined size was written - so we close the WAVEncoder now");
812 (data_length == 0 || data_length >= 0x7fff0000);
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define MAX_WAV_HEADER_LEN
Definition CodecWAV.h:9
#define assert(T)
Definition avr.h:10
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
AudioFormat
Audio format codes used by Microsoft e.g. in avi or wav files.
Definition AudioFormat.h:19