ref: 2c4de3dc497a89027aed78548436e64c3631499e
dir: /snes/dsp.h/
#ifndef DSP_H #define DSP_H #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <stdbool.h> #include "dsp_regs.h" typedef struct Dsp Dsp; #include "saveload.h" typedef struct DspChannel { // pitch uint16_t pitch; uint16_t pitchCounter; bool pitchModulation; // brr decoding int16_t decodeBuffer[19]; // 16 samples per brr-block, +3 for interpolation uint8_t srcn; uint16_t decodeOffset; uint8_t previousFlags; // from last sample int16_t old; int16_t older; bool useNoise; // adsr, envelope, gain uint16_t adsrRates[4]; // attack, decay, sustain, gain uint16_t rateCounter; uint8_t adsrState; // 0: attack, 1: decay, 2: sustain, 3: gain, 4: release uint16_t sustainLevel; bool useGain; uint8_t gainMode; bool directGain; uint16_t gainValue; // for direct gain uint16_t gain; // keyon/off bool keyOn; bool keyOff; // output int16_t sampleOut; // final sample, to be multiplied by channel volume int8_t volumeL; int8_t volumeR; bool echoEnable; } DspChannel; struct Dsp { uint8_t *apu_ram; // mirror ram uint8_t ram[0x80]; // 8 channels DspChannel channel[8]; // overarching uint16_t dirPage; bool evenCycle; bool mute; bool reset; int8_t masterVolumeL; int8_t masterVolumeR; // noise int16_t noiseSample; uint16_t noiseRate; uint16_t noiseCounter; // echo bool echoWrites; int8_t echoVolumeL; int8_t echoVolumeR; int8_t feedbackVolume; uint16_t echoBufferAdr; uint16_t echoDelay; uint16_t echoRemain; uint16_t echoBufferIndex; uint8_t firBufferIndex; int8_t firValues[8]; int16_t firBufferL[8]; int16_t firBufferR[8]; // sample buffer (1 frame at 32040 Hz: 534 samples, *2 for stereo) int16_t sampleBuffer[534 * 2]; uint16_t sampleOffset; // current offset in samplebuffer }; typedef struct DspRegWriteHistory { uint32_t count; uint8_t addr[256]; uint8_t val[256]; } DspRegWriteHistory; Dsp* dsp_init(uint8_t *apu_ram); void dsp_free(Dsp* dsp); void dsp_reset(Dsp* dsp); void dsp_cycle(Dsp* dsp); uint8_t dsp_read(Dsp* dsp, uint8_t adr); void dsp_write(Dsp* dsp, uint8_t adr, uint8_t val); void dsp_getSamples(Dsp* dsp, int16_t* sampleData, int samplesPerFrame, int numChannels); void dsp_saveload(Dsp *dsp, SaveLoadFunc *func, void *ctx); #endif