2022-08-30 00:39:15 +02:00
|
|
|
#include "Convolver.h"
|
2023-03-01 19:38:35 +01:00
|
|
|
#include "../constants.h"
|
|
|
|
#include <cstring>
|
|
|
|
#include <cstddef>
|
2022-08-30 00:39:15 +02:00
|
|
|
|
2023-03-01 19:38:35 +01:00
|
|
|
// Iscle: Right now, this is a mixture between the 2.5.0.4 driver and 2.3.4.0. It'll be corrected later.
|
2022-08-30 00:39:15 +02:00
|
|
|
|
2023-03-01 19:38:35 +01:00
|
|
|
Convolver::Convolver() {
|
|
|
|
this->enable = false;
|
|
|
|
this->samplingRate = VIPER_DEFAULT_SAMPLING_RATE;
|
|
|
|
this->waveBufferL = new WaveBuffer(2, 0x1000);
|
|
|
|
this->waveBufferR = new WaveBuffer(2, 0x1000);
|
|
|
|
memset(this->kernelFilePath, 0, sizeof(this->kernelFilePath));
|
|
|
|
this->kernelId = 0;
|
|
|
|
this->unknown1 = nullptr;
|
|
|
|
this->unknown2 = 0;
|
|
|
|
this->crossChannel = 0.0;
|
|
|
|
this->unknown3 = 0;
|
|
|
|
this->unknown4 = 0;
|
|
|
|
this->unknown5 = 0;
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Convolver::~Convolver() {
|
2023-03-01 19:38:35 +01:00
|
|
|
delete this->waveBufferL;
|
|
|
|
delete this->waveBufferR;
|
|
|
|
delete[] this->unknown1;
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void Convolver::CommitKernelBuffer(uint32_t param_1, uint32_t param_2, uint32_t kernelId) {
|
2023-03-01 19:38:35 +01:00
|
|
|
if (this->unknown1 == nullptr) {
|
|
|
|
this->unknown2 = 0;
|
|
|
|
this->unknown3 = 0;
|
|
|
|
this->unknown4 = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this->unknown2 != param_1) {
|
|
|
|
delete[] this->unknown1;
|
|
|
|
this->unknown1 = nullptr;
|
|
|
|
this->unknown2 = 0;
|
|
|
|
this->unknown3 = 0;
|
|
|
|
this->unknown4 = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this->unknown3 == 0) {
|
|
|
|
delete[] this->unknown1;
|
|
|
|
this->unknown1 = nullptr;
|
|
|
|
this->unknown2 = 0;
|
|
|
|
this->unknown3 = 0;
|
|
|
|
this->unknown4 = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-08-30 00:39:15 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Convolver::GetEnabled() {
|
2023-03-01 19:38:35 +01:00
|
|
|
return this->enable;
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t Convolver::GetKernelID() {
|
2023-03-01 19:38:35 +01:00
|
|
|
return this->kernelId;
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
2023-03-01 19:38:35 +01:00
|
|
|
void Convolver::PrepareKernelBuffer(uint32_t param_1, uint32_t param_2, int32_t param_3) {
|
|
|
|
if (param_3 == 0) {
|
|
|
|
if (param_2 - 1 < 2) {
|
|
|
|
delete[] this->unknown1;
|
|
|
|
this->unknown1 = nullptr;
|
|
|
|
this->unknown2 = param_1;
|
|
|
|
this->unknown3 = 0;
|
|
|
|
this->unknown4 = param_2;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
delete[] this->unknown1;
|
|
|
|
this->unknown1 = nullptr;
|
|
|
|
this->unknown2 = 0;
|
|
|
|
this->unknown3 = 0;
|
|
|
|
this->unknown4 = 0;
|
|
|
|
this->unknown5 = 0;
|
|
|
|
this->kernelCh1.Reset();
|
|
|
|
this->kernelCh2.Reset();
|
|
|
|
this->kernelCh3.Reset();
|
|
|
|
this->kernelCh4.Reset();
|
|
|
|
this->kernelCh1.UnloadKernel();
|
|
|
|
this->kernelCh2.UnloadKernel();
|
|
|
|
this->kernelCh3.UnloadKernel();
|
|
|
|
this->kernelCh4.UnloadKernel();
|
|
|
|
memset(this->kernelFilePath, 0, sizeof(this->kernelFilePath));
|
|
|
|
this->kernelId = 0;
|
|
|
|
}
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
2022-10-06 03:37:22 +02:00
|
|
|
uint32_t Convolver::Process(float *source, float *dest, uint32_t frameSize) {
|
|
|
|
return frameSize;
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void Convolver::Reset() {
|
2023-03-01 19:38:35 +01:00
|
|
|
this->waveBufferL->Reset();
|
|
|
|
this->waveBufferR->Reset();
|
|
|
|
this->kernelCh1.Reset();
|
|
|
|
this->kernelCh2.Reset();
|
|
|
|
this->kernelCh3.Reset();
|
|
|
|
this->kernelCh4.Reset();
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
2023-03-01 19:38:35 +01:00
|
|
|
void Convolver::SetCrossChannel(float crossChannel) {
|
|
|
|
if (crossChannel <= 0.0) {
|
|
|
|
this->isValidCrossChannel = false;
|
|
|
|
return;
|
|
|
|
}
|
2022-08-30 00:39:15 +02:00
|
|
|
|
2023-03-01 19:38:35 +01:00
|
|
|
if (crossChannel > 1.0) {
|
|
|
|
crossChannel = 1.0;
|
|
|
|
}
|
2022-08-30 00:39:15 +02:00
|
|
|
|
2023-03-01 19:38:35 +01:00
|
|
|
this->crossChannel = crossChannel;
|
|
|
|
this->isValidCrossChannel = true;
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
2023-03-01 19:38:35 +01:00
|
|
|
void Convolver::SetEnable(bool enabled) {
|
|
|
|
if (this->enable != enabled) {
|
|
|
|
if (enabled) {
|
|
|
|
Reset();
|
|
|
|
}
|
|
|
|
this->enable = enabled;
|
|
|
|
}
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
2023-03-01 19:38:35 +01:00
|
|
|
void Convolver::SetKernel(float *buf, uint32_t len) {
|
|
|
|
if (len < 16) return;
|
|
|
|
|
|
|
|
this->kernelCh1.Reset();
|
|
|
|
this->kernelCh2.Reset();
|
|
|
|
this->kernelCh3.Reset();
|
|
|
|
this->kernelCh4.Reset();
|
|
|
|
|
|
|
|
int ret1 = this->kernelCh1.LoadKernel(buf, len, 0x1000);
|
|
|
|
int ret2 = this->kernelCh2.LoadKernel(buf, len, 0x1000);
|
|
|
|
int ret3 = this->kernelCh3.LoadKernel(buf, len, 0x1000);
|
|
|
|
int ret4 = this->kernelCh4.LoadKernel(buf, len, 0x1000);
|
|
|
|
if (!ret1 || !ret2 || !ret3 || !ret4) {
|
|
|
|
this->kernelCh1.UnloadKernel();
|
|
|
|
this->kernelCh2.UnloadKernel();
|
|
|
|
this->kernelCh3.UnloadKernel();
|
|
|
|
this->kernelCh4.UnloadKernel();
|
|
|
|
}
|
|
|
|
|
|
|
|
this->kernelId = 0;
|
|
|
|
this->unknown5 = 0;
|
|
|
|
Reset();
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
2023-03-01 19:38:35 +01:00
|
|
|
void Convolver::SetKernelBuffer(uint32_t param_1, float *buf, uint32_t len) {
|
|
|
|
if (buf == nullptr || len == 0) return;
|
|
|
|
if (this->unknown2 != param_1) return;
|
|
|
|
|
|
|
|
float *newArray = new float[(this->unknown3 + len) * 4];
|
|
|
|
if (this->unknown1 != nullptr) {
|
|
|
|
memcpy(newArray, this->unknown1, this->unknown3 * 4);
|
|
|
|
delete[] this->unknown1;
|
|
|
|
this->unknown1 = newArray;
|
|
|
|
}
|
|
|
|
memcpy(this->unknown1 + this->unknown3 * 4, buf, len * 4);
|
|
|
|
this->unknown3 += len;
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void Convolver::SetKernelStereo(float *param_1, float *param_2, uint32_t param_3) {
|
2023-03-01 19:38:35 +01:00
|
|
|
if (param_3 < 16) return;
|
|
|
|
|
|
|
|
this->kernelCh1.Reset();
|
|
|
|
this->kernelCh2.Reset();
|
|
|
|
this->kernelCh3.Reset();
|
|
|
|
this->kernelCh4.Reset();
|
|
|
|
|
|
|
|
int ret1 = this->kernelCh1.LoadKernel(param_1, param_3, 0x1000);
|
|
|
|
int ret2 = this->kernelCh2.LoadKernel(param_2, param_3, 0x1000);
|
|
|
|
int ret3 = this->kernelCh3.LoadKernel(param_1, param_3, 0x1000);
|
|
|
|
int ret4 = this->kernelCh4.LoadKernel(param_2, param_3, 0x1000);
|
|
|
|
if (!ret1 || !ret2 || !ret3 || !ret4) {
|
|
|
|
this->kernelCh1.UnloadKernel();
|
|
|
|
this->kernelCh2.UnloadKernel();
|
|
|
|
this->kernelCh3.UnloadKernel();
|
|
|
|
this->kernelCh4.UnloadKernel();
|
|
|
|
}
|
|
|
|
|
|
|
|
this->kernelId = 0;
|
|
|
|
this->unknown5 = 0;
|
|
|
|
Reset();
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
2023-03-01 19:38:35 +01:00
|
|
|
void Convolver::SetSamplingRate(uint32_t samplingRate) {
|
|
|
|
if (this->samplingRate != samplingRate) {
|
|
|
|
this->samplingRate = samplingRate;
|
|
|
|
}
|
2022-08-30 00:39:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|