24 static constexpr uint16_t DEFAULT_SAMPLE_RATE = 11025;
26 bool Load(
SoundEntry &sound,
bool new_format, std::vector<uint8_t> &data)
override
31 if (file.
ReadDword() != std::byteswap<uint32_t>(
'RIFF'))
return false;
33 if (file.
ReadDword() != std::byteswap<uint32_t>(
'WAVE'))
return false;
40 if (tag == std::byteswap<uint32_t>(
'fmt ')) {
42 if (format != 1)
return false;
45 if (sound.channels != 1)
return false;
48 if (!new_format) sound.rate = DEFAULT_SAMPLE_RATE;
53 sound.bits_per_sample = file.
ReadWord();
54 if (sound.bits_per_sample != 8 && sound.bits_per_sample != 16)
return false;
58 }
else if (tag == std::byteswap<uint32_t>(
'data')) {
59 uint align = sound.channels * sound.bits_per_sample / 8;
60 if (
Align(size, align) != size)
return false;
62 if (size == 0)
return true;
65 data.reserve(size + align);
70 switch (sound.bits_per_sample) {
73 for (
auto &sample : data) {
74 sample = sample - 128;
80 if constexpr (std::endian::native != std::endian::little) {
81 for (
auto it = std::begin(data); it != std::end(data); ) {
82 std::swap(*it++, *it++);
87 default: NOT_REACHED();