diff --git a/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperLoadedSound.cpp b/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperLoadedSound.cpp index 0c894a2c..de40981f 100644 --- a/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperLoadedSound.cpp +++ b/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperLoadedSound.cpp @@ -1,6 +1,9 @@ #include "AssetDumperLoadedSound.h" #include "Sound/WavTypes.h" +#include "Sound/WavWriter.h" + +#include using namespace IW3; @@ -9,37 +12,22 @@ bool AssetDumperLoadedSound::ShouldDump(XAssetInfo* asset) return true; } -void AssetDumperLoadedSound::DumpWavPcm(AssetDumpingContext& context, const LoadedSound* asset, std::ostream& stream) +void AssetDumperLoadedSound::DumpWavPcm(const LoadedSound* asset, std::ostream& stream) { - const auto riffMasterChunkSize = sizeof(WAV_CHUNK_ID_RIFF) + sizeof(uint32_t) + sizeof(WAV_WAVE_ID) + sizeof(WavChunkHeader) + sizeof(WavFormatChunkPcm) - + sizeof(WavChunkHeader) + sizeof(asset->sound.info.data_len); + const WavWriter writer(stream); - stream.write(reinterpret_cast(&WAV_CHUNK_ID_RIFF), sizeof(WAV_CHUNK_ID_RIFF)); - stream.write(reinterpret_cast(&riffMasterChunkSize), sizeof(riffMasterChunkSize)); - stream.write(reinterpret_cast(&WAV_WAVE_ID), sizeof(WAV_WAVE_ID)); + const WavMetaData metaData{.channelCount = static_cast(asset->sound.info.channels), + .samplesPerSec = static_cast(asset->sound.info.rate), + .bitsPerSample = static_cast(asset->sound.info.bits)}; - const WavChunkHeader formatChunkHeader{WAV_CHUNK_ID_FMT, sizeof(WavFormatChunkPcm)}; - stream.write(reinterpret_cast(&formatChunkHeader), sizeof(formatChunkHeader)); - - WavFormatChunkPcm formatChunk{ - WavFormat::PCM, - static_cast(asset->sound.info.channels), - asset->sound.info.rate, - asset->sound.info.rate * asset->sound.info.channels * asset->sound.info.bits / 8, - static_cast(asset->sound.info.block_size), - static_cast(asset->sound.info.bits), - }; - stream.write(reinterpret_cast(&formatChunk), sizeof(formatChunk)); - - const WavChunkHeader dataChunkHeader{WAV_CHUNK_ID_DATA, asset->sound.info.data_len}; - stream.write(reinterpret_cast(&dataChunkHeader), sizeof(dataChunkHeader)); - stream.write(asset->sound.data, asset->sound.info.data_len); + writer.WritePcmHeader(metaData, asset->sound.info.data_len); + writer.WritePcmData(asset->sound.data, asset->sound.info.data_len); } void AssetDumperLoadedSound::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) { const auto* loadedSound = asset->Asset(); - const auto assetFile = context.OpenAssetFile("sound/" + asset->m_name); + const auto assetFile = context.OpenAssetFile(std::format("sound/{}", asset->m_name)); if (!assetFile) return; @@ -48,11 +36,11 @@ void AssetDumperLoadedSound::DumpAsset(AssetDumpingContext& context, XAssetInfo< switch (static_cast(loadedSound->sound.info.format)) { case WavFormat::PCM: - DumpWavPcm(context, loadedSound, stream); + DumpWavPcm(loadedSound, stream); break; default: - printf("Unknown format %i for loaded sound: %s\n", loadedSound->sound.info.format, loadedSound->name); + std::cerr << std::format("Unknown format {} for loaded sound: {}\n", loadedSound->sound.info.format, loadedSound->name); break; } } diff --git a/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperLoadedSound.h b/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperLoadedSound.h index f4be599e..239e3b5b 100644 --- a/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperLoadedSound.h +++ b/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperLoadedSound.h @@ -7,7 +7,7 @@ namespace IW3 { class AssetDumperLoadedSound final : public AbstractAssetDumper { - static void DumpWavPcm(AssetDumpingContext& context, const LoadedSound* asset, std::ostream& stream); + static void DumpWavPcm(const LoadedSound* asset, std::ostream& stream); protected: bool ShouldDump(XAssetInfo* asset) override; diff --git a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperLoadedSound.cpp b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperLoadedSound.cpp index 3e65ea6a..7348db5e 100644 --- a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperLoadedSound.cpp +++ b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperLoadedSound.cpp @@ -3,6 +3,8 @@ #include "Sound/WavTypes.h" #include "Sound/WavWriter.h" +#include + using namespace IW4; bool AssetDumperLoadedSound::ShouldDump(XAssetInfo* asset) @@ -10,12 +12,13 @@ bool AssetDumperLoadedSound::ShouldDump(XAssetInfo* asset) return true; } -void AssetDumperLoadedSound::DumpWavPcm(AssetDumpingContext& context, const LoadedSound* asset, std::ostream& stream) +void AssetDumperLoadedSound::DumpWavPcm(const LoadedSound* asset, std::ostream& stream) { const WavWriter writer(stream); - const WavMetaData metaData{ - static_cast(asset->sound.info.channels), static_cast(asset->sound.info.rate), static_cast(asset->sound.info.bits)}; + const WavMetaData metaData{.channelCount = static_cast(asset->sound.info.channels), + .samplesPerSec = static_cast(asset->sound.info.rate), + .bitsPerSample = static_cast(asset->sound.info.bits)}; writer.WritePcmHeader(metaData, asset->sound.info.data_len); writer.WritePcmData(asset->sound.data, asset->sound.info.data_len); @@ -24,7 +27,7 @@ void AssetDumperLoadedSound::DumpWavPcm(AssetDumpingContext& context, const Load void AssetDumperLoadedSound::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) { const auto* loadedSound = asset->Asset(); - const auto assetFile = context.OpenAssetFile("sound/" + asset->m_name); + const auto assetFile = context.OpenAssetFile(std::format("sound/{}", asset->m_name)); if (!assetFile) return; @@ -33,11 +36,11 @@ void AssetDumperLoadedSound::DumpAsset(AssetDumpingContext& context, XAssetInfo< switch (static_cast(loadedSound->sound.info.format)) { case WavFormat::PCM: - DumpWavPcm(context, loadedSound, stream); + DumpWavPcm(loadedSound, stream); break; default: - printf("Unknown format %i for loaded sound: %s\n", loadedSound->sound.info.format, loadedSound->name); + std::cerr << std::format("Unknown format {} for loaded sound: {}\n", loadedSound->sound.info.format, loadedSound->name); break; } } diff --git a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperLoadedSound.h b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperLoadedSound.h index f3b3b486..8065af76 100644 --- a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperLoadedSound.h +++ b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperLoadedSound.h @@ -7,7 +7,7 @@ namespace IW4 { class AssetDumperLoadedSound final : public AbstractAssetDumper { - static void DumpWavPcm(AssetDumpingContext& context, const LoadedSound* asset, std::ostream& stream); + static void DumpWavPcm(const LoadedSound* asset, std::ostream& stream); protected: bool ShouldDump(XAssetInfo* asset) override; diff --git a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperLoadedSound.cpp b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperLoadedSound.cpp index 54b79491..7cb254e2 100644 --- a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperLoadedSound.cpp +++ b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperLoadedSound.cpp @@ -1,6 +1,9 @@ #include "AssetDumperLoadedSound.h" #include "Sound/WavTypes.h" +#include "Sound/WavWriter.h" + +#include using namespace IW5; @@ -9,35 +12,22 @@ bool AssetDumperLoadedSound::ShouldDump(XAssetInfo* asset) return true; } -void AssetDumperLoadedSound::DumpWavPcm(AssetDumpingContext& context, const LoadedSound* asset, std::ostream& stream) +void AssetDumperLoadedSound::DumpWavPcm(const LoadedSound* asset, std::ostream& stream) { - const auto riffMasterChunkSize = sizeof(WAV_CHUNK_ID_RIFF) + sizeof(uint32_t) + sizeof(WAV_WAVE_ID) + sizeof(WavChunkHeader) + sizeof(WavFormatChunkPcm) - + sizeof(WavChunkHeader) + sizeof(asset->sound.info.data_len); + const WavWriter writer(stream); - stream.write(reinterpret_cast(&WAV_CHUNK_ID_RIFF), sizeof(WAV_CHUNK_ID_RIFF)); - stream.write(reinterpret_cast(&riffMasterChunkSize), sizeof(riffMasterChunkSize)); - stream.write(reinterpret_cast(&WAV_WAVE_ID), sizeof(WAV_WAVE_ID)); + const WavMetaData metaData{.channelCount = static_cast(asset->sound.info.channels), + .samplesPerSec = static_cast(asset->sound.info.rate), + .bitsPerSample = static_cast(asset->sound.info.bits)}; - const WavChunkHeader formatChunkHeader{WAV_CHUNK_ID_FMT, sizeof(WavFormatChunkPcm)}; - stream.write(reinterpret_cast(&formatChunkHeader), sizeof(formatChunkHeader)); - - WavFormatChunkPcm formatChunk{WavFormat::PCM, - static_cast(asset->sound.info.channels), - asset->sound.info.rate, - asset->sound.info.rate * asset->sound.info.channels * asset->sound.info.bits / 8, - static_cast(asset->sound.info.block_size), - static_cast(asset->sound.info.bits)}; - stream.write(reinterpret_cast(&formatChunk), sizeof(formatChunk)); - - const WavChunkHeader dataChunkHeader{WAV_CHUNK_ID_DATA, asset->sound.info.data_len}; - stream.write(reinterpret_cast(&dataChunkHeader), sizeof(dataChunkHeader)); - stream.write(asset->sound.data, asset->sound.info.data_len); + writer.WritePcmHeader(metaData, asset->sound.info.data_len); + writer.WritePcmData(asset->sound.data, asset->sound.info.data_len); } void AssetDumperLoadedSound::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) { const auto* loadedSound = asset->Asset(); - const auto assetFile = context.OpenAssetFile("sound/" + asset->m_name); + const auto assetFile = context.OpenAssetFile(std::format("sound/{}", asset->m_name)); if (!assetFile) return; @@ -46,11 +36,11 @@ void AssetDumperLoadedSound::DumpAsset(AssetDumpingContext& context, XAssetInfo< switch (static_cast(loadedSound->sound.info.format)) { case WavFormat::PCM: - DumpWavPcm(context, loadedSound, stream); + DumpWavPcm(loadedSound, stream); break; default: - printf("Unknown format %i for loaded sound: %s\n", loadedSound->sound.info.format, loadedSound->name); + std::cerr << std::format("Unknown format {} for loaded sound: {}\n", loadedSound->sound.info.format, loadedSound->name); break; } } diff --git a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperLoadedSound.h b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperLoadedSound.h index e99ca33b..4f575072 100644 --- a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperLoadedSound.h +++ b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperLoadedSound.h @@ -7,7 +7,7 @@ namespace IW5 { class AssetDumperLoadedSound final : public AbstractAssetDumper { - static void DumpWavPcm(AssetDumpingContext& context, const LoadedSound* asset, std::ostream& stream); + static void DumpWavPcm(const LoadedSound* asset, std::ostream& stream); protected: bool ShouldDump(XAssetInfo* asset) override; diff --git a/src/ObjWriting/Sound/WavWriter.cpp b/src/ObjWriting/Sound/WavWriter.cpp index 0cb51016..2d8bfe84 100644 --- a/src/ObjWriting/Sound/WavWriter.cpp +++ b/src/ObjWriting/Sound/WavWriter.cpp @@ -7,31 +7,31 @@ WavWriter::WavWriter(std::ostream& stream) void WavWriter::WritePcmHeader(const WavMetaData& metaData, const size_t dataLen) const { - constexpr auto riffMasterChunkSize = sizeof(WAV_CHUNK_ID_RIFF) + sizeof(uint32_t) + sizeof(WAV_WAVE_ID) + sizeof(WavChunkHeader) + sizeof(WavFormatChunkPcm) - + sizeof(WavChunkHeader) + sizeof(dataLen); + constexpr auto riffMasterChunkSize = static_cast(sizeof(WAV_CHUNK_ID_RIFF) + sizeof(uint32_t) + sizeof(WAV_WAVE_ID) + sizeof(WavChunkHeader) + + sizeof(WavFormatChunkPcm) + sizeof(WavChunkHeader) + sizeof(uint32_t)); m_stream.write(reinterpret_cast(&WAV_CHUNK_ID_RIFF), sizeof(WAV_CHUNK_ID_RIFF)); m_stream.write(reinterpret_cast(&riffMasterChunkSize), sizeof(riffMasterChunkSize)); m_stream.write(reinterpret_cast(&WAV_WAVE_ID), sizeof(WAV_WAVE_ID)); - constexpr WavChunkHeader formatChunkHeader{WAV_CHUNK_ID_FMT, sizeof(WavFormatChunkPcm)}; + constexpr WavChunkHeader formatChunkHeader{.chunkID = WAV_CHUNK_ID_FMT, .chunkSize = sizeof(WavFormatChunkPcm)}; m_stream.write(reinterpret_cast(&formatChunkHeader), sizeof(formatChunkHeader)); const WavFormatChunkPcm formatChunk{ - WavFormat::PCM, - static_cast(metaData.channelCount), - metaData.samplesPerSec, - metaData.samplesPerSec * metaData.channelCount * metaData.bitsPerSample / 8, - static_cast(metaData.channelCount * (metaData.bitsPerSample / 8)), - static_cast(metaData.bitsPerSample), + .wFormatTag = WavFormat::PCM, + .nChannels = static_cast(metaData.channelCount), + .nSamplesPerSec = metaData.samplesPerSec, + .nAvgBytesPerSec = metaData.samplesPerSec * metaData.channelCount * metaData.bitsPerSample / 8, + .nBlockAlign = static_cast(metaData.channelCount * (metaData.bitsPerSample / 8)), + .wBitsPerSample = static_cast(metaData.bitsPerSample), }; m_stream.write(reinterpret_cast(&formatChunk), sizeof(formatChunk)); - const WavChunkHeader dataChunkHeader{WAV_CHUNK_ID_DATA, static_cast(dataLen)}; + const WavChunkHeader dataChunkHeader{.chunkID = WAV_CHUNK_ID_DATA, .chunkSize = static_cast(dataLen)}; m_stream.write(reinterpret_cast(&dataChunkHeader), sizeof(dataChunkHeader)); } void WavWriter::WritePcmData(const void* data, const size_t dataLen) const { - m_stream.write(static_cast(data), dataLen); + m_stream.write(static_cast(data), static_cast(dataLen)); }