mirror of
https://github.com/snesrev/zelda3.git
synced 2025-12-19 18:05:55 -05:00
101 lines
2.4 KiB
C
101 lines
2.4 KiB
C
|
|
#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
|