Skip to content

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

base_pack/wav_player/wav_parser.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,44 @@ bool wav_parser_parse(WavParser* parser, Stream* stream, WavPlayerApp* app) {
3333
stream_read(stream, (uint8_t*)&parser->header, sizeof(WavHeaderChunk));
3434
stream_read(stream, (uint8_t*)&parser->format, sizeof(WavFormatChunk));
3535
stream_read(stream, (uint8_t*)&parser->data, sizeof(WavDataChunk));
36+
char segment_name[5];
3637

37-
if(memcmp(parser->header.riff, "RIFF", 4) != 0 ||
38-
memcmp(parser->header.wave, "WAVE", 4) != 0) {
39-
FURI_LOG_E(TAG, "WAV: wrong header");
38+
if(memcmp(parser->header.riff, "RIFF", 4) != 0) {
39+
strlcpy(segment_name, (char*)&parser->header.riff, sizeof(segment_name));
40+
FURI_LOG_E(TAG, "WAV: wrong RIFF header: '%s'", segment_name);
41+
return false;
42+
}
43+
44+
if(memcmp(parser->header.wave, "WAVE", 4) != 0) {
45+
strlcpy(segment_name, (char*)&parser->header.wave, sizeof(segment_name));
46+
FURI_LOG_E(TAG, "WAV: wrong WAVE header: '%s'", segment_name);
4047
return false;
4148
}
4249

4350
if(memcmp(parser->format.fmt, "fmt ", 4) != 0) {
44-
FURI_LOG_E(TAG, "WAV: wrong format");
51+
strlcpy(segment_name, (char*)&parser->format.fmt, sizeof(segment_name));
52+
FURI_LOG_E(TAG, "WAV: wrong fmt segment: '%s'", segment_name);
4553
return false;
4654
}
4755

48-
if(parser->format.tag != FormatTagPCM || memcmp(parser->data.data, "data", 4) != 0) {
56+
if(parser->format.tag != FormatTagPCM) {
4957
FURI_LOG_E(
5058
TAG,
51-
"WAV: non-PCM format %u, next '%lu'",
59+
"WAV: non-PCM format: %u (%s)",
5260
parser->format.tag,
53-
(uint32_t)parser->data.data);
61+
format_text(parser->format.tag));
62+
return false;
63+
}
64+
65+
if(memcmp(parser->data.data, "LIST", 4) == 0) {
66+
FURI_LOG_D(TAG, "WAV: skipping LIST segment");
67+
stream_seek(stream, parser->data.size, StreamOffsetFromCurrent);
68+
stream_read(stream, (uint8_t*)&parser->data, sizeof(WavDataChunk));
69+
}
70+
71+
if(memcmp(parser->data.data, "data", 4) != 0) {
72+
strlcpy(segment_name, (char*)&parser->data.data, sizeof(segment_name));
73+
FURI_LOG_E(TAG, "WAV: wrong data segment: '%s'", segment_name);
5474
return false;
5575
}
5676

0 commit comments

Comments
 (0)