pureikyubu/RnD/DspAdpcmDecoder/DspAdpcmDecoder.cpp
ogamespec 6ea48c15ab DSP WIP
- Verified ADPCM decoder output in emulator
- AX mixer volume envelope fixed (saturation)
- Still buzzing sounds instead clear samples
2020-05-18 00:36:37 +03:00

100 lines
2.5 KiB
C++

#include "pch.h"
int main(int argc, char **argv)
{
// Deploy Dsp Core
DSP::DspCore* core = new DSP::DspCore(nullptr);
assert(core);
// Init adpcm decoder
//core->Accel.AdpcmCoef[0] = 0x0136;
//core->Accel.AdpcmCoef[1] = 0xfe78;
//core->Accel.AdpcmCoef[2] = 0x06b2;
//core->Accel.AdpcmCoef[3] = 0xff09;
//core->Accel.AdpcmCoef[4] = 0x029f;
//core->Accel.AdpcmCoef[5] = 0x038d;
//core->Accel.AdpcmCoef[6] = 0x0a05;
//core->Accel.AdpcmCoef[7] = 0xfd47;
//core->Accel.AdpcmCoef[8] = 0x047d;
//core->Accel.AdpcmCoef[9] = 0xff11;
//core->Accel.AdpcmCoef[10] = 0x0742;
//core->Accel.AdpcmCoef[11] = 0x0005;
//core->Accel.AdpcmCoef[12] = 0x04ce;
//core->Accel.AdpcmCoef[13] = 0x02b7;
//core->Accel.AdpcmCoef[14] = 0x0c87;
//core->Accel.AdpcmCoef[15] = 0xfb49;
core->Accel.AdpcmCoef[0] = 0x00bf;
core->Accel.AdpcmCoef[1] = 0xffc8;
core->Accel.AdpcmCoef[2] = 0x0661;
core->Accel.AdpcmCoef[3] = 0xff43;
core->Accel.AdpcmCoef[4] = 0x02b9;
core->Accel.AdpcmCoef[5] = 0x037d;
core->Accel.AdpcmCoef[6] = 0x0a35;
core->Accel.AdpcmCoef[7] = 0xfd14;
core->Accel.AdpcmCoef[8] = 0x03ca;
core->Accel.AdpcmCoef[9] = 0x000e;
core->Accel.AdpcmCoef[10] = 0x0732;
core->Accel.AdpcmCoef[11] = 0x0018;
core->Accel.AdpcmCoef[12] = 0x0499;
core->Accel.AdpcmCoef[13] = 0x02ee;
core->Accel.AdpcmCoef[14] = 0x0cf9;
core->Accel.AdpcmCoef[15] = 0xfad5;
core->Accel.AdpcmGan = 0;
core->Accel.AdpcmYn1 = 0;
core->Accel.AdpcmYn2 = 0;
// Load Adpcm buffer
size_t adpcmDataSize = 0;
uint8_t* adpcmData = (uint8_t *)UI::FileLoad(argv[1], &adpcmDataSize);
assert(adpcmData);
// Create output file
FILE* out;
fopen_s(&out, "out.bin", "wb");
assert(out);
// Decode
uint8_t* ptr = adpcmData;
size_t byteCounter = 0;
while (adpcmDataSize != 0)
{
uint16_t pcmSample = 0;
uint8_t nextByte = *ptr++;
if (byteCounter == 0)
{
core->Accel.AdpcmPds = nextByte;
}
else
{
pcmSample = _byteswap_ushort(core->DecodeAdpcm(nextByte >> 4));
fwrite(&pcmSample, 1, sizeof(uint16_t), out);
pcmSample = _byteswap_ushort(core->DecodeAdpcm(nextByte & 0xf));
fwrite(&pcmSample, 1, sizeof(uint16_t), out);
}
adpcmDataSize--;
byteCounter++;
if (byteCounter >= 8)
{
byteCounter = 0;
}
}
fclose(out);
free(adpcmData);
delete core;
}