Mesen2/Core/SNES/DSP/DspVoice.h
2022-09-08 21:29:52 -04:00

58 lines
1.2 KiB
C++

#pragma once
#include "pch.h"
#include "SNES/DSP/DspTypes.h"
#include "Utilities/ISerializable.h"
class Spc;
class Dsp;
struct SnesConfig;
class DspVoice final : public ISerializable
{
private:
Spc* _spc = nullptr;
Dsp* _dsp = nullptr;
uint8_t* _regs = nullptr;
SnesConfig* _cfg = nullptr;
DspState* _shared = nullptr;
int32_t _envVolume = 0;
int32_t _prevCalculatedEnv = 0;
int32_t _interpolationPos = 0;
EnvelopeMode _envMode = EnvelopeMode::Release;
uint16_t _brrAddress = 0;
uint16_t _brrOffset = 1;
uint8_t _voiceIndex = 0;
uint8_t _voiceBit = 0;
uint8_t _keyOnDelay = 0;
uint8_t _envOut = 0;
uint8_t _bufferPos = 0;
int16_t _sampleBuffer[12] = {};
uint8_t ReadReg(DspVoiceRegs reg) { return _regs[(int)reg]; }
void WriteReg(DspVoiceRegs reg, uint8_t value) { _regs[(int)reg] = value; }
void DecodeBrrSample();
void ProcessEnvelope();
void UpdateOutput(bool right);
public:
void Init(uint8_t voiceIndex, Spc* spc, Dsp* dsp, uint8_t* dspVoiceRegs, SnesConfig* cfg);
void Step1();
void Step2();
void Step3();
void Step3a();
void Step3b();
void Step3c();
void Step4();
void Step5();
void Step6();
void Step7();
void Step8();
void Step9();
void Serialize(Serializer& s) override;
};