blob: 1e44700b685f35200444ee9f3f51f3bf204dd79e [file] [log] [blame]
Wenting Zhang696ce612022-11-26 18:07:08 -05001#include <stdint.h>
2#include "waveheader.h"
3
4void waveheader(uint8_t *header, uint32_t sampleRate, uint32_t bitsPerSample, uint32_t samples) {
5 uint32_t audioDataLen = samples * (bitsPerSample / 8u) * 2u;
6 uint32_t fileSize = audioDataLen + 44u;
7 uint32_t totalDataLen = fileSize - 8u;
8 uint32_t byteRate = sampleRate * (bitsPerSample / 8u) * 2u;
9 header[0] = 'R';
10 header[1] = 'I';
11 header[2] = 'F';
12 header[3] = 'F';
13 header[4] = (totalDataLen & 0xff); /* file-size (equals file-size - 8) */
14 header[5] = ((totalDataLen >> 8U) & 0xff);
15 header[6] = ((totalDataLen >> 16U) & 0xff);
16 header[7] = ((totalDataLen >> 24U) & 0xff);
17 header[8] = 'W'; /* Mark it as type "WAVE" */
18 header[9] = 'A';
19 header[10] = 'V';
20 header[11] = 'E';
21 header[12] = 'f'; /* Mark the format section 'fmt ' chunk */
22 header[13] = 'm';
23 header[14] = 't';
24 header[15] = ' ';
25 header[16] = 16; /* 4 bytes: size of 'fmt ' chunk, Length of format data. Always 16 */
26 header[17] = 0;
27 header[18] = 0;
28 header[19] = 0;
29 header[20] = 1; /* format = 1 ,Wave type PCM */
30 header[21] = 0;
31 header[22] = 2; /* channels */
32 header[23] = 0;
33 header[24] = (sampleRate & 0xff);
34 header[25] = ((sampleRate >> 8U) & 0xff);
35 header[26] = ((sampleRate >> 16U) & 0xff);
36 header[27] = ((sampleRate >> 24U) & 0xff);
37 header[28] = (byteRate & 0xff);
38 header[29] = ((byteRate >> 8U) & 0xff);
39 header[30] = ((byteRate >> 16U) & 0xff);
40 header[31] = ((byteRate >> 24U) & 0xff);
41 header[32] = (2 * bitsPerSample / 8); /* block align */
42 header[33] = 0;
43 header[34] = bitsPerSample; /* bits per sample */
44 header[35] = 0;
45 header[36] = 'd'; /*"data" marker */
46 header[37] = 'a';
47 header[38] = 't';
48 header[39] = 'a';
49 header[40] = (audioDataLen & 0xff); /* data-size (equals file-size - 44).*/
50 header[41] = ((audioDataLen >> 8) & 0xff);
51 header[42] = ((audioDataLen >> 16) & 0xff);
52 header[43] = ((audioDataLen >> 24) & 0xff);
53}