Alignment fixes, found exact MusyX version used

Former-commit-id: 66a930d6ee1bb21ae695ece190221a4540ab99b6
This commit is contained in:
Phillip Stephens 2023-10-21 00:40:09 -07:00
parent bb7c4c10ae
commit 476175e460
16 changed files with 481 additions and 161 deletions

View File

@ -4302,9 +4302,12 @@ musyx/runtime/hw_aramdma.c:
musyx/runtime/hw_dolphin.c:
.text start:0x803B4C3C end:0x803B5134
.bss start:0x805678A0 end:0x80569908
.bss start:0x805678A0 end:0x80569900
.sbss start:0x805A9B70 end:0x805A9B98
Dolphin/dummy.c:
.bss start:0x80569900 end:0x80569908
musyx/runtime/hw_memory.c:
.text start:0x803B5134 end:0x803B5188

View File

@ -19067,7 +19067,7 @@ jumptable_803F4208 = .data:0x803F4208; // type:object size:0x24 scope:local
jumptable_803F422C = .data:0x803F422C; // type:object size:0x24 scope:local
jumptable_803F4250 = .data:0x803F4250; // type:object size:0x24 scope:local
sndSintab = .data:0x803F4278; // type:object size:0x800 scope:global
dspSlave = .data:0x803F4A80; // type:object size:0x19E0 scope:global
dspSlave = .data:0x803F4A80; // type:object size:0x19E0 scope:global align:32
lens$115 = .data:0x803F6460; // type:object size:0x10 scope:local
lens$115 = .data:0x803F6470; // type:object size:0x20 scope:local
rsmpTab12khz = .data:0x803F6490; // type:object size:0x800 scope:local
@ -19114,7 +19114,7 @@ D54 = .data:0x803F7170; // type:object size:0x2D scope:local data:byte
D35 = .data:0x803F71A0; // type:object size:0x380 scope:local
@12 = .data:0x803F7520; // type:object size:0x9 scope:local data:string
@13 = .data:0x803F752C; // type:object size:0x1A scope:local data:string
sGraphicsFifo = .bss:0x803F7560; // type:object size:0x60000 scope:local
sGraphicsFifo = .bss:0x803F7560; // type:object size:0x60000 scope:local align:32
sMainSpace = .bss:0x80457560; // type:object size:0x168 scope:local
lbl_804576C8 = .bss:0x804576C8; // type:object size:0xD0
lbl_80457798 = .bss:0x80457798; // type:object size:0x160
@ -19227,7 +19227,7 @@ stringize_Buffer$11 = .bss:0x804795A0; // type:object size:0x200 scope:local
rs_debugger_buffer = .bss:0x804797A0; // type:object size:0x400 scope:local
lbl_80479BA0 = .bss:0x80479BA0; // type:object size:0x30
sVtxDescList = .bss:0x80479BD0; // type:object size:0xF0 scope:local data:4byte
sSpareFrameBuffer = .bss:0x80479CC0; // type:object size:0x46000 scope:local
sSpareFrameBuffer = .bss:0x80479CC0; // type:object size:0x46000 scope:local align:32
kEnvBlendCTandCConCF = .bss:0x804BFCC0; // type:object size:0x50 scope:local
sLoadedTextures = .bss:0x804BFD10; // type:object size:0x20 scope:local
XAxis = .bss:0x804BFD30; // type:object size:0xC scope:local data:float
@ -19249,11 +19249,11 @@ sTextureProjectionTransform = .bss:0x804BFF5C; // type:object size:0x34 scope:lo
lbl_804BFF90 = .bss:0x804BFF90; // type:object size:0x10
lbl_804BFFA0 = .bss:0x804BFFA0; // type:object size:0xC
lbl_804BFFAC = .bss:0x804BFFAC; // type:object size:0x14
sStaticSkinningData__8Skinning = .bss:0x804BFFC0; // type:object size:0x8000C scope:local
sStaticSkinningData__8Skinning = .bss:0x804BFFC0; // type:object size:0x8000C scope:local align:32
sSkinningBuffer__8Skinning = .bss:0x8053FFCC; // type:object size:0x28 scope:local data:byte
sAllocations__8Skinning = .bss:0x8053FFF4; // type:object size:0x1C scope:local
lbl_80540010 = .bss:0x80540010; // type:object size:0x10
lbl_80540020 = .bss:0x80540020; // type:object size:0x500
lbl_80540020 = .bss:0x80540020; // type:object size:0x500 align:32
lbl_80540520 = .bss:0x80540520; // type:object size:0x30
lbl_80540550 = .bss:0x80540550; // type:object size:0x30
lbl_80540580 = .bss:0x80540580; // type:object size:0x64
@ -19265,9 +19265,9 @@ lbl_80540A40 = .bss:0x80540A40; // type:object size:0xC
lbl_80540A4C = .bss:0x80540A4C; // type:object size:0x34
CommandList = .bss:0x80540A80; // type:object size:0x3C scope:local data:4byte
...bss.0 = .bss:0x80540A80; // type:label scope:local
AlarmForWA = .bss:0x80540AC0; // type:object size:0x28 scope:local
AlarmForTimeout = .bss:0x80540AE8; // type:object size:0x28 scope:local
AlarmForBreak = .bss:0x80540B10; // type:object size:0x28 scope:local
AlarmForWA = .bss:0x80540AC0; // type:object size:0x28 scope:local align:8
AlarmForTimeout = .bss:0x80540AE8; // type:object size:0x28 scope:local align:8
AlarmForBreak = .bss:0x80540B10; // type:object size:0x28 scope:local align:8
Prev = .bss:0x80540B38; // type:object size:0xC scope:local
Curr = .bss:0x80540B44; // type:object size:0xC scope:local
BB2 = .bss:0x80540B60; // type:object size:0x20 scope:local align:32
@ -19287,7 +19287,7 @@ DriveBlock = .bss:0x80541220; // type:object size:0x30 scope:local
__OSErrorTable = .bss:0x80541250; // type:object size:0x44 scope:global data:4byte
...bss.0 = .bss:0x80541250; // type:label scope:local
lbl_80541298 = .bss:0x80541298; // type:object size:0x2E8 data:4byte
Header = .bss:0x80541580; // type:object size:0x20 scope:global
Header = .bss:0x80541580; // type:object size:0x20 scope:local align:32
Scb = .bss:0x805415A0; // type:object size:0x54 scope:local align:32 data:4byte
...bss.0 = .bss:0x805415A0; // type:label scope:local
RunQueue = .bss:0x805415F8; // type:object size:0x100 scope:local data:4byte
@ -19362,7 +19362,8 @@ aramQueueLo = .bss:0x80566F90; // type:object size:0x284 scope:local
aramQueueHi = .bss:0x80567214; // type:object size:0x284 scope:local
aramStreamBuffers = .bss:0x80567498; // type:object size:0x400 scope:local data:4byte
dsp_task = .bss:0x805678A0; // type:object size:0x50 scope:local align:8
dram_image = .bss:0x80567900; // type:object size:0x2008 scope:local align:32
dram_image = .bss:0x80567900; // type:object size:0x2000 scope:local align:32
dummy = .bss:0x80569900; // type:object size:0x8 scope:global
__block_for_run_callback = .bss:0x80569908; // type:object size:0x30 scope:local
__block_for_prep_callback = .bss:0x80569938; // type:object size:0x30 scope:local
__block_for_stream_status = .bss:0x80569968; // type:object size:0x30 scope:local
@ -22279,7 +22280,7 @@ synthFlags = .sbss:0x805A9A34; // type:object size:0x4 scope:global data:4byte
synthVoice = .sbss:0x805A9A38; // type:object size:0x4 scope:global data:4byte
synthMessageCallback = .sbss:0x805A9A3C; // type:object size:0x4 scope:global data:4byte
synthIdleWaitActive = .sbss:0x805A9A40; // type:object size:0x1 scope:global data:byte
synthRealTime = .sbss:0x805A9A48; // type:object size:0x8 scope:global data:4byte
synthRealTime = .sbss:0x805A9A48; // type:object size:0x8 scope:global align:8 data:4byte
nextPublicID = .sbss:0x805A9A50; // type:object size:0x4 scope:local data:4byte
streamCallDelay = .sbss:0x805A9A54; // type:object size:0x1 scope:local data:byte
streamCallCnt = .sbss:0x805A9A55; // type:object size:0x1 scope:local data:byte

View File

@ -239,10 +239,10 @@ def RetroLib(lib_name, objects):
}
def MusyX(objects, mw_version="GC/1.3.2", debug=False, major=1, minor=5, patch=4):
def MusyX(objects, mw_version="GC/1.3.2", debug=False, major=2, minor=0, patch=0):
cflags = cflags_musyx if not debug else cflags_musyx_debug
return {
"lib": "MusyX",
"lib": "musyx" + "D" if config.debug else "",
"mw_version": mw_version,
"host": False,
"cflags": [
@ -1040,7 +1040,9 @@ config.libs = [
DolphinLib(
"mtx",
[
Object(Matching, "Dolphin/mtx/mtx.c", cflags = [*cflags_base, "-fp_contract off"]),
Object(
Matching, "Dolphin/mtx/mtx.c", cflags=[*cflags_base, "-fp_contract off"]
),
Object(NonMatching, "Dolphin/mtx/mtx44vec.c"),
Object(NonMatching, "Dolphin/mtx/mtx44.c"),
Object(NonMatching, "Dolphin/mtx/vec.c"),
@ -1163,9 +1165,9 @@ config.libs = [
MusyX(
# debug=True,
# mw_version="GC/1.2.5",
#major=1,
#minor=5,
#patch=3,
# major=2,
# minor=0,
# patch=0,
objects=[
Object(Matching, "musyx/runtime/seq.c"),
Object(Matching, "musyx/runtime/synth.c"),
@ -1222,6 +1224,12 @@ config.libs = [
Object(NonMatching, "musyx/txwin/txwin.c"),
],
},
DolphinLib(
"Dummy",
[
Object(Matching, "Dolphin/dummy.c"),
],
),
DolphinLib(
"dtk",
[

View File

@ -27,7 +27,7 @@ static inline void __SOME_ASSERT_DERP() { __SOME_ASSERT_DERP2() != 0; }
#ifndef MUSY_ASSERT_MSG
#ifdef _DEBUG
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0)
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1)
#define MUSY_ASSERT_MSG(cond, msg) \
do { \
s32 tmp = 1; \

View File

@ -29,6 +29,7 @@ void hwExitSampleMem();
void hwSetVirtualSampleLoopBuffer(u32 voice, void* addr, u32 len);
u16 hwGetSampleID(u32 voice);
u8 hwGetSampleType(u32 voice);
void hwChangeStudioMix(u8 studio, u32 isMaster);
#ifdef __cplusplus
}

View File

@ -903,7 +903,6 @@ void synthInit(u32 mixFrq, u32 numVoices);
void synthSetBpm(u32 pbm, u8 set, u8 section);
void synthFXCloneMidiSetup(SYNTH_VOICE* dest, SYNTH_VOICE* src);
void synthSetMusicVolumeType(u8 vGroup, u8 type);
void synthAddJob(SYNTH_VOICE* svoice, SYNTH_JOBTYPE jobType, u32 deltaTime);
extern s32 synthGlobalVariable[16];
extern u16 voicePrioSortRootListRoot;
@ -962,6 +961,14 @@ extern SYNTH_MESSAGE_CALLBACK synthMessageCallback;
void salApplyMatrix(const SND_FMATRIX* a, const SND_FVECTOR* b, SND_FVECTOR* out);
f32 salNormalizeVector(SND_FVECTOR* vec);
void salCrossProduct(SND_FVECTOR* out, const SND_FVECTOR* a, const SND_FVECTOR* b);
#define SAL_CROSS_PRODUCT(out, a, b) \
do { \
out.x = (a.y * b.z) - (a.z * b.y); \
out.y = (a.z * b.x) - (a.x * b.z); \
out.z = (a.x * b.y) - (a.y * b.x); \
} while (0)
void salInvertMatrix(SND_FMATRIX* out, const SND_FMATRIX* in);
/* hardware */

View File

@ -62,7 +62,7 @@ typedef struct PRG_STATE {
u16 macId; // offset 0x0, size 0x2
u8 priority; // offset 0x2, size 0x1
u8 maxVoices; // offset 0x3, size 0x1
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0)
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1)
u8 program; // offset 0x4, size 0x1
#endif
} PRG_STATE;

View File

@ -26,7 +26,7 @@ bool synthSendKeyOff(SND_VOICEID vid);
SND_VOICEID synthFXStart(u16 fid, u8 vol, u8 pan, u8 studio, u32 itd);
void synthVolume(u8 volume, u16 time, u8 vGroup, u8 seqMode, u32 seqId);
u32 synthStartSound(u16 id, u8 prio, u8 max,
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0)
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1)
u32 sourceID,
#endif
u8 key, u8 vol, u8 panning, u8 midi, u8 midiSet, u8 section, u16 step,
@ -41,6 +41,13 @@ MSTEP* dataGetMacro(u16 mid);
u32 voiceAllocate(u8 priority, u8 maxVoices, u16 allocId, u8 fxFlag);
void voiceFree(SYNTH_VOICE* svoice);
void synthActivateStudio(u8 studio, u32 isMaster, SND_STUDIO_TYPE type);
void synthDeactivateStudio(u8 studio);
u8 synthFXGetMaxVoices(u16 fid);
void synthPauseVolume(u8 volume, u16 time, u8 vGroup);
bool dataRemoveFX(u16 gid);
#ifdef __cplusplus
}
#endif

View File

@ -7,15 +7,15 @@
#endif
#ifndef MUSY_VERSION_MAJOR
#define MUSY_VERSION_MAJOR 1
#define MUSY_VERSION_MAJOR 2
#endif
#ifndef MUSY_VERSION_MINOR
#define MUSY_VERSION_MINOR 5
#define MUSY_VERSION_MINOR 0
#endif
#ifndef MUSY_VERSION_PATCH
#define MUSY_VERSION_PATCH 3
#define MUSY_VERSION_PATCH 0
#endif

2
src/Dolphin/dummy.c Normal file
View File

@ -0,0 +1,2 @@
#pragma force_active on
__declspec(section ".data") char dummy[4];

View File

@ -3,10 +3,8 @@
#include "dolphin/dsp.h"
#include "musyx/dsp_import.h"
/* Is this actually what factor 5 did? They specify 0x2000 for the dram size, but the next TU winds
* up incorrectly aligned */
static DSPTaskInfo dsp_task ATTRIBUTE_ALIGN(8);
static u16 dram_image[4096 + 4] ATTRIBUTE_ALIGN(32);
static u16 dram_image[4096] ATTRIBUTE_ALIGN(32);
static volatile u32 oldState = 0;
static volatile u16 hwIrqLevel = 0;

View File

@ -1,5 +1,6 @@
#include "musyx/musyx_priv.h"
#include "musyx/synth.h"
static GSTACK gs[128];
static s16 sp;

View File

@ -288,7 +288,7 @@ static void DoPrgChange(SEQ_INSTANCE* seq, u8 prg, u8 midi) {
seq->prgState[midi].macId = seq->normtab[prg].macro;
seq->prgState[midi].priority = seq->normtab[prg].prio;
seq->prgState[midi].maxVoices = seq->normtab[prg].maxVoices;
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0)
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1)
seq->prgState[midi].program = prg;
#endif
return;
@ -302,7 +302,7 @@ static void DoPrgChange(SEQ_INSTANCE* seq, u8 prg, u8 midi) {
seq->prgState[midi].macId = seq->drumtab[prg].macro;
seq->prgState[midi].priority = seq->drumtab[prg].prio;
seq->prgState[midi].maxVoices = seq->drumtab[prg].maxVoices;
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0)
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1)
seq->prgState[midi].program = prg;
#endif
}
@ -1175,7 +1175,7 @@ static SEQ_EVENT* HandleEvent(SEQ_EVENT* event, u8 secIndex, u32* loopFlag) {
if ((note = AllocateNote(event->time + pe->length, secIndex)) != NULL) {
if ((note->id = synthStartSound(
macId, cseq->prgState[midi].priority, cseq->prgState[midi].maxVoices,
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0)
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1)
cseq->groupID | (cseq->prgState[midi].program << 16) |
((midi == 9 ? 1 : 0) << 24),
#endif

View File

@ -15,7 +15,7 @@ static u8 s3dUseMaxVoices;
static void UpdateRoomDistances() {
SND_ROOM* r; // r30
SND_LISTENER* li; // r31
float distance; // r63
f32 distance; // r63
u32 n; // r29
SND_FVECTOR d; // r1+0x8
@ -39,15 +39,15 @@ static void UpdateRoomDistances() {
}
}
static CheckRoomStatus() {
static void CheckRoomStatus() {
SND_LISTENER* li; // r30
SND_EMITTER* em; // r28
SND_ROOM* r; // r27
SND_ROOM* max_room; // r29
SND_ROOM* room; // r31
SND_FVECTOR d; // r1+0x8
float distance; // r63
float maxDis; // r62
f32 distance; // r63
f32 maxDis; // r62
u32 li_num; // r25
u32 i; // r26
u32 mask; // r23
@ -78,7 +78,89 @@ static CheckRoomStatus() {
break;
}
}
// TODO: Finish
mask = ~(-1 << snd_max_studios);
if (mask != (snd_used_studios & mask)) {
for (i = 0; i < snd_max_studios; ++i) {
if (!(snd_used_studios & (1 << i))) {
break;
}
}
snd_used_studios |= (1 << i);
room->studio = i + snd_base_studio;
} else {
maxDis = -1.f;
for (r = s3dRoomRoot; r != NULL; r = r->next) {
if (r->studio != 0xFF && maxDis < r->distance) {
maxDis = r->distance;
max_room = r;
}
}
if (has_listener || maxDis > distance) {
for (em = s3dEmitterRoot; em != NULL; em = em->next) {
if (em->room == max_room) {
synthSendKeyOff(em->vid);
em->flags |= 0x80000;
em->vid = -1;
}
}
if (max_room->deActivateReverb != NULL) {
max_room->deActivateReverb(max_room->studio);
}
synthDeactivateStudio(max_room->studio);
room->studio = max_room->studio;
max_room->studio = 0xff;
max_room->flags = 0;
} else {
continue;
}
}
room->distance = distance;
room->curMVol = has_listener ? 0x7f0000 : 0;
if (room->curMVol * 1.201479e-07f >= 0.5) {
synthActivateStudio(room->studio, TRUE, SND_STUDIO_TYPE_STD);
} else {
synthActivateStudio(room->studio, FALSE, SND_STUDIO_TYPE_STD);
}
if (room->activateReverb != NULL) {
room->activateReverb(room->studio, room->user);
}
} else {
if (room->flags & 0x80000000) {
room->curMVol += 0x40000;
if (room->curMVol >= 0x7F0000) {
room->curMVol = 0x7F0000;
room->flags &= ~0x80000000;
}
if (room->curMVol * 1.201479e-07f >= 0.5) {
synthActivateStudio(room->studio, TRUE, SND_STUDIO_TYPE_STD);
} else {
synthActivateStudio(room->studio, FALSE, SND_STUDIO_TYPE_STD);
}
}
if ((room->flags & 0x40000000) != 0) {
room->curMVol = room->curMVol - 0x40000;
if ((int)room->curMVol >= 0) {
room->curMVol = 0;
room->flags &= ~0x40000000;
}
if (room->curMVol * 1.201479e-07f >= 0.5) {
synthActivateStudio(room->studio, TRUE, SND_STUDIO_TYPE_STD);
} else {
synthActivateStudio(room->studio, FALSE, SND_STUDIO_TYPE_STD);
}
}
}
}
}
@ -181,8 +263,8 @@ static void RemoveListenerFromRoom(SND_ROOM* room) {
}
static void CalcDoorParameters(SND_DOOR* door) {
float f; // r1+0xC
float v; // r63
f32 f; // r1+0xC
f32 v; // r63
v = door->open;
f = (1.f - door->open) * door->dampen;
door->input.volA = door->fxVol * v;
@ -222,8 +304,8 @@ static void CheckDoorStatus() {
}
}
bool sndAddDoor(SND_DOOR* door, SND_ROOM* a, SND_ROOM* b, SND_FVECTOR* pos, float dampen,
float open, unsigned char fxVol, s16 filterCoef[4], u32 flags) {
bool sndAddDoor(SND_DOOR* door, SND_ROOM* a, SND_ROOM* b, SND_FVECTOR* pos, f32 dampen, f32 open,
unsigned char fxVol, s16 filterCoef[4], u32 flags) {
hwDisableIrq();
@ -258,19 +340,94 @@ bool sndRemoveDoor(SND_DOOR* door) {
return 1;
}
static void CalcEmitter(struct SND_EMITTER* em, float* vol, float* doppler, float* xPan,
float* yPan, float* zPan) {
static void CalcEmitter(struct SND_EMITTER* em, f32* vol, f32* doppler, f32* xPan, f32* yPan,
f32* zPan) {
SND_LISTENER* li; // r31
SND_FVECTOR d; // r1+0x44
SND_FVECTOR v; // r1+0x38
SND_FVECTOR p; // r1+0x2C
float relspeed; // r60
float distance; // r61
float new_distance; // r59
float ft; // r63
float vd; // r62
f32 relspeed; // r60
f32 distance; // r61
f32 new_distance; // r59
f32 ft; // r63
f32 vd; // r62
SND_FVECTOR pan; // r1+0x20
unsigned long n; // r29
u32 n; // r29
ft = 1.f / 60.f;
*vol = 0.f;
*doppler = 1.f;
pan.x = pan.y = pan.z = 0.f;
for (n = 0, li = s3dListenerRoot; li != NULL; li = li->next, ++n) {
d.x = em->pos.x - (li->pos.x + li->heading.x * li->volPosOff);
d.y = em->pos.y - (li->pos.y + li->heading.y * li->volPosOff);
d.z = em->pos.z - (li->pos.z + li->heading.z * li->volPosOff);
distance = sqrtf(d.x * d.x + d.y * d.y + d.z * d.z);
if (em->maxDis >= distance) {
vd = distance / em->maxDis;
if (em->volPush >= 0.f) {
*vol +=
li->vol * (em->minVol + (em->maxVol - em->minVol) *
(1.f - ((1.f - em->volPush) * vd + em->volPush * vd * vd)));
} else {
*vol +=
li->vol * (em->minVol + (em->maxVol - em->minVol) *
(1.f - ((em->volPush + 1.f) * vd -
em->volPush * (1.f - (1.f - vd) * (1.f - vd)))));
}
if (!(em->flags & 0x80000)) {
if ((em->flags & 0x8) || (li->flags & 1)) {
v.x = li->dir.x - em->dir.x;
v.y = li->dir.y - em->dir.y;
v.z = li->dir.z - em->dir.z;
relspeed = sqrtf(v.x * v.x + v.y * v.y + v.z * v.z);
if (relspeed > 0.f) {
d.x = (em->pos.x + em->dir.x * ft) - (li->pos.x + li->dir.x * ft);
d.y = (em->pos.y + em->dir.y * ft) - (li->pos.y + li->dir.y * ft);
d.z = (em->pos.z + em->dir.z * ft) - (li->pos.z + li->dir.z * ft);
new_distance = sqrtf(d.x * d.x + d.y * d.y + d.z * d.z);
if (new_distance < distance) {
*doppler = li->soundSpeed / (li->soundSpeed - relspeed);
} else {
*doppler = li->soundSpeed / (li->soundSpeed + relspeed);
}
}
}
if (distance != 0.f) {
salApplyMatrix(&li->mat, &em->pos, &p);
if (p.z <= 0.f) {
pan.z += -li->surroundDisFront < p.z ? -p.z / li->surroundDisFront : 1.f;
} else {
pan.z += li->surroundDisBack > p.z ? -p.z / li->surroundDisBack : -1.f;
}
if (p.x != 0.f || p.y != 0.f || p.z != 0.f) {
salNormalizeVector(&p);
}
pan.x += p.x;
pan.y -= p.y;
}
}
}
}
if (n != 0) {
*xPan = pan.x / n;
*yPan = pan.y / n;
*zPan = pan.z / n;
}
}
static u8 clip127(u8 v) {
@ -287,8 +444,7 @@ static u16 clip3FFF(u32 v) {
return v;
}
static void SetFXParameters(SND_EMITTER* em, float vol, float xPan, float yPan, float zPan,
float doppler) {
static void SetFXParameters(SND_EMITTER* em, f32 vol, f32 xPan, f32 yPan, f32 zPan, f32 doppler) {
SND_VOICEID vid; // r30
u8 i; // r28
SND_PARAMETER* pPtr; // r31
@ -377,15 +533,15 @@ bool sndCheckEmitter(SND_EMITTER* em) {
}
static SND_VOICEID AddEmitter(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir,
float maxDis, float comp, u32 flags, u16 fxid, u32 groupid, u8 maxVol,
f32 maxDis, f32 comp, u32 flags, u16 fxid, u32 groupid, u8 maxVol,
u8 minVol, SND_ROOM* room, SND_PARAMETER_INFO* para, u8 studio) {
SND_EMITTER* em; // r31
float xPan; // r1+0x3C
float yPan; // r1+0x38
float zPan; // r1+0x34
float cvol; // r1+0x30
float pitch; // r1+0x2C
static SND_EMITTER tmp_em;
SND_EMITTER* em; // r31
f32 xPan; // r1+0x3C
f32 yPan; // r1+0x38
f32 zPan; // r1+0x34
f32 cvol; // r1+0x30
f32 pitch; // r1+0x2C
hwDisableIrq();
em = em_buffer == NULL ? &tmp_em : em_buffer;
@ -419,12 +575,11 @@ static SND_VOICEID AddEmitter(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVEC
if (em->vid == -1) {
hwEnableIrq();
return -1;
} else {
}
SetFXParameters(em, cvol, xPan, yPan, zPan, pitch);
hwEnableIrq();
return em->vid;
}
}
} else {
if ((em->next = s3dEmitterRoot) != NULL) {
s3dEmitterRoot->prev = em;
@ -437,13 +592,14 @@ static SND_VOICEID AddEmitter(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVEC
em->VolLevelCnt = 0;
em->flags |= 0x30000;
em->maxVoices = synthFXGetMaxVoices(em->fxid);
}
hwEnableIrq();
return -1;
}
}
unsigned long sndAddEmitter(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir,
float maxDis, float comp, unsigned long flags, unsigned short fxid,
unsigned long sndAddEmitter(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis,
f32 comp, unsigned long flags, unsigned short fxid,
unsigned char maxVol, unsigned char minVol, SND_ROOM* room) {
if (sndActive) {
return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, fxid | 0x80000000, maxVol,
@ -454,9 +610,9 @@ unsigned long sndAddEmitter(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTO
}
unsigned long sndAddEmitterEx(struct SND_EMITTER* em_buffer, struct SND_FVECTOR* pos,
struct SND_FVECTOR* dir, float maxDis, float comp,
unsigned long flags, unsigned short fxid, unsigned short groupid,
unsigned char maxVol, unsigned char minVol, struct SND_ROOM* room) {
struct SND_FVECTOR* dir, f32 maxDis, f32 comp, unsigned long flags,
unsigned short fxid, unsigned short groupid, unsigned char maxVol,
unsigned char minVol, struct SND_ROOM* room) {
if (sndActive) {
return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, groupid, maxVol, minVol, room,
NULL, 0);
@ -466,10 +622,9 @@ unsigned long sndAddEmitterEx(struct SND_EMITTER* em_buffer, struct SND_FVECTOR*
}
unsigned long sndAddEmitterPara(struct SND_EMITTER* em_buffer, struct SND_FVECTOR* pos,
struct SND_FVECTOR* dir, float maxDis, float comp,
unsigned long flags, unsigned short fxid, unsigned char maxVol,
unsigned char minVol, struct SND_ROOM* room,
struct SND_PARAMETER_INFO* para) {
struct SND_FVECTOR* dir, f32 maxDis, f32 comp, unsigned long flags,
unsigned short fxid, unsigned char maxVol, unsigned char minVol,
struct SND_ROOM* room, struct SND_PARAMETER_INFO* para) {
if (sndActive) {
return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, fxid | 0x80000000, maxVol,
minVol, room, para, 0);
@ -478,7 +633,7 @@ unsigned long sndAddEmitterPara(struct SND_EMITTER* em_buffer, struct SND_FVECTO
}
unsigned long sndAddEmitterParaEx(struct SND_EMITTER* em_buffer, struct SND_FVECTOR* pos,
struct SND_FVECTOR* dir, float maxDis, float comp,
struct SND_FVECTOR* dir, f32 maxDis, f32 comp,
unsigned long flags, unsigned short fxid, unsigned short groupid,
unsigned char maxVol, unsigned char minVol, struct SND_ROOM* room,
struct SND_PARAMETER_INFO* para) {
@ -491,7 +646,7 @@ unsigned long sndAddEmitterParaEx(struct SND_EMITTER* em_buffer, struct SND_FVEC
}
unsigned long sndAddEmitter2Studio(struct SND_EMITTER* em_buffer, struct SND_FVECTOR* pos,
struct SND_FVECTOR* dir, float maxDis, float comp,
struct SND_FVECTOR* dir, f32 maxDis, f32 comp,
unsigned long flags, unsigned short fxid, unsigned char maxVol,
unsigned char minVol, unsigned char studio) {
if (sndActive) {
@ -502,7 +657,7 @@ unsigned long sndAddEmitter2Studio(struct SND_EMITTER* em_buffer, struct SND_FVE
}
unsigned long sndAddEmitter2StudioEx(struct SND_EMITTER* em_buffer, struct SND_FVECTOR* pos,
struct SND_FVECTOR* dir, float maxDis, float comp,
struct SND_FVECTOR* dir, f32 maxDis, f32 comp,
unsigned long flags, unsigned short fxid,
unsigned short groupid, unsigned char maxVol,
unsigned char minVol, unsigned char studio) {
@ -514,7 +669,7 @@ unsigned long sndAddEmitter2StudioEx(struct SND_EMITTER* em_buffer, struct SND_F
}
unsigned long sndAddEmitter2StudioPara(struct SND_EMITTER* em_buffer, struct SND_FVECTOR* pos,
struct SND_FVECTOR* dir, float maxDis, float comp,
struct SND_FVECTOR* dir, f32 maxDis, f32 comp,
unsigned long flags, unsigned short fxid,
unsigned char maxVol, unsigned char minVol,
unsigned char studio, struct SND_PARAMETER_INFO* para) {
@ -526,7 +681,7 @@ unsigned long sndAddEmitter2StudioPara(struct SND_EMITTER* em_buffer, struct SND
}
unsigned long sndAddEmitter2StudioParaEx(struct SND_EMITTER* em_buffer, struct SND_FVECTOR* pos,
struct SND_FVECTOR* dir, float maxDis, float comp,
struct SND_FVECTOR* dir, f32 maxDis, f32 comp,
unsigned long flags, unsigned short fxid,
unsigned short groupid, unsigned char maxVol,
unsigned char minVol, unsigned char studio,
@ -643,9 +798,9 @@ unsigned long sndUpdateListener(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR*
}
unsigned long sndAddListenerEx(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR* dir,
SND_FVECTOR* heading, SND_FVECTOR* up, float front_sur,
float back_sur, float soundSpeed, float volPosOffset,
unsigned long flags, unsigned char vol, SND_ROOM* room) {
SND_FVECTOR* heading, SND_FVECTOR* up, f32 front_sur, f32 back_sur,
f32 soundSpeed, f32 volPosOffset, unsigned long flags,
unsigned char vol, SND_ROOM* room) {
if (sndActive) {
hwDisableIrq();
@ -678,8 +833,8 @@ unsigned long sndAddListenerEx(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR*
}
unsigned long sndAddListener(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR* dir,
SND_FVECTOR* heading, SND_FVECTOR* up, float front_sur, float back_sur,
float soundSpeed, unsigned long flags, unsigned char vol,
SND_FVECTOR* heading, SND_FVECTOR* up, f32 front_sur, f32 back_sur,
f32 soundSpeed, unsigned long flags, unsigned char vol,
SND_ROOM* room) {
return sndAddListenerEx(li, pos, dir, heading, up, front_sur, back_sur, soundSpeed, 0.f, flags,
vol, room);
@ -713,18 +868,18 @@ unsigned long sndRemoveListener(SND_LISTENER* li) {
typedef struct START_LIST {
// total size: 0x1C
struct START_LIST* next; // offset 0x0, size 0x4
float vol; // offset 0x4, size 0x4
float xPan; // offset 0x8, size 0x4
float yPan; // offset 0xC, size 0x4
float zPan; // offset 0x10, size 0x4
float pitch; // offset 0x14, size 0x4
f32 vol; // offset 0x4, size 0x4
f32 xPan; // offset 0x8, size 0x4
f32 yPan; // offset 0xC, size 0x4
f32 zPan; // offset 0x10, size 0x4
f32 pitch; // offset 0x14, size 0x4
SND_EMITTER* em; // offset 0x18, size 0x4
} START_LIST;
typedef struct RUN_LIST {
// total size: 0xC
struct RUN_LIST* next; // offset 0x0, size 0x4
float vol; // offset 0x4, size 0x4
f32 vol; // offset 0x4, size 0x4
SND_EMITTER* em; // offset 0x8, size 0x4
} RUN_LIST;
@ -749,7 +904,7 @@ void ClearStartList() {
runListNum = 0;
}
void AddRunningEmitter(SND_EMITTER* em, float vol) {
void AddRunningEmitter(SND_EMITTER* em, f32 vol) {
long i; // r30
RUN_LIST* rl; // r29
RUN_LIST* lrl; // r28
@ -789,8 +944,7 @@ void AddRunningEmitter(SND_EMITTER* em, float vol) {
runList[runListNum++].vol = vol;
}
bool AddStartingEmitter(SND_EMITTER* em, float vol, float xPan, float yPan, float zPan,
float pitch) {
bool AddStartingEmitter(SND_EMITTER* em, f32 vol, f32 xPan, f32 yPan, f32 zPan, f32 pitch) {
long i; // r30
START_LIST* sl; // r29
@ -845,17 +999,153 @@ void StartContinousEmitters() {
long i; // r30
START_LIST* sl; // r29
SND_EMITTER* em; // r31
float dv; // r63
f32 dv; // r63
for (i = 0; i < startGroupNum; ++i) {
for (sl = startGroup[i].list; sl != NULL; sl = sl->next) {
if ((startGroup[i].running != NULL) &&
!(((s3dUseMaxVoices != '\0' && ((startGroup[i].id & 0x80000000) != 0)) &&
(startGroup[i].numRunning < startGroup[i].list->em->maxVoices)))) {
dv = sl->vol - (startGroup[i].running)->vol;
if (dv <= 0.08f) {
continue;
} else if (dv <= 0.15f) {
if (++sl->em->VolLevelCnt < 20) {
continue;
}
} else {
sl->em->VolLevelCnt = 0;
}
}
em = sl->em;
if (em->room != NULL && em->room->studio == 0xFF) {
goto set_flags;
}
if ((em->vid =
synthFXStart(em->fxid, 127, 64, em->room != NULL ? em->room->studio : em->studio,
(em->flags & 0x10) != 0)) == -1) {
set_flags:
if (!(em->flags & 0x2)) {
em->flags |= 0x40000;
em->flags &= ~0x20000;
}
} else {
if (!(em->flags & 0x20)) {
em->flags |= 0x100000;
em->fade = 0.f;
} else {
em->fade = 1.f;
}
SetFXParameters(em, sl->vol, sl->xPan, sl->yPan, sl->zPan, sl->pitch);
em->flags &= ~0x20000;
++startGroup[i].numRunning;
if (startGroup[i].running != NULL) {
startGroup[i].running = startGroup[i].running->next;
}
}
}
}
}
void s3dHandle() {
SND_EMITTER* em; // r31
SND_EMITTER* nem; // r30
float vol; // r1+0x18
float xPan; // r1+0x14
float yPan; // r1+0x10
float zPan; // r1+0xC
float pitch; // r1+0x8
f32 vol; // r1+0x18
f32 xPan; // r1+0x14
f32 yPan; // r1+0x10
f32 zPan; // r1+0xC
f32 pitch; // r1+0x8
if (s3dCallCnt != 0) {
--s3dCallCnt;
return;
}
s3dCallCnt = 3;
ClearStartList();
em = s3dEmitterRoot;
for (; em != NULL; em = nem) {
nem = em->next;
if ((em->flags & 0x40000) != 0) {
EmitterShutdown(em);
continue;
}
if ((em->flags & 0x20001) != 0) {
CalcEmitter(em, &vol, &pitch, &xPan, &yPan, &zPan);
}
if (!(em->flags & 0x80000)) {
if (em->flags & 0x20000) {
if (vol == 0.f && em->flags & 0x4) {
em->flags |= 0x80000;
em->flags &= ~0x20000;
goto found_emitter;
} else if (vol == 0.f && em->flags & 0x40) {
EmitterShutdown(em);
continue;
}
if (em->flags & 1) {
if (AddStartingEmitter(em, vol, xPan, yPan, zPan, pitch)) {
continue;
}
} else if (em->room == NULL || em->room->studio != 0xFF) {
if ((em->vid =
synthFXStart(em->fxid, 127, 64, em->room != NULL ? em->room->studio : em->studio,
(em->flags & 0x10) != 0)) == -1) {
derp:
if (!(em->flags & 2)) {
em->flags |= 0x40000;
em->flags &= ~0x20000;
} else {
continue;
}
}
} else {
goto derp;
}
} else if ((em->vid = sndFXCheck(em->vid)) == -1) {
if ((em->flags & 2)) {
em->flags |= 0x20000;
} else {
em->flags |= 0x40000;
}
}
found_emitter:
if (em->vid != -1) {
if ((em->flags & 1) != 0) {
AddRunningEmitter(em, vol);
}
if ((vol == 0.f) && ((em->flags & 4) != 0)) {
synthSendKeyOff(em->vid);
em->vid = 0xffffffff;
if ((em->flags & 2)) {
em->flags |= 0x80000;
} else {
em->flags |= 0x40000;
}
} else {
SetFXParameters(em, vol, xPan, yPan, zPan, pitch);
}
}
if ((em->flags & 0x100000) != 0) {
em->fade += .3f;
if (em->fade >= 1.f) {
em->flags &= ~0x100000;
}
}
} else if ((em->room == NULL || (em->room != NULL && em->room->studio != 0xff)) && vol != 0.f) {
em->flags &= ~0x80000;
em->flags |= 0x20000;
}
}
StartContinousEmitters();
CheckRoomStatus();
CheckDoorStatus();
}
void sndSetup3DStudios(unsigned char first, unsigned char num) {
@ -865,11 +1155,11 @@ void sndSetup3DStudios(unsigned char first, unsigned char num) {
void sndGet3DParameters(SND_3DINFO* info, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis, f32 comp,
u8 maxVol, u8 minVol, SND_ROOM* room) {
float xPan; // r1+0x34
float yPan; // r1+0x30
float zPan; // r1+0x2C
float cvol; // r1+0x28
float pitch; // r1+0x24
f32 xPan; // r1+0x34
f32 yPan; // r1+0x30
f32 zPan; // r1+0x2C
f32 cvol; // r1+0x28
f32 pitch; // r1+0x24
static SND_EMITTER em;
hwDisableIrq();

View File

@ -31,6 +31,8 @@ u8 synthAuxBMIDI[8];
u8 synthAuxBMIDISet[8];
u8 synthTrackVolume[64]; // size: 0x40
static void synthAddJob(SYNTH_VOICE* svoice, SYNTH_JOBTYPE jobType, u32 deltaTime);
void synthSetBpm(u32 bpm, u8 set, u8 section) {
if (set == 0xFF) {
set = 8;
@ -323,7 +325,7 @@ static void unblockAllAllocatedVoices(u32 vid) {
#endif
u32 synthStartSound(u16 id, u8 prio, u8 max,
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0)
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1)
u32 sourceID,
#endif
u8 key, u8 vol, u8 panning, u8 midi, u8 midiSet, u8 section, u16 step,
@ -931,7 +933,7 @@ u32 synthFXStart(u16 fid, u8 vol, u8 pan, u8 studio, u32 itd) {
}
v = synthStartSound(fx->macro, fx->priority, fx->maxVoices,
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0)
#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1)
0, // TODO
#endif
fx->key | 0x80, vol, pan, 0xFF, 0xFF, 0, 0, 0xFF, fx->vGroup, 0, studio,

View File

@ -251,7 +251,7 @@ unsigned long sndVirtualSampleAllocateBuffers(unsigned char numInstances,
return 0;
}
void sndVirtualSampleFreeBuffers() {
s32 sndVirtualSampleFreeBuffers() {
u8 i; // r31
#line 481
MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized.");