Wenting Zhang | 696ce61 | 2022-11-26 18:07:08 -0500 | [diff] [blame] | 1 | #include <stdint.h> |
| 2 | #include "waveheader.h" |
| 3 | |
| 4 | void 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 | } |