Skip to content

Commit

Permalink
- Move streaming audio buffer from ARAM to MRAM.
Browse files Browse the repository at this point in the history
- Use high arena instead of low arena.
  • Loading branch information
Extrems committed Oct 6, 2020
1 parent 704b4f0 commit b50c446
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 58 deletions.
15 changes: 8 additions & 7 deletions cube/patches/base/emulator.c
Expand Up @@ -121,7 +121,7 @@ void memzero(void *buf, size_t size)
#ifdef DTK
static void dtk_decode_buffer(void *address, uint32_t length)
{
sample_t stream[448] __attribute((aligned(32)));
sample_t stream[448];

adpcm_decode(&dtk.adpcm, stream, *dtk.buffer, 448);
fifo_write(stream, sizeof(stream));
Expand Down Expand Up @@ -635,14 +635,14 @@ static void dsp_write(unsigned index, uint16_t value)

if (aicr & 0b0000001) {
if (aicr & 0b1000000) {
sample_t stream[count * 3 / 2] __attribute((aligned(32)));
sample_t stream[count * 3 / 2];

if (fifo_size() >= sizeof(stream)) {
fifo_read(stream, sizeof(stream));
mix_samples(buffer, stream, true, count, aivr, aivr >> 8);
}
} else {
sample_t stream[count] __attribute((aligned(32)));
sample_t stream[count];

if (fifo_size() >= sizeof(stream)) {
fifo_read(stream, sizeof(stream));
Expand Down Expand Up @@ -933,7 +933,7 @@ static void di_interrupt_handler(OSInterrupt interrupt, OSContext *context)
}
#endif

void *init(void *arenaLo)
void *init(void *arenaHi)
{
#ifdef BBA
OSCreateAlarm(&bba_alarm);
Expand All @@ -950,10 +950,11 @@ void *init(void *arenaLo)
#endif

#ifdef DTK
dsp.buffer[0] = OSCachedToUncached(arenaLo); arenaLo += sizeof(*dsp.buffer[0]);
dsp.buffer[1] = OSCachedToUncached(arenaLo); arenaLo += sizeof(*dsp.buffer[1]);
arenaHi -= sizeof(*dsp.buffer[0]); dsp.buffer[0] = OSCachedToUncached(arenaHi);
arenaHi -= sizeof(*dsp.buffer[1]); dsp.buffer[1] = OSCachedToUncached(arenaHi);
arenaHi -= 7168; fifo_init(arenaHi, 7168);
#endif
return arenaLo;
return arenaHi;
}

bool exi_probe(int32_t chan)
Expand Down
69 changes: 26 additions & 43 deletions cube/patches/base/fifo.c
Expand Up @@ -17,29 +17,30 @@
* with Swiss. If not, see <https://www.gnu.org/licenses/>.
*/

#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "common.h"
#include "dolphin/ar.h"
#include "fifo.h"

static struct {
uint32_t used, size;
uint32_t start, end;
uint32_t read, write;
} fifo = {
.size = 0x4000 - 0x0020,
.start = 0x0020,
.end = 0x4000,
.read = 0x0020,
.write = 0x0020
};
int used, size;
void *start_ptr, *end_ptr;
void *read_ptr, *write_ptr;
} fifo = {0};

void fifo_init(void *buffer, int length)
{
fifo.size = length;
fifo.start_ptr = buffer;
fifo.end_ptr = buffer + length;

fifo_reset();
}

void fifo_reset(void)
{
fifo.used = 0;
fifo.read =
fifo.write = fifo.start;
fifo.read_ptr =
fifo.write_ptr = fifo.start_ptr;
}

int fifo_space(void)
Expand All @@ -54,50 +55,32 @@ int fifo_size(void)

void fifo_read(void *buffer, int length)
{
dcache_flush_icache_inv(buffer, length);

while (ARGetDMAStatus());
bool status = ARGetInterruptStatus();

do {
int size = MIN(length, fifo.end - fifo.read);

ARStartDMARead((intptr_t)buffer, fifo.read, size);
while (ARGetDMAStatus());
int size = MIN(length, fifo.end_ptr - fifo.read_ptr);

memcpy(buffer, fifo.read_ptr, size);
buffer += size;
length -= size;

fifo.read += size;
if (fifo.read == fifo.end)
fifo.read = fifo.start;
fifo.read_ptr += size;
if (fifo.read_ptr == fifo.end_ptr)
fifo.read_ptr = fifo.start_ptr;
fifo.used -= size;
} while (length);

if (!status) ARClearInterrupt();
}

void fifo_write(void *buffer, int length)
{
dcache_flush_icache_inv(buffer, length);

while (ARGetDMAStatus());
bool status = ARGetInterruptStatus();

do {
int size = MIN(length, fifo.end - fifo.write);

ARStartDMAWrite((intptr_t)buffer, fifo.write, size);
while (ARGetDMAStatus());
int size = MIN(length, fifo.end_ptr - fifo.write_ptr);

memcpy(fifo.write_ptr, buffer, size);
buffer += size;
length -= size;

fifo.write += size;
if (fifo.write == fifo.end)
fifo.write = fifo.start;
fifo.write_ptr += size;
if (fifo.write_ptr == fifo.end_ptr)
fifo.write_ptr = fifo.start_ptr;
fifo.used += size;
} while (length);

if (!status) ARClearInterrupt();
}
1 change: 1 addition & 0 deletions cube/patches/base/fifo.h
Expand Up @@ -20,6 +20,7 @@
#ifndef FIFO_H
#define FIFO_H

void fifo_init(void *buffer, int length);
void fifo_reset(void);
int fifo_space(void);
int fifo_size(void);
Expand Down
16 changes: 8 additions & 8 deletions cube/swiss/source/patcher.c
Expand Up @@ -3577,8 +3577,8 @@ int Patch_Hypervisor(u32 *data, u32 length, int dataType)
if (j < sizeof(__OSInitSystemCallSigs) / sizeof(FuncPattern) && (i = __OSInitSystemCallSigs[j].offsetFoundAt)) {
u32 *__OSInitSystemCall = Calc_ProperAddress(data, dataType, i * sizeof(u32));

u32 *OSGetArenaLo = Calc_ProperAddress(data, dataType, OSGetArenaLoSigs[j].offsetFoundAt * sizeof(u32));
u32 *OSSetArenaLo = Calc_ProperAddress(data, dataType, OSSetArenaLoSig.offsetFoundAt * sizeof(u32));
u32 *OSGetArenaHi = Calc_ProperAddress(data, dataType, OSGetArenaHiSigs[j].offsetFoundAt * sizeof(u32));
u32 *OSSetArenaHi = Calc_ProperAddress(data, dataType, OSSetArenaHiSig.offsetFoundAt * sizeof(u32));

if (__OSInitSystemCall) {
switch (j) {
Expand All @@ -3587,19 +3587,19 @@ int Patch_Hypervisor(u32 *data, u32 length, int dataType)
data[i + 12] = 0x3CA00000 | ((u32)__OSInitSystemCall + 0x8000) >> 16;
data[i + 13] = 0x38050000 | ((u32)__OSInitSystemCall & 0xFFFF);
data[i + 17] = 0x38800020; // li r4, 32
data[i + 20] = OSGetArenaLo ? branchAndLink(OSGetArenaLo, __OSInitSystemCall + 20) : 0x38600000;
data[i + 20] = OSGetArenaHi ? branchAndLink(OSGetArenaHi, __OSInitSystemCall + 20) : 0x38600000;
data[i + 21] = branchAndLink(INIT, __OSInitSystemCall + 21);
data[i + 22] = OSSetArenaLo ? branchAndLink(OSSetArenaLo, __OSInitSystemCall + 22) : 0x60000000;
data[i + 22] = OSSetArenaHi ? branchAndLink(OSSetArenaHi, __OSInitSystemCall + 22) : 0x60000000;
break;
case 1:
data[i + 4] = 0x3CA00000 | ((u32)VAR_JUMP_TABLE + 0x8000) >> 16;
data[i + 6] = 0x3C600000 | ((u32)__OSInitSystemCall + 0x8000) >> 16;
data[i + 7] = 0x3BE50000 | ((u32)VAR_JUMP_TABLE & 0xFFFF);
data[i + 8] = 0x38030000 | ((u32)__OSInitSystemCall & 0xFFFF);
data[i + 14] = 0x38800020; // li r4, 32
data[i + 17] = OSGetArenaLo ? branchAndLink(OSGetArenaLo, __OSInitSystemCall + 17) : 0x38600000;
data[i + 17] = OSGetArenaHi ? branchAndLink(OSGetArenaHi, __OSInitSystemCall + 17) : 0x38600000;
data[i + 18] = branchAndLink(INIT, __OSInitSystemCall + 18);
data[i + 19] = OSSetArenaLo ? branchAndLink(OSSetArenaLo, __OSInitSystemCall + 19) : 0x60000000;
data[i + 19] = OSSetArenaHi ? branchAndLink(OSSetArenaHi, __OSInitSystemCall + 19) : 0x60000000;
break;
case 2:
data[i + 3] = 0x3C600000 | ((u32)__OSInitSystemCall + 0x8000) >> 16;
Expand All @@ -3610,9 +3610,9 @@ int Patch_Hypervisor(u32 *data, u32 length, int dataType)
data[i + 12] = 0x38800020; // li r4, 32
data[i + 13] = 0x38630000 | ((u32)VAR_JUMP_TABLE & 0xFFFF);
data[i + 16] = 0x60000000; // nop
data[i + 17] = OSGetArenaLo ? branchAndLink(OSGetArenaLo, __OSInitSystemCall + 17) : 0x38600000;
data[i + 17] = OSGetArenaHi ? branchAndLink(OSGetArenaHi, __OSInitSystemCall + 17) : 0x38600000;
data[i + 18] = branchAndLink(INIT, __OSInitSystemCall + 18);
data[i + 19] = OSSetArenaLo ? branchAndLink(OSSetArenaLo, __OSInitSystemCall + 19) : 0x60000000;
data[i + 19] = OSSetArenaHi ? branchAndLink(OSSetArenaHi, __OSInitSystemCall + 19) : 0x60000000;
break;
}
print_gecko("Found:[%s] @ %08X\n", __OSInitSystemCallSigs[j].Name, __OSInitSystemCall);
Expand Down

0 comments on commit b50c446

Please sign in to comment.