|
@ -50,10 +50,11 @@ class WAVHeader { |
|
|
WAVHeaderBinary header; |
|
|
WAVHeaderBinary header; |
|
|
|
|
|
|
|
|
public: |
|
|
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 头
|
|
|
// 填充 RIFF 头
|
|
|
strcpy(header.chunk_id, "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"); |
|
|
strcpy(header.format, "WAVE"); |
|
|
|
|
|
|
|
|
// 填充 fmt 子块
|
|
|
// 填充 fmt 子块
|
|
@ -62,15 +63,38 @@ class WAVHeader { |
|
|
header.audio_format = 1; // PCM 编码
|
|
|
header.audio_format = 1; // PCM 编码
|
|
|
header.num_channels = num_channels; |
|
|
header.num_channels = num_channels; |
|
|
header.sample_rate = sample_rate; |
|
|
header.sample_rate = sample_rate; |
|
|
header.bits_per_sample = bits_per_sample; |
|
|
|
|
|
header.byte_rate = sample_rate * num_channels * bits_per_sample / 8; |
|
|
header.byte_rate = sample_rate * num_channels * bits_per_sample / 8; |
|
|
header.block_align = num_channels * bits_per_sample / 8; |
|
|
header.block_align = num_channels * bits_per_sample / 8; |
|
|
|
|
|
header.bits_per_sample = bits_per_sample; |
|
|
|
|
|
|
|
|
// 填充 data 子块
|
|
|
// 填充 data 子块
|
|
|
strcpy(header.subchunk2_id, "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) { |
|
|
|
|
|
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; } |
|
|
uint8_t* data() { return (uint8_t*)&header; } |
|
|
size_t size() { return sizeof(header); } |
|
|
size_t size() { return sizeof(header); } |
|
|
}; |
|
|
}; |
|
|