93 lines
2.2 KiB
C++
93 lines
2.2 KiB
C++
// ======================= ZoneTool =======================
|
|
// zonetool, a fastfile linker for various
|
|
// Call of Duty titles.
|
|
//
|
|
// Project: https://github.com/ZoneTool/zonetool
|
|
// Author: RektInator (https://github.com/RektInator)
|
|
// License: GNU GPL v3.0
|
|
// ========================================================
|
|
#include "stdafx.hpp"
|
|
|
|
namespace ZoneTool
|
|
{
|
|
namespace IW3
|
|
{
|
|
void ILoadedSound::dump(LoadedSound* asset, ZoneMemory* mem)
|
|
{
|
|
if (asset->struct1.waveFormat != 1)
|
|
{
|
|
ZONETOOL_ERROR("Audio format other than PCM currently not supported. Sound: %s\n", asset->name);
|
|
return;
|
|
}
|
|
|
|
const auto fp = FileSystem::FileOpen("loaded_sound\\"s + asset->name, "wb");
|
|
if (!fp)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// --- RIF HEADER
|
|
// ChunkID
|
|
char chunkID[] = { 'R', 'I', 'F', 'F' };
|
|
fwrite(chunkID, 4, 1, fp);
|
|
|
|
// ChunkSize
|
|
int subchunk1Size = 16;
|
|
int subchunk2Size = asset->struct1.dataLength;
|
|
int chunkSize = 4 + (8 + subchunk1Size) + (8 + subchunk2Size);
|
|
fwrite(&chunkSize, 4, 1, fp);
|
|
|
|
// Format
|
|
char format[] = { 'W', 'A', 'V', 'E' };
|
|
fwrite(format, 4, 1, fp);
|
|
|
|
|
|
// --- FMT SUBCHUNK
|
|
// Subchunk1ID
|
|
char subchunk1ID[] = { 'f', 'm', 't', ' ' };
|
|
fwrite(subchunk1ID, 4, 1, fp);
|
|
|
|
// Subchunk1Size
|
|
fwrite(&subchunk1Size, 4, 1, fp);
|
|
|
|
// AudioFormat
|
|
short audioFormat = asset->struct1.waveFormat;
|
|
fwrite(&audioFormat, 2, 1, fp);
|
|
|
|
// NumChannels
|
|
short numChannels = asset->struct1.channelCount;
|
|
fwrite(&numChannels, 2, 1, fp);
|
|
|
|
// SampleRate
|
|
int sampleRate = asset->struct1.sampleRate;
|
|
fwrite(&sampleRate, 4, 1, fp);
|
|
|
|
// ByteRate
|
|
int byteRate = asset->struct1.sampleRate * asset->struct1.channelCount * asset->struct1.bitPerChannel / 8;
|
|
fwrite(&byteRate, 4, 1, fp);
|
|
|
|
// BlockAlign
|
|
short blockAlign = asset->struct1.blockAlign;
|
|
fwrite(&blockAlign, 2, 1, fp);
|
|
|
|
// BitsPerSample
|
|
short bitsPerSample = asset->struct1.bitPerChannel;
|
|
fwrite(&bitsPerSample, 2, 1, fp);
|
|
|
|
|
|
// --- DATA SUBCHUNK
|
|
// Subchunk2ID
|
|
char subchunk2ID[] = { 'd', 'a', 't', 'a' };
|
|
fwrite(subchunk2ID, 4, 1, fp);
|
|
|
|
// Subchunk2Size
|
|
fwrite(&subchunk2Size, 4, 1, fp);
|
|
|
|
// Data
|
|
fwrite(asset->struct1.soundData, asset->struct1.dataLength, 1, fp);
|
|
|
|
FileSystem::FileClose(fp);
|
|
}
|
|
}
|
|
}
|