mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-10-05 19:49:45 -04:00
756f8d5fb9
This is gonna be a big PR
112 lines
3.9 KiB
C++
112 lines
3.9 KiB
C++
#include "JSystem/JSystem.h" // IWYU pragma: keep
|
|
|
|
#include "JSystem/JAudio2/JASBank.h"
|
|
|
|
#include "dusk/mods/svc/audio_res/wsys.hpp"
|
|
#include "JSystem/JAudio2/JASAiCtrl.h"
|
|
#include "JSystem/JAudio2/JASBasicInst.h"
|
|
#include "JSystem/JAudio2/JASBasicWaveBank.h"
|
|
#include "JSystem/JAudio2/JASChannel.h"
|
|
|
|
using namespace dusk::mods::svc::audio_res::wsys;
|
|
|
|
// NONMATCHING JASPoolAllocObject_MultiThreaded<_> locations
|
|
JASChannel* JASBank::noteOn(JASBank const* bank, int program, u8 key, u8 velocity, u16 priority,
|
|
void (*callback)(u32, JASChannel*, JASDsp::TChannel*, void*),
|
|
void* callback_data) {
|
|
if (program >= 0xf0) {
|
|
return noteOnOsc(program - 0xf0, key, velocity, priority, callback, callback_data);
|
|
}
|
|
if (!bank) {
|
|
return NULL;
|
|
}
|
|
JASInstParam instParam;
|
|
if (!bank->getInstParam(program, key, velocity, &instParam)) {
|
|
return NULL;
|
|
}
|
|
JASWaveBank* waveBank = bank->getWaveBank();
|
|
if (!waveBank) {
|
|
return NULL;
|
|
}
|
|
JASWaveHandle* waveHandle = waveBank->getWaveHandle(instParam.mWaveId);
|
|
if (!waveHandle) {
|
|
return NULL;
|
|
}
|
|
#if TARGET_PC
|
|
auto const wave_key = AudioWaveKey(static_cast<AudioWaveBank>(waveBank->bankId), instParam.mWaveId);
|
|
std::lock_guard lock(s_replacements_mutex);
|
|
auto const found_replacement = s_replacements.find(wave_key);
|
|
if (found_replacement != s_replacements.end()) {
|
|
waveHandle = &found_replacement->second;
|
|
}
|
|
|
|
auto const aramBase = waveHandle->getAramBaseAddress();
|
|
#endif
|
|
|
|
const JASWaveInfo* waveInfo = waveHandle->getWaveInfo();
|
|
if (!waveInfo) {
|
|
return NULL;
|
|
}
|
|
intptr_t wavePtr = waveHandle->getWavePtr();
|
|
if (!wavePtr IF_DUSK(&& !aramBase)) {
|
|
return NULL;
|
|
}
|
|
|
|
JASChannel* channel = JKR_NEW JASChannel(callback, callback_data);
|
|
if (!channel) {
|
|
return NULL;
|
|
}
|
|
channel->setPriority(priority);
|
|
channel->mAnon.mWaveInfo = *waveInfo;
|
|
channel->mWaveAramAddress = wavePtr;
|
|
#if TARGET_PC
|
|
channel->mAramBaseAddress = aramBase;
|
|
channel->mSampleReference = waveHandle->getSampleReference();
|
|
#endif
|
|
channel->mAnon.mChannelType = instParam.mChannelType;
|
|
channel->setBankDisposeID(bank);
|
|
channel->setInitPitch(instParam.mPitch * (waveInfo->mSampleRate / JASDriver::getDacRate()));
|
|
if (instParam.mDontSetKey == 0) {
|
|
channel->setKey(key - waveInfo->mBaseKey);
|
|
}
|
|
channel->setInitVolume(instParam.mVolume);
|
|
channel->setVelocity(velocity);
|
|
channel->setInitPan(instParam.mPan);
|
|
channel->setInitFxmix(instParam.mFxMix);
|
|
channel->setInitDolby(instParam.mDolby);
|
|
for (u32 i = 0; i < instParam.mOscillatorCount; i++) {
|
|
channel->setOscInit(i, instParam.mOscillators[i]);
|
|
}
|
|
channel->setDirectRelease(instParam.mDirectRelease);
|
|
if (!channel->play()) {
|
|
return NULL;
|
|
}
|
|
return channel;
|
|
}
|
|
|
|
// NONMATCHING JASPoolAllocObject_MultiThreaded<_> locations
|
|
JASChannel* JASBank::noteOnOsc(int param_0, u8 key, u8 velocity, u16 priority,
|
|
void (*callback)(u32, JASChannel*, JASDsp::TChannel*, void*),
|
|
void* callback_data) {
|
|
static JASOscillator::Point const OSC_RELEASE_TABLE[2] = {
|
|
{0x0001, 0x000A, 0x0000},
|
|
{0x000F, 0x0000, 0x0000},
|
|
};
|
|
static const JASOscillator::Data OSC_ENV = {0, 1.0f, NULL, OSC_RELEASE_TABLE, 1.0f, 0.0f};
|
|
JASChannel* channel = JKR_NEW JASChannel(callback, callback_data);
|
|
if (!channel) {
|
|
return NULL;
|
|
}
|
|
channel->setPriority(priority);
|
|
channel->mOscillatorSomething = param_0;
|
|
channel->mAnon.mChannelType = CHANNEL_OSCILLATOR;
|
|
channel->setInitPitch(16736.016f / JASDriver::getDacRate());
|
|
channel->setKey(key - channel->mAnon.mWaveInfo.mBaseKey);
|
|
channel->setVelocity(velocity);
|
|
channel->setOscInit(0, &OSC_ENV);
|
|
if (!channel->play()) {
|
|
return NULL;
|
|
}
|
|
return channel;
|
|
}
|