5#define WAVE_FORMAT_IMA_ADPCM 0x0011
6#define TAG(a, b, c, d) ((static_cast<uint32_t>(a) << 24) | (static_cast<uint32_t>(b) << 16) | (static_cast<uint32_t>(c) << 8) | (d))
7#define READ_BUFFER_SIZE 512
12 -1, -1, -1, -1, 2, 4, 6, 8,
13 -1, -1, -1, -1, 2, 4, 6, 8
17 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
18 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
19 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
20 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
21 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
22 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
23 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
24 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
25 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
94 bool chunkUnknown =
false;
100 if (tag ==
TAG(
'R',
'I',
'F',
'F')) {
101 uint32_t container_type =
read_tag();
102 if (container_type !=
TAG(
'W',
'A',
'V',
'E')) {
106 else if (tag ==
TAG(
'f',
'm',
't',
' ')) {
128 }
else if (tag ==
TAG(
'f',
'a',
'c',
't')) {
133 }
else if (tag ==
TAG(
'd',
'a',
't',
'a')) {
140 if (tag !=
TAG(
'R',
'I',
'F',
'F') && length > 20)
skip_len = length - 20;
147 int write(uint8_t* data,
size_t data_len) {
154 write_len = min(
skip_len, data_len);
156 data_offset += write_len;
157 data_len -= write_len;
164 data_offset += write_len;
165 data_len -= write_len;
177 if (chunk_tag ==
TAG(
'R',
'I',
'F',
'F')) chunk_size = 4;
178 else if (chunk_tag ==
TAG(
'd',
'a',
't',
'a')) {
187 write_len = min((
size_t)chunk_size, (
size_t)20);
239 uint32_t value = (uint32_t)
getChar();
240 value |= (uint32_t)
getChar() << 8;
241 value |= (uint32_t)
getChar() << 16;
242 value |= (uint32_t)
getChar() << 24;
303 this->
out = &out_stream;
316 this->
out = &out_stream;
327 this->
out = &out_stream;
359 virtual size_t write(
const uint8_t *data,
size_t len) {
368 LOGE(
"File is not valid");
376 size_t len_open = len - written;
377 uint8_t *sound_ptr = (uint8_t *) data + written;
402 LOGI(
"WavIMADecoder writing first sound data");
417 return write(buffer, len);
420 virtual operator bool() {
443 if (step_index < 0) step_index = 0;
444 else if (step_index > 88) step_index = 88;
447 uint8_t sign = sample & 8;
448 uint8_t delta = sample & 7;
449 int32_t diff = step >> 3;
450 if (delta & 4) diff += step;
451 if (delta & 2) diff += (step >> 1);
452 if (delta & 1) diff += (step >> 2);
453 if (sign) predictor -= diff;
454 else predictor += diff;
455 if (predictor < -32768) predictor = -32768;
456 else if (predictor > 32767) predictor = 32767;
458 return (int16_t)predictor;
462 if (channels == 0 || channels > 2)
return;
481 if ((i & 15) == 7) output_pos -= 15;
482 else if ((i & 15) == 15) output_pos--;
489 for (
int i=0; i<max_size; i++) {
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define READ_BUFFER_SIZE
Definition CodecWAV.h:8
#define TAG(a, b, c, d)
Definition CodecWavIMA.h:6
#define WAVE_FORMAT_IMA_ADPCM
Definition CodecWavIMA.h:5
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