SPU: NAX shouldn't point to block headers

This commit is contained in:
Ziemas 2021-01-09 19:50:09 +01:00
parent 4afb31fc64
commit 8dd1b0165b

View file

@ -100,7 +100,7 @@ void SPU::spu_irq(int index)
void SPU::switch_block(int voice_id)
{
Voice &voice = voices[voice_id];
voice.current_addr &= 0x000FFFFF;
voice.current_addr &= 0x000FFFF8;
uint16_t header = RAM[voice.current_addr];
voice.loop_code = (header >> 8) & 0x3;
bool loop_start = header & (1 << 10);
@ -148,8 +148,8 @@ stereo_sample SPU::voice_gen_sample(int voice_id)
{
voice.counter -= 0x1000;
voice.sample_idx++;
if ((voice.sample_idx % 4) == 0)
{
spu_check_irq(voice.current_addr);
@ -157,6 +157,14 @@ stereo_sample SPU::voice_gen_sample(int voice_id)
voice.current_addr &= 0x000FFFFF;
}
if (voice.sample_idx == 24)
{
if (voice.loop_code == 3)
{
voice.current_addr = voice.loop_addr | 1;
}
}
//End of block
if (voice.sample_idx == 28)
{
@ -175,20 +183,20 @@ stereo_sample SPU::voice_gen_sample(int voice_id)
break;
//Jump to loop addr and set ENDX
case 3:
voice.current_addr = voice.loop_addr;
ENDX |= 1 << voice_id;
break;
}
switch_block(voice_id);
continue;
}
voice.old3 = voice.old2;
voice.old2 = voice.old1;
voice.old1 = voice.next_sample;
voice.next_sample = voice.pcm.at(voice.sample_idx);
}
int16_t output_sample = 0;
if (!(voice_noise_gen & (1 << voice_id)))
@ -1216,7 +1224,7 @@ void SPU::update_voice_state()
void SPU::key_on_voice(int v)
{
//Copy start addr to current addr, clear ENDX bit, and set envelope to Attack mode
voices[v].current_addr = voices[v].start_addr;
voices[v].current_addr = voices[v].start_addr | 1;
voices[v].new_block = true;
voices[v].loop_addr_specified = false;
// Clear previous sample data here to avoid pops and clicks.