diff --git a/core/components/audio/wavheader.hpp b/core/components/audio/wavheader.hpp index 567b300..47a1e1f 100644 --- a/core/components/audio/wavheader.hpp +++ b/core/components/audio/wavheader.hpp @@ -50,10 +50,11 @@ class WAVHeader { WAVHeaderBinary header; public: - WAVHeader(uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, uint32_t num_samples) { + WAVHeader() {} + void initialize(uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, uint32_t wavbinsize) { // 填充 RIFF 头 strcpy(header.chunk_id, "RIFF"); - header.chunk_size = num_samples * num_channels * bits_per_sample / 8 + 44; + header.chunk_size = wavbinsize + 44 - 8; strcpy(header.format, "WAVE"); // 填充 fmt 子块 @@ -62,15 +63,38 @@ class WAVHeader { header.audio_format = 1; // PCM 编码 header.num_channels = num_channels; header.sample_rate = sample_rate; - header.bits_per_sample = bits_per_sample; header.byte_rate = sample_rate * num_channels * bits_per_sample / 8; header.block_align = num_channels * bits_per_sample / 8; + header.bits_per_sample = bits_per_sample; // 填充 data 子块 strcpy(header.subchunk2_id, "data"); - header.subchunk2_size = num_samples * num_channels * bits_per_sample / 8; + header.subchunk2_size = wavbinsize; + } + void resize(uint32_t wavbinsize) { + header.chunk_size = wavbinsize + 44 - 8; + header.subchunk2_size = wavbinsize; } + void dump(shared_ptr logger) { + logger->info("chunk_id: {}", string(header.chunk_id, 4)); + logger->info("chunk_size: {}", header.chunk_size); + logger->info("format: {}", string(header.format,4)); + logger->info("subchunk1_id: {}", string(header.subchunk1_id,4)); + logger->info("subchunk1_size: {}", header.subchunk1_size); + logger->info("audio_format: {}", header.audio_format); + logger->info("num_channels: {}", header.num_channels); + logger->info("sample_rate: {}", header.sample_rate); + logger->info("byte_rate: {}", header.byte_rate); + logger->info("block_align: {}", header.block_align); + logger->info("bits_per_sample: {}", header.bits_per_sample); + logger->info("subchunk2_id: {}", header.subchunk2_id); + logger->info("subchunk2_size: {}", header.subchunk2_size); + } + + WAVHeader(uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, uint32_t num_samples) { + initialize(sample_rate, bits_per_sample, num_channels, num_samples); + } uint8_t* data() { return (uint8_t*)&header; } size_t size() { return sizeof(header); } };