@@ -42,16 +42,12 @@ const char* wav_mime = "audio/wav";
42
42
*/
43
43
class WAVHeader {
44
44
public:
45
- WAVHeader (){
46
- };
47
-
48
- void begin (uint8_t * buffer, size_t len){
49
- LOGI (" WAVHeader len: %u" ,(unsigned ) len);
45
+ WAVHeader () = default ;
50
46
51
- this -> buffer = buffer;
52
- this -> len = len;
53
- this -> data_pos = 0l ;
54
-
47
+ // / Call begin when header data is complete
48
+ void begin (){
49
+ LOGI ( " WAVHeader::begin: %u " ,( unsigned ) len) ;
50
+ this -> data_pos = 0l ;
55
51
memset ((void *)&headerInfo, 0 , sizeof (WAVAudioInfo));
56
52
while (!eof ()) {
57
53
uint32_t tag, tag2, length;
@@ -125,31 +121,38 @@ class WAVHeader {
125
121
seek (length, SEEK_CUR);
126
122
}
127
123
}
128
- logInfo ();
129
- return ;
124
+ logInfo ();
125
+ len = 0 ;
126
+ }
127
+
128
+ // / Resetss the len
129
+ void end (){
130
+ len = 0 ;
130
131
}
131
132
133
+ // / Adds data to the 44 byte wav header data buffer
134
+ int write (uint8_t * data, size_t data_len){
135
+ int write_len = min (data_len, 44 - len);
136
+ memmove (buffer, data+len, write_len);
137
+ len+=write_len;
138
+ LOGI (" WAVHeader::write: %u -> %d -> %d" ,(unsigned ) data_len, write_len, len);
139
+ return write_len;
140
+ }
141
+
142
+ // / Returns true if the header is complete (with 44 bytes)
143
+ bool isDataComplete () {
144
+ return len==44 ;
145
+ }
132
146
133
147
// provides the AudioInfo
134
148
WAVAudioInfo &audioInfo () {
135
149
return headerInfo;
136
150
}
137
151
138
- // provides access to the sound data for the first record
139
- bool soundData (uint8_t * &data, size_t &len){
140
- if (sound_pos > 0 ){
141
- data = buffer + sound_pos;
142
- len = max ((long ) (this ->len - sound_pos),0l );
143
- sound_pos = 0 ;
144
- return true ;
145
- }
146
- return false ;
147
- }
148
-
149
152
protected:
150
153
struct WAVAudioInfo headerInfo;
151
- uint8_t * buffer;
152
- size_t len;
154
+ uint8_t buffer[ 44 ] ;
155
+ size_t len= 0 ;
153
156
size_t data_pos = 0 ;
154
157
size_t sound_pos = 0 ;
155
158
@@ -304,49 +307,56 @@ class WAVDecoder : public AudioDecoder {
304
307
size_t result = 0 ;
305
308
if (active) {
306
309
if (isFirst){
307
- header.begin ((uint8_t *)in_ptr, in_size);
308
- uint8_t *sound_ptr;
309
- size_t len;
310
- if (header.soundData (sound_ptr, len)){
311
- isFirst = false ;
312
- isValid = header.audioInfo ().is_valid ;
313
-
314
- LOGI (" WAV sample_rate: %d" , header.audioInfo ().sample_rate );
315
- LOGI (" WAV data_length: %u" , (unsigned ) header.audioInfo ().data_length );
316
- LOGI (" WAV is_streamed: %d" , header.audioInfo ().is_streamed );
317
- LOGI (" WAV is_valid: %s" , header.audioInfo ().is_valid ? " true" : " false" );
318
-
319
- // check format
320
- int format = header.audioInfo ().format ;
321
- isValid = format == WAV_FORMAT_PCM;
322
- if (format != WAV_FORMAT_PCM){
323
- LOGE (" WAV format not supported: %d" , format);
324
- isValid = false ;
325
- } else {
326
- // update sampling rate if the target supports it
327
- AudioBaseInfo bi;
328
- bi.sample_rate = header.audioInfo ().sample_rate ;
329
- bi.channels = header.audioInfo ().channels ;
330
- bi.bits_per_sample = header.audioInfo ().bits_per_sample ;
331
- // we provide some functionality so that we could check if the destination supports the requested format
332
- if (audioBaseInfoSupport!=nullptr ){
333
- isValid = audioBaseInfoSupport->validate (bi);
334
- if (isValid){
335
- LOGI (" isValid: %s" , isValid ? " true" :" false" );
336
- audioBaseInfoSupport->setAudioInfo (bi);
337
- // write prm data from first record
338
- LOGI (" WAVDecoder writing first sound data" );
339
- result = out->write (sound_ptr, len);
340
- } else {
341
- LOGE (" isValid: %s" , isValid ? " true" :" false" );
342
- }
310
+ // we expect at least the full header
311
+ int written = header.write ((uint8_t *)in_ptr, in_size);
312
+ if (!header.isDataComplete ()){
313
+ return in_size;
314
+ }
315
+ // parse header
316
+ header.begin ();
317
+
318
+ size_t len = in_size - written;
319
+ uint8_t *sound_ptr = (uint8_t *) in_ptr + written;
320
+ isFirst = false ;
321
+ isValid = header.audioInfo ().is_valid ;
322
+
323
+ LOGI (" WAV sample_rate: %d" , header.audioInfo ().sample_rate );
324
+ LOGI (" WAV data_length: %u" , (unsigned ) header.audioInfo ().data_length );
325
+ LOGI (" WAV is_streamed: %d" , header.audioInfo ().is_streamed );
326
+ LOGI (" WAV is_valid: %s" , header.audioInfo ().is_valid ? " true" : " false" );
327
+
328
+ // check format
329
+ int format = header.audioInfo ().format ;
330
+ isValid = format == WAV_FORMAT_PCM;
331
+ if (format != WAV_FORMAT_PCM){
332
+ LOGE (" WAV format not supported: %d" , format);
333
+ isValid = false ;
334
+ } else {
335
+ // update sampling rate if the target supports it
336
+ AudioBaseInfo bi;
337
+ bi.sample_rate = header.audioInfo ().sample_rate ;
338
+ bi.channels = header.audioInfo ().channels ;
339
+ bi.bits_per_sample = header.audioInfo ().bits_per_sample ;
340
+ // we provide some functionality so that we could check if the destination supports the requested format
341
+ if (audioBaseInfoSupport!=nullptr ){
342
+ isValid = audioBaseInfoSupport->validate (bi);
343
+ if (isValid){
344
+ LOGI (" isValid: %s" , isValid ? " true" :" false" );
345
+ audioBaseInfoSupport->setAudioInfo (bi);
346
+ // write prm data from first record
347
+ LOGI (" WAVDecoder writing first sound data" );
348
+ result = out->write (sound_ptr, len);
349
+ } else {
350
+ LOGE (" isValid: %s" , isValid ? " true" :" false" );
343
351
}
344
352
}
345
353
}
354
+
346
355
} else if (isValid) {
347
356
result = out->write ((uint8_t *)in_ptr, in_size);
348
357
}
349
358
}
359
+ header.end ();
350
360
return result;
351
361
}
352
362
0 commit comments