| 48 | static_assert(sizeof(WaveHeader) == 44); |
| 49 | |
| 50 | static WaveHeader |
| 51 | MakeWaveHeader(int channels, int bits, |
| 52 | int freq, int block_size) noexcept |
| 53 | { |
| 54 | WaveHeader header{}; |
| 55 | |
| 56 | int data_size = 0x0FFFFFFF; |
| 57 | |
| 58 | /* constants */ |
| 59 | memcpy(header.file_header.id, "RIFF", 4); |
| 60 | memcpy(header.file_header.format, "WAVE", 4); |
| 61 | memcpy(header.fmt_header.id, "fmt ", 4); |
| 62 | memcpy(header.data_header.id, "data", 4); |
| 63 | |
| 64 | /* wave format */ |
| 65 | header.fmt.tag = ToLE16(RiffFmtChunk::TAG_PCM); |
| 66 | header.fmt.channels = ToLE16(channels); |
| 67 | header.fmt.bits_per_sample = ToLE16(bits); |
| 68 | header.fmt.sample_rate = ToLE32(freq); |
| 69 | header.fmt.block_align = ToLE16(block_size); |
| 70 | header.fmt.byte_rate = ToLE32(freq * block_size); |
| 71 | |
| 72 | /* chunk sizes (fake data length) */ |
| 73 | header.fmt_header.size = ToLE32(sizeof(header.fmt)); |
| 74 | header.data_header.size = ToLE32(data_size); |
| 75 | header.file_header.size = ToLE32(4 + |
| 76 | sizeof(header.fmt_header) + sizeof(header.fmt) + |
| 77 | sizeof(header.data_header) + data_size); |
| 78 | |
| 79 | return header; |
| 80 | } |
| 81 | |
| 82 | static PreparedEncoder * |
| 83 | wave_encoder_init([[maybe_unused]] const ConfigBlock &block) |