mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
5e987cc0e2
Fixes #2545 Fixes #2546 Fixes #2547 Fixes #2548 Fixes #2549 Fixes #2550 Fixes #2551 Fixes #2552 Fixes #2553 Fixes #2554 Fixes #2555 Fixes #2556 Fixes #2557 Fixes #2558 Fixes #2559 Fixes #2560 Fixes #2561 Fixes #2562 Fixes #2563 Fixes #2564 Fixes #2565 Fixes #2567 Fixes #2566 Fixes #2568 Fixes #2569 Fixes #2570 Fixes #2522 Fixes #2571 --------- Co-authored-by: water <awaterford111445@gmail.com> Co-authored-by: Hat Kid <6624576+Hat-Kid@users.noreply.github.com> Co-authored-by: ManDude <7569514+ManDude@users.noreply.github.com>
51 lines
1.1 KiB
C++
51 lines
1.1 KiB
C++
/*!
|
|
* @file dma.cpp
|
|
* DMA Related functions for Overlord.
|
|
* This code is not great.
|
|
*/
|
|
|
|
#include "dma.h"
|
|
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
|
|
#include "common/common_types.h"
|
|
|
|
#include "game/sce/iop.h"
|
|
#include "game/sound/sdshim.h"
|
|
#include "game/sound/sndshim.h"
|
|
|
|
using namespace iop;
|
|
|
|
namespace jak1 {
|
|
u32 strobe; // ?? mysterious sound DMA flag.
|
|
|
|
void dma_init_globals() {
|
|
strobe = 0;
|
|
}
|
|
|
|
/*!
|
|
* SPU DMA interrupt handler.
|
|
*/
|
|
s32 intr(s32 /*channel*/, void* /*userdata*/) {
|
|
strobe = 1;
|
|
return 0;
|
|
}
|
|
|
|
bool DMA_SendToSPUAndSync(void* src_addr, u32 size, u32 dst_addr) {
|
|
s32 channel = snd_GetFreeSPUDMA();
|
|
if (channel == -1)
|
|
return false;
|
|
strobe = 0;
|
|
sceSdSetTransIntrHandler(channel, intr, nullptr);
|
|
// Skip this, we end up memcpy's from OOB (which trips asan)
|
|
// u32 size_aligned = (size + 63) & 0xFFFFFFF0;
|
|
u32 size_aligned = size;
|
|
u32 transferred = sceSdVoiceTrans(channel, 0, src_addr, dst_addr, size_aligned);
|
|
while (!strobe)
|
|
;
|
|
sceSdSetTransIntrHandler(channel, nullptr, nullptr);
|
|
snd_FreeSPUDMA(channel);
|
|
return transferred >= size_aligned;
|
|
}
|
|
} // namespace jak1
|