summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorPokechu22 <Pokechu022@gmail.com>2022-06-11 11:33:25 -0700
committerPokechu22 <Pokechu022@gmail.com>2022-10-22 11:44:38 -0700
commit2a83b17ffbc6587bf0bfe1fa1755d2f5d248395c (patch)
tree2b4ed04ff1cd65a72ce0c2ea1b05d89d31e96beb /Source/Core
parent5b69c67b3ac895998c8964b019f98e0eb0ff0222 (diff)
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.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/HW/DSP.cpp14
1 files 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<short*>(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);
}
}