| //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 |