Skip to content

Commit 6088c25

Browse files
implement osAiGetStatus
1 parent 1361c48 commit 6088c25

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

librecomp/src/ai.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@ extern "C" void osAiGetLength_recomp(uint8_t* rdram, recomp_context* ctx) {
2525
}
2626

2727
extern "C" void osAiGetStatus_recomp(uint8_t* rdram, recomp_context* ctx) {
28-
ctx->r2 = 0x00000000; // Pretend the audio DMAs finish instantly
28+
ctx->r2 = osAiGetStatus();
2929
}

ultramodern/include/ultramodern/ultra64.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,8 @@ int osSetTimer(RDRAM_ARG PTR(OSTimer) timer, OSTime countdown, OSTime interval,
295295
int osStopTimer(RDRAM_ARG PTR(OSTimer) timer);
296296
u32 osVirtualToPhysical(PTR(void) addr);
297297

298+
u32 osAiGetStatus();
299+
298300
/* Controller interface */
299301

300302
s32 osContInit(RDRAM_ARG PTR(OSMesgQueue), u8*, PTR(OSContStatus));

ultramodern/src/audio.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ static uint32_t sample_rate = 48000;
66

77
static ultramodern::audio_callbacks_t audio_callbacks;
88

9+
std::atomic<uint32_t> recent_frames_queued = 0;
10+
911
void ultramodern::set_audio_callbacks(const ultramodern::audio_callbacks_t& callbacks) {
1012
audio_callbacks = callbacks;
1113
}
@@ -65,3 +67,25 @@ uint32_t ultramodern::get_remaining_audio_bytes() {
6567
}
6668
return buffered_byte_count;
6769
}
70+
71+
extern "C" u32 osAiGetStatus() {
72+
uint32_t cur_frame_count = 0;
73+
if (audio_callbacks.get_frames_remaining != nullptr) {
74+
cur_frame_count = audio_callbacks.get_frames_remaining();
75+
}
76+
77+
uint32_t samples_per_vi = (sample_rate / 60);
78+
if (cur_frame_count > static_cast<uint32_t>(buffer_offset_frames * samples_per_vi)) {
79+
cur_frame_count -= static_cast<uint32_t>(buffer_offset_frames * samples_per_vi);
80+
}
81+
else {
82+
cur_frame_count = 0;
83+
}
84+
85+
// Check if the most recently queued samples are playing, if not then consider the DMA as incomplete.
86+
if (cur_frame_count > recent_frames_queued.load()) {
87+
return 0x80000000;
88+
}
89+
90+
return 0x0;
91+
}

0 commit comments

Comments
 (0)