From 2a83b17ffbc6587bf0bfe1fa1755d2f5d248395c Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Sat, 11 Jun 2022 11:33:25 -0700 Subject: [PATCH] DSP: Copy audio dma samples one block at a time Reverts 9f8e1e2a0dbca38b53ac7d91f5e714baaa72bfa0, but keeps the changes from e4e44909d5ffa60abf81d4685a156654c463bbf9. This fixes missing audio in Datel titles; see https://bugs.dolphin-emu.org/issues/12281. --- Source/Core/Core/HW/DSP.cpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/Source/Core/Core/HW/DSP.cpp b/Source/Core/Core/HW/DSP.cpp index 3952133748..5ebe4a6680 100644 --- a/Source/Core/Core/HW/DSP.cpp +++ b/Source/Core/Core/HW/DSP.cpp @@ -418,7 +418,7 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base) bool already_enabled = state.audio_dma.AudioDMAControl.Enable; state.audio_dma.AudioDMAControl.Hex = val; - // Only load new values if were not already doing a DMA transfer, + // Only load new values if we're not already doing a DMA transfer, // otherwise just let the new values be autoloaded in when the // current transfer ends. if (!already_enabled && state.audio_dma.AudioDMAControl.Enable) @@ -429,10 +429,6 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base) INFO_LOG_FMT(AUDIO_INTERFACE, "Audio DMA configured: {} blocks from {:#010x}", state.audio_dma.AudioDMAControl.NumBlocks, state.audio_dma.SourceAddress); - // We make the samples ready as soon as possible - void* address = Memory::GetPointer(state.audio_dma.SourceAddress); - AudioCommon::SendAIBuffer((short*)address, state.audio_dma.AudioDMAControl.NumBlocks * 8); - // TODO: need hardware tests for the timing of this interrupt. // Sky Crawlers crashes at boot if this is scheduled less than 87 cycles in the future. // Other Namco games crash too, see issue 9509. For now we will just push it to 200 cycles @@ -524,6 +520,8 @@ void UpdateAudioDMA() // Read audio at g_audioDMA.current_source_address in RAM and push onto an // external audio fifo in the emulator, to be mixed with the disc // streaming output. + void* address = Memory::GetPointer(state.audio_dma.current_source_address); + AudioCommon::SendAIBuffer(reinterpret_cast(address), 8); if (state.audio_dma.remaining_blocks_count != 0) { @@ -536,12 +534,6 @@ void UpdateAudioDMA() state.audio_dma.current_source_address = state.audio_dma.SourceAddress; state.audio_dma.remaining_blocks_count = state.audio_dma.AudioDMAControl.NumBlocks; - if (state.audio_dma.remaining_blocks_count != 0) - { - // We make the samples ready as soon as possible - void* address = Memory::GetPointer(state.audio_dma.SourceAddress); - AudioCommon::SendAIBuffer((short*)address, state.audio_dma.AudioDMAControl.NumBlocks * 8); - } GenerateDSPInterrupt(DSP::INT_AID); } }