Sfoglia il codice sorgente

Improve WAV file parsing

dds
PaulStoffregen 11 anni fa
parent
commit
81e1016b24
1 ha cambiato i file con 15 aggiunte e 2 eliminazioni
  1. +15
    -2
      play_sd_wav.cpp

+ 15
- 2
play_sd_wav.cpp Vedi File

//Serial.print("AudioPlaySdWav write, "); //Serial.print("AudioPlaySdWav write, ");
//Serial.print("size = "); //Serial.print("size = ");
//Serial.print(size); //Serial.print(size);
//Serial.print(", buffer_offset = ");
//Serial.print(buffer_offset);
//Serial.print(", data_length = "); //Serial.print(", data_length = ");
//Serial.print(data_length); //Serial.print(data_length);
//Serial.print(", space = "); //Serial.print(", space = ");
if (size < len) len = size; if (size < len) len = size;
memcpy((uint8_t *)header + data_length, p, len); memcpy((uint8_t *)header + data_length, p, len);
data_length += len; data_length += len;
buffer_offset += len;
buffer_length -= len;
if (data_length < 20) return false; if (data_length < 20) return false;
// parse the header... // parse the header...
if (header[0] == 0x46464952 && header[2] == 0x45564157 if (header[0] == 0x46464952 && header[2] == 0x45564157
if (size < len) len = size; if (size < len) len = size;
memcpy((uint8_t *)header + data_length, p, len); memcpy((uint8_t *)header + data_length, p, len);
data_length += len; data_length += len;
buffer_offset += len;
buffer_length -= len;
if (data_length < 16) return false; if (data_length < 16) return false;
if (parse_format()) { if (parse_format()) {
//Serial.println("audio format ok"); //Serial.println("audio format ok");
break; break;


// find the data chunk // find the data chunk
case STATE_PARSE3:
case STATE_PARSE3: // 10
len = 8 - data_length; len = 8 - data_length;
if (size < len) len = size; if (size < len) len = size;
memcpy((uint8_t *)header + data_length, p, len); memcpy((uint8_t *)header + data_length, p, len);
data_length += len; data_length += len;
buffer_offset += len;
buffer_length -= len;
if (data_length < 8) return false; if (data_length < 8) return false;
//Serial.print("chunk id = "); //Serial.print("chunk id = ");
//Serial.print(header[0], HEX); //Serial.print(header[0], HEX);
goto start; goto start;


// ignore any extra unknown chunks (title & artist info) // ignore any extra unknown chunks (title & artist info)
case STATE_PARSE4:
case STATE_PARSE4: // 11
if (size < data_length) { if (size < data_length) {
data_length -= size; data_length -= size;
buffer_offset += size;
buffer_length -= size;
return false; return false;
} }
p += data_length; p += data_length;
size -= data_length; size -= data_length;
buffer_offset += data_length;
buffer_length -= data_length;
data_length = 0; data_length = 0;
state = STATE_PARSE3; state = STATE_PARSE3;
//Serial.println("consumed unknown chunk");
goto start; goto start;


// playing mono at native sample rate // playing mono at native sample rate

Loading…
Annulla
Salva