mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-27 23:46:02 -04:00
Merge pull request #356 from Cuyler36:jaudio_NES_dspbuf
Implement & link jaudio_NES/[dspbuf.c, cpubuf.c]
This commit is contained in:
@@ -89,6 +89,15 @@ jaudio_NES/internal/streamctrl.c:
|
||||
.data: [0x800d01a8, 0x800d0278]
|
||||
.bss: [0x80186440, 0x801864b0]
|
||||
.sdata2: [0x80218dc0, 0x80218dd0]
|
||||
jaudio_NES/internal/dspbuf.c:
|
||||
.text: [0x80019760, 0x80019ae0]
|
||||
.rodata: [0x800aa558, 0x800aa570]
|
||||
.bss: [0x801864b0, 0x801864c0]
|
||||
.sbss: [0x80218478, 0x80218488]
|
||||
jaudio_NES/internal/cpubuf.c:
|
||||
.text: [0x80019ae0, 0x80019dc0]
|
||||
.bss: [0x801864c0, 0x801864d0]
|
||||
.sbss: [0x80218488, 0x80218498]
|
||||
jaudio_NES/internal/playercall.c:
|
||||
.text: [0x80019dc0, 0x8001a0c0]
|
||||
.bss: [0x801864d0,0x80186590]
|
||||
|
||||
@@ -20,9 +20,9 @@ extern "C" {
|
||||
(u32)((((a0) & 0xFF) << 24) | (((a1) & 0xFF) << 16) | (((a2) & 0xFF) << 8) | (((a3) & 0xFF) << 0))
|
||||
|
||||
typedef enum DSPBUF_EVENTS {
|
||||
DSPBUF_EVENTS_0 = 0,
|
||||
DSPBUF_EVENTS_1 = 1,
|
||||
DSPBUF_EVENTS_2 = 2,
|
||||
DSPBUF_EVENT_INIT = 0,
|
||||
DSPBUF_EVENT_FRAME_END = 1,
|
||||
DSPBUF_EVENT_MIX = 2,
|
||||
} DSPBUF_EVENTS;
|
||||
|
||||
typedef enum SampleMedium {
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
#define CPUBUF_H
|
||||
|
||||
#include "types.h"
|
||||
#include "jaudio_NES/rate.h"
|
||||
#include "jaudio_NES/audiocommon.h"
|
||||
|
||||
extern u32 CpubufProcess(DSPBUF_EVENTS event);
|
||||
extern s16* CpubufProcess(DSPBUF_EVENTS event);
|
||||
extern void CpuFrameEnd(void);
|
||||
extern s16* MixCpu(s32 nSamples);
|
||||
|
||||
|
||||
@@ -3,8 +3,9 @@
|
||||
|
||||
#include "types.h"
|
||||
#include "jaudio_NES/audiocommon.h"
|
||||
#include "jaudio_NES/rate.h"
|
||||
|
||||
extern u32 DspbufProcess(DSPBUF_EVENTS event);
|
||||
extern s16* DspbufProcess(DSPBUF_EVENTS event);
|
||||
extern s16* MixDsp(s32 nSamples);
|
||||
extern void UpdateDSP(void);
|
||||
extern void DspFrameEnd(void);
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef DSPDRIVER_H
|
||||
#define DSPDRIVER_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
extern void UpdateDSPchannelAll(void);
|
||||
|
||||
#endif
|
||||
@@ -4,5 +4,6 @@
|
||||
#include "types.h"
|
||||
|
||||
extern void DSP_InitBuffer(void);
|
||||
extern void DSP_InvalChannelAll(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -4,5 +4,6 @@
|
||||
#include "types.h"
|
||||
|
||||
extern u32 DSPReleaseHalt(void);
|
||||
extern void DsyncFrame(u32 subframes, u32 dspbuf_start, u32 dspbuf_end);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef IPLDEC_H
|
||||
#define IPLDEC_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
extern BOOL DspExtraTaskCheck(void);
|
||||
|
||||
#endif
|
||||
@@ -4,6 +4,9 @@
|
||||
#include "types.h"
|
||||
#include "jaudio_NES/audiostruct.h"
|
||||
|
||||
extern u32 Neos_Update(s16* dst);
|
||||
extern void ImageLoaded(u32 param);
|
||||
extern BOOL Neos_CheckBoot(void);
|
||||
extern void* neosproc(void* param);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -16,4 +16,8 @@ extern s32 Jac_RegisterPlayerCallback(PlayerCallBack callback, void* arg);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* C++ linkage, should these go in a different header file? */
|
||||
extern void PlayerCallback();
|
||||
extern void DspPlayerCallback();
|
||||
|
||||
#endif
|
||||
|
||||
@@ -8,6 +8,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
extern u32 JAC_AI_SETTING;
|
||||
extern u32 JAC_SUBFRAMES;
|
||||
extern u32 JAC_FRAMESAMPLES;
|
||||
extern u32 DAC_SIZE;
|
||||
|
||||
|
||||
@@ -98,8 +98,8 @@ static void* audioproc(void* param) {
|
||||
Jac_Init();
|
||||
Jac_InitSinTable();
|
||||
ResetPlayerCallback();
|
||||
DspbufProcess(DSPBUF_EVENTS_0);
|
||||
CpubufProcess(DSPBUF_EVENTS_0);
|
||||
DspbufProcess(DSPBUF_EVENT_INIT);
|
||||
CpubufProcess(DSPBUF_EVENT_INIT);
|
||||
DspBoot();
|
||||
DSP_InitBuffer();
|
||||
__DspReg();
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
#include "jaudio_NES/cpubuf.h"
|
||||
|
||||
#include "jaudio_NES/aictrl.h"
|
||||
#include "jaudio_NES/audiothread.h"
|
||||
#include "jaudio_NES/neosthread.h"
|
||||
#include "jaudio_NES/playercall.h"
|
||||
#include "jaudio_NES/dummyprobe.h"
|
||||
|
||||
#define DSPBUF_NUM 3
|
||||
|
||||
static u8 write_buffer = 0;
|
||||
static u8 read_buffer = 0;
|
||||
static u8 dspstatus = 0;
|
||||
static s16* dsp_buf[DSPBUF_NUM];
|
||||
static u32 dac_sync_counter = 0;
|
||||
|
||||
extern s16* CpubufProcess(DSPBUF_EVENTS event) {
|
||||
u32 i;
|
||||
u32 j;
|
||||
|
||||
switch (event) {
|
||||
case DSPBUF_EVENT_INIT:
|
||||
write_buffer = 2;
|
||||
read_buffer = 0;
|
||||
for (i = 0; i < DSPBUF_NUM; i++) {
|
||||
dsp_buf[i] = (s16*)OSAlloc2(JAC_FRAMESAMPLES << 2);
|
||||
for (j = 0; j < (JAC_FRAMESAMPLES << 1); j++) {
|
||||
dsp_buf[i][j] = 0;
|
||||
}
|
||||
|
||||
DCStoreRange(dsp_buf[i], JAC_FRAMESAMPLES << 2);
|
||||
}
|
||||
|
||||
dspstatus = 0;
|
||||
break;
|
||||
case DSPBUF_EVENT_FRAME_END:
|
||||
u8 write = write_buffer + 1;
|
||||
|
||||
if (write == DSPBUF_NUM) {
|
||||
write = 0;
|
||||
}
|
||||
|
||||
if (write == read_buffer) {
|
||||
dspstatus = 0;
|
||||
} else {
|
||||
write_buffer = write;
|
||||
if (Neos_Update(dsp_buf[write_buffer]) == TRUE) {
|
||||
dspstatus = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DSPBUF_EVENT_MIX:
|
||||
u8 read = read_buffer + 1;
|
||||
if (read == DSPBUF_NUM) {
|
||||
read = 0;
|
||||
}
|
||||
|
||||
if (read == write_buffer) {
|
||||
s16 left = dsp_buf[read_buffer][(JAC_FRAMESAMPLES / 2) - 1];
|
||||
s16 right = dsp_buf[read_buffer][JAC_FRAMESAMPLES - 1];
|
||||
|
||||
for (i = 0; i < JAC_FRAMESAMPLES; i++) {
|
||||
dsp_buf[read_buffer][i] = right;
|
||||
}
|
||||
|
||||
for (i = JAC_FRAMESAMPLES; i < (JAC_FRAMESAMPLES << 1); i++) {
|
||||
dsp_buf[read_buffer][i] = left;
|
||||
}
|
||||
|
||||
if (dspstatus == 0) {
|
||||
CpubufProcess(DSPBUF_EVENT_FRAME_END);
|
||||
}
|
||||
} else {
|
||||
read_buffer = read;
|
||||
if (dspstatus == 0) {
|
||||
CpubufProcess(DSPBUF_EVENT_FRAME_END);
|
||||
}
|
||||
}
|
||||
|
||||
return dsp_buf[read_buffer];
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
extern s16* MixCpu(s32 n_samples) {
|
||||
static s32 cur = 0;
|
||||
return CpubufProcess(DSPBUF_EVENT_MIX);
|
||||
}
|
||||
|
||||
extern void CpuFrameEnd(void) {
|
||||
CpubufProcess(DSPBUF_EVENT_FRAME_END);
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
#include "jaudio_NES/dspbuf.h"
|
||||
|
||||
#include "jaudio_NES/aictrl.h"
|
||||
#include "jaudio_NES/ipldec.h"
|
||||
#include "jaudio_NES/audiothread.h"
|
||||
#include "jaudio_NES/dspproc.h"
|
||||
#include "jaudio_NES/dspdriver.h"
|
||||
#include "jaudio_NES/dspinterface.h"
|
||||
#include "jaudio_NES/playercall.h"
|
||||
#include "jaudio_NES/dummyprobe.h"
|
||||
|
||||
#define DSPBUF_NUM 3
|
||||
|
||||
static u8 write_buffer = 0;
|
||||
static u8 read_buffer = 0;
|
||||
static u8 dspstatus = 0;
|
||||
static s16* dsp_buf[DSPBUF_NUM];
|
||||
static u32 dac_sync_counter = 0;
|
||||
|
||||
extern s16* DspbufProcess(DSPBUF_EVENTS event) {
|
||||
u32 i;
|
||||
u32 j;
|
||||
|
||||
switch (event) {
|
||||
case DSPBUF_EVENT_INIT:
|
||||
write_buffer = 2;
|
||||
read_buffer = 0;
|
||||
for (i = 0; i < DSPBUF_NUM; i++) {
|
||||
dsp_buf[i] = (s16*)OSAlloc2(JAC_FRAMESAMPLES << 2);
|
||||
for (j = 0; j < (JAC_FRAMESAMPLES << 1); j++) {
|
||||
dsp_buf[i][j] = 0;
|
||||
}
|
||||
|
||||
DCStoreRange(dsp_buf[i], JAC_FRAMESAMPLES << 2);
|
||||
}
|
||||
|
||||
dspstatus = 0;
|
||||
break;
|
||||
case DSPBUF_EVENT_FRAME_END:
|
||||
DspExtraTaskCheck();
|
||||
u8 write = write_buffer + 1;
|
||||
|
||||
if (write == DSPBUF_NUM) {
|
||||
write = 0;
|
||||
}
|
||||
|
||||
if (write == read_buffer) {
|
||||
dspstatus = 0;
|
||||
} else {
|
||||
write_buffer = write;
|
||||
DspSyncCountClear(JAC_SUBFRAMES);
|
||||
Probe_Start(7, "DSP-MAIN");
|
||||
DsyncFrame(JAC_SUBFRAMES, (u32)dsp_buf[write_buffer], (u32)&dsp_buf[write_buffer][JAC_FRAMESAMPLES]);
|
||||
dspstatus = 1;
|
||||
UpdateDSP();
|
||||
}
|
||||
break;
|
||||
case DSPBUF_EVENT_MIX:
|
||||
u8 read = read_buffer + 1;
|
||||
if (read == DSPBUF_NUM) {
|
||||
read = 0;
|
||||
}
|
||||
|
||||
if (read == write_buffer) {
|
||||
s16 left = dsp_buf[read_buffer][(JAC_FRAMESAMPLES / 2) - 1];
|
||||
s16 right = dsp_buf[read_buffer][JAC_FRAMESAMPLES - 1];
|
||||
|
||||
for (i = 0; i < JAC_FRAMESAMPLES; i++) {
|
||||
dsp_buf[read_buffer][i] = left;
|
||||
}
|
||||
|
||||
for (i = JAC_FRAMESAMPLES; i < (JAC_FRAMESAMPLES << 1); i++) {
|
||||
dsp_buf[read_buffer][i] = right;
|
||||
}
|
||||
|
||||
if (dspstatus == 0) {
|
||||
DspbufProcess(DSPBUF_EVENT_FRAME_END);
|
||||
}
|
||||
} else {
|
||||
read_buffer = read;
|
||||
DCInvalidateRange(dsp_buf[read_buffer], JAC_FRAMESAMPLES << 2);
|
||||
if (dspstatus == 0) {
|
||||
DspbufProcess(DSPBUF_EVENT_FRAME_END);
|
||||
}
|
||||
}
|
||||
|
||||
return dsp_buf[read_buffer];
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
extern void UpdateDSP(void) {
|
||||
dac_sync_counter++;
|
||||
Probe_Start(3, "SFR-UPDATE");
|
||||
DSP_InvalChannelAll();
|
||||
DspPlayerCallback();
|
||||
UpdateDSPchannelAll();
|
||||
DSPReleaseHalt();
|
||||
PlayerCallback();
|
||||
Probe_Finish(3);
|
||||
}
|
||||
|
||||
extern s16* MixDsp(s32 n_samples) {
|
||||
static s32 cur = 0;
|
||||
return DspbufProcess(DSPBUF_EVENT_MIX);
|
||||
}
|
||||
|
||||
extern void DspFrameEnd(void) {
|
||||
DspbufProcess(DSPBUF_EVENT_FRAME_END);
|
||||
}
|
||||
@@ -22,7 +22,7 @@ static u32 neosproc_mq_init = FALSE;
|
||||
static s16* tmp_buf = nullptr;
|
||||
static BOOL neos_ready = FALSE;
|
||||
|
||||
extern BOOL Neos_Update(s16* dst) {
|
||||
extern u32 Neos_Update(s16* dst) {
|
||||
if (neosproc_mq_init) {
|
||||
if (OSSendMessage(&neosproc_mq, (OSMessage)dst, OS_MESSAGE_NOBLOCK) == TRUE) {
|
||||
return TRUE;
|
||||
|
||||
@@ -3,29 +3,29 @@
|
||||
|
||||
static PLAYER_CALL PLAYER_CALLLIST[16];
|
||||
|
||||
extern void ResetPlayerCallback(){
|
||||
extern void ResetPlayerCallback() {
|
||||
int i;
|
||||
|
||||
for(i = 0; i < 16; i++){
|
||||
for (i = 0; i < 16; i++) {
|
||||
PLAYER_CALLLIST[i].callback = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
static s32 Jac_CheckPlayerCallback(PlayerCallBack callback, void* arg){
|
||||
int i;
|
||||
static s32 Jac_CheckPlayerCallback(PlayerCallBack callback, void* arg) {
|
||||
int i;
|
||||
|
||||
for(i = 0; i < 16; i++){
|
||||
if(PLAYER_CALLLIST[i].callback == callback && PLAYER_CALLLIST[i].arg == arg){
|
||||
for (i = 0; i < 16; i++) {
|
||||
if (PLAYER_CALLLIST[i].callback == callback && PLAYER_CALLLIST[i].arg == arg) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
extern s32 Jac_RegisterDspPlayerCallback(PlayerCallBack callback, void* arg){
|
||||
s32 idx = Jac_RegisterPlayerCallback(callback,arg);
|
||||
extern s32 Jac_RegisterDspPlayerCallback(PlayerCallBack callback, void* arg) {
|
||||
s32 idx = Jac_RegisterPlayerCallback(callback, arg);
|
||||
|
||||
if(idx == -1){
|
||||
if (idx == -1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -34,23 +34,22 @@ extern s32 Jac_RegisterDspPlayerCallback(PlayerCallBack callback, void* arg){
|
||||
return idx;
|
||||
}
|
||||
|
||||
extern s32 Jac_RegisterPlayerCallback(PlayerCallBack callback, void* arg){
|
||||
u32 i;
|
||||
extern s32 Jac_RegisterPlayerCallback(PlayerCallBack callback, void* arg) {
|
||||
u32 i;
|
||||
|
||||
for(i = 0; i < 16; i++){
|
||||
if(PLAYER_CALLLIST[i].callback == nullptr){
|
||||
for (i = 0; i < 16; i++) {
|
||||
if (PLAYER_CALLLIST[i].callback == nullptr) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(i == 16){
|
||||
if (i == 16) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(Jac_CheckPlayerCallback(callback,arg) != -1){
|
||||
|
||||
if (Jac_CheckPlayerCallback(callback, arg) != -1) {
|
||||
return -1;
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
PLAYER_CALLLIST[i].callback = callback;
|
||||
PLAYER_CALLLIST[i].arg = arg;
|
||||
PLAYER_CALLLIST[i].DSP_mode = false;
|
||||
@@ -60,24 +59,24 @@ extern s32 Jac_RegisterPlayerCallback(PlayerCallBack callback, void* arg){
|
||||
return -1;
|
||||
}
|
||||
|
||||
extern void PlayerCallback(){
|
||||
u32 i;
|
||||
extern void PlayerCallback() {
|
||||
u32 i;
|
||||
|
||||
for(i = 0; i < 16; i++){
|
||||
for (i = 0; i < 16; i++) {
|
||||
PlayerCallBack callback = PLAYER_CALLLIST[i].callback;
|
||||
if(callback != nullptr && PLAYER_CALLLIST[i].DSP_mode == false && callback(PLAYER_CALLLIST[i].arg) == -1){
|
||||
PLAYER_CALLLIST[i].callback = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extern void DspPlayerCallback(){
|
||||
u32 i;
|
||||
|
||||
for(i = 0; i < 16; i++){
|
||||
PlayerCallBack callback = PLAYER_CALLLIST[i].callback;
|
||||
if(callback != nullptr && PLAYER_CALLLIST[i].DSP_mode == true && callback(PLAYER_CALLLIST[i].arg) == -1){
|
||||
if (callback != nullptr && PLAYER_CALLLIST[i].DSP_mode == false && callback(PLAYER_CALLLIST[i].arg) == -1) {
|
||||
PLAYER_CALLLIST[i].callback = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extern void DspPlayerCallback() {
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
PlayerCallBack callback = PLAYER_CALLLIST[i].callback;
|
||||
if (callback != nullptr && PLAYER_CALLLIST[i].DSP_mode == true && callback(PLAYER_CALLLIST[i].arg) == -1) {
|
||||
PLAYER_CALLLIST[i].callback = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user