@@ -33,24 +33,44 @@ bool wav_parser_parse(WavParser* parser, Stream* stream, WavPlayerApp* app) {
33
33
stream_read (stream , (uint8_t * )& parser -> header , sizeof (WavHeaderChunk ));
34
34
stream_read (stream , (uint8_t * )& parser -> format , sizeof (WavFormatChunk ));
35
35
stream_read (stream , (uint8_t * )& parser -> data , sizeof (WavDataChunk ));
36
+ char segment_name [5 ];
36
37
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 );
40
47
return false;
41
48
}
42
49
43
50
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 );
45
53
return false;
46
54
}
47
55
48
- if (parser -> format .tag != FormatTagPCM || memcmp ( parser -> data . data , "data" , 4 ) != 0 ) {
56
+ if (parser -> format .tag != FormatTagPCM ) {
49
57
FURI_LOG_E (
50
58
TAG ,
51
- "WAV: non-PCM format %u, next '%lu' " ,
59
+ "WAV: non-PCM format: %u (%s) " ,
52
60
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 );
54
74
return false;
55
75
}
56
76
0 commit comments