mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-07-01 00:57:56 -05:00
47 lines
1.4 KiB
C++
47 lines
1.4 KiB
C++
#include "AssetDumperLoadedSound.h"
|
|
|
|
#include "Sound/WavTypes.h"
|
|
#include "Sound/WavWriter.h"
|
|
|
|
#include <format>
|
|
|
|
using namespace IW3;
|
|
|
|
bool AssetDumperLoadedSound::ShouldDump(XAssetInfo<LoadedSound>* asset)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
void AssetDumperLoadedSound::DumpWavPcm(const LoadedSound* asset, std::ostream& stream)
|
|
{
|
|
const WavWriter writer(stream);
|
|
|
|
const WavMetaData metaData{.channelCount = static_cast<unsigned>(asset->sound.info.channels),
|
|
.samplesPerSec = static_cast<unsigned>(asset->sound.info.rate),
|
|
.bitsPerSample = static_cast<unsigned>(asset->sound.info.bits)};
|
|
|
|
writer.WritePcmHeader(metaData, asset->sound.info.data_len);
|
|
writer.WritePcmData(asset->sound.data, asset->sound.info.data_len);
|
|
}
|
|
|
|
void AssetDumperLoadedSound::DumpAsset(AssetDumpingContext& context, XAssetInfo<LoadedSound>* asset)
|
|
{
|
|
const auto* loadedSound = asset->Asset();
|
|
const auto assetFile = context.OpenAssetFile(std::format("sound/{}", asset->m_name));
|
|
|
|
if (!assetFile)
|
|
return;
|
|
|
|
auto& stream = *assetFile;
|
|
switch (static_cast<WavFormat>(loadedSound->sound.info.format))
|
|
{
|
|
case WavFormat::PCM:
|
|
DumpWavPcm(loadedSound, stream);
|
|
break;
|
|
|
|
default:
|
|
std::cerr << std::format("Unknown format {} for loaded sound: {}\n", loadedSound->sound.info.format, loadedSound->name);
|
|
break;
|
|
}
|
|
}
|