summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/WaveFile.cpp
diff options
context:
space:
mode:
authoriwubcode <iwubcode@users.noreply.github.com>2026-11-01 00:10:58 -0500
committerGitHub <noreply@github.com>2026-11-01 00:10:58 -0500
commit86d554802d7560acf12b5c5a2b3acb344069b5ce (patch)
treeccb7d75fb225d186b928d7a04e3164d28febcb85 /Source/Core/AudioCommon/WaveFile.cpp
parent613db73aeb2c086a816592df2fb193d73130101b (diff)
parent56076f403dc8fc3a560e4b6c0811fba3d49ad880 (diff)
Merge pull request #14596 from CySlaytor/masterHEADmaster
feat(retroachievements): implement achievement notification sounds
Diffstat (limited to 'Source/Core/AudioCommon/WaveFile.cpp')
-rw-r--r--Source/Core/AudioCommon/WaveFile.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/Source/Core/AudioCommon/WaveFile.cpp b/Source/Core/AudioCommon/WaveFile.cpp
index 042b9d7a7f..c0bcd0948c 100644
--- a/Source/Core/AudioCommon/WaveFile.cpp
+++ b/Source/Core/AudioCommon/WaveFile.cpp
@@ -169,3 +169,60 @@ void WaveFileWriter::AddStereoSamplesBE(const short* sample_data, u32 count,
m_file.WriteBytes(m_conv_buffer.data(), count * 4);
m_audio_size += count * 4;
}
+
+bool AudioCommon::LoadWavFile(const std::string& filename, std::vector<s16>* out_data,
+ u32* out_sample_rate, u16* out_channels)
+{
+ File::IOFile file(filename, "rb");
+ if (!file)
+ return false;
+
+ char magic[4];
+ if (!file.ReadBytes(magic, 4) || strncmp(magic, "RIFF", 4) != 0)
+ return false;
+ file.Seek(4, File::SeekOrigin::Current);
+ if (!file.ReadBytes(magic, 4) || strncmp(magic, "WAVE", 4) != 0)
+ return false;
+
+ bool found_fmt = false;
+ bool found_data = false;
+
+ while (file.ReadBytes(magic, 4))
+ {
+ u32 chunk_size;
+ if (!file.ReadArray(&chunk_size, 1))
+ break;
+
+ if (strncmp(magic, "fmt ", 4) == 0)
+ {
+ u16 audio_format;
+ file.ReadArray(&audio_format, 1);
+ file.ReadArray(out_channels, 1);
+ file.ReadArray(out_sample_rate, 1);
+ file.Seek(6, File::SeekOrigin::Current);
+ u16 bits_per_sample;
+ file.ReadArray(&bits_per_sample, 1);
+
+ if (audio_format != 1 || bits_per_sample != 16)
+ return false;
+
+ if (chunk_size > 16)
+ file.Seek(chunk_size - 16, File::SeekOrigin::Current);
+ found_fmt = true;
+ }
+ else if (strncmp(magic, "data", 4) == 0)
+ {
+ out_data->resize(chunk_size / 2);
+ file.ReadArray(out_data->data(), out_data->size());
+ found_data = true;
+ if (chunk_size % 2 != 0)
+ file.Seek(1, File::SeekOrigin::Current);
+ }
+ else
+ {
+ file.Seek((chunk_size + 1) & ~1, File::SeekOrigin::Current);
+ }
+ }
+
+ return found_fmt && found_data;
+}