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: musyx/runtime/hw_dolphin.c:
.text start:0x803B4C3C end:0x803B5134 .text start:0x803B4C3C end:0x803B5134
.bss start:0x805678A0 end:0x80569908 .bss start:0x805678A0 end:0x80569900
.sbss start:0x805A9B70 end:0x805A9B98 .sbss start:0x805A9B70 end:0x805A9B98
Dolphin/dummy.c:
.bss start:0x80569900 end:0x80569908
musyx/runtime/hw_memory.c: musyx/runtime/hw_memory.c:
.text start:0x803B5134 end:0x803B5188 .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_803F422C = .data:0x803F422C; // type:object size:0x24 scope:local
jumptable_803F4250 = .data:0x803F4250; // 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 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:0x803F6460; // type:object size:0x10 scope:local
lens$115 = .data:0x803F6470; // type:object size:0x20 scope:local lens$115 = .data:0x803F6470; // type:object size:0x20 scope:local
rsmpTab12khz = .data:0x803F6490; // type:object size:0x800 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 D35 = .data:0x803F71A0; // type:object size:0x380 scope:local
@12 = .data:0x803F7520; // type:object size:0x9 scope:local data:string @12 = .data:0x803F7520; // type:object size:0x9 scope:local data:string
@13 = .data:0x803F752C; // type:object size:0x1A 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 sMainSpace = .bss:0x80457560; // type:object size:0x168 scope:local
lbl_804576C8 = .bss:0x804576C8; // type:object size:0xD0 lbl_804576C8 = .bss:0x804576C8; // type:object size:0xD0
lbl_80457798 = .bss:0x80457798; // type:object size:0x160 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 rs_debugger_buffer = .bss:0x804797A0; // type:object size:0x400 scope:local
lbl_80479BA0 = .bss:0x80479BA0; // type:object size:0x30 lbl_80479BA0 = .bss:0x80479BA0; // type:object size:0x30
sVtxDescList = .bss:0x80479BD0; // type:object size:0xF0 scope:local data:4byte 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 kEnvBlendCTandCConCF = .bss:0x804BFCC0; // type:object size:0x50 scope:local
sLoadedTextures = .bss:0x804BFD10; // type:object size:0x20 scope:local sLoadedTextures = .bss:0x804BFD10; // type:object size:0x20 scope:local
XAxis = .bss:0x804BFD30; // type:object size:0xC scope:local data:float 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_804BFF90 = .bss:0x804BFF90; // type:object size:0x10
lbl_804BFFA0 = .bss:0x804BFFA0; // type:object size:0xC lbl_804BFFA0 = .bss:0x804BFFA0; // type:object size:0xC
lbl_804BFFAC = .bss:0x804BFFAC; // type:object size:0x14 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 sSkinningBuffer__8Skinning = .bss:0x8053FFCC; // type:object size:0x28 scope:local data:byte
sAllocations__8Skinning = .bss:0x8053FFF4; // type:object size:0x1C scope:local sAllocations__8Skinning = .bss:0x8053FFF4; // type:object size:0x1C scope:local
lbl_80540010 = .bss:0x80540010; // type:object size:0x10 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_80540520 = .bss:0x80540520; // type:object size:0x30
lbl_80540550 = .bss:0x80540550; // type:object size:0x30 lbl_80540550 = .bss:0x80540550; // type:object size:0x30
lbl_80540580 = .bss:0x80540580; // type:object size:0x64 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 lbl_80540A4C = .bss:0x80540A4C; // type:object size:0x34
CommandList = .bss:0x80540A80; // type:object size:0x3C scope:local data:4byte CommandList = .bss:0x80540A80; // type:object size:0x3C scope:local data:4byte
...bss.0 = .bss:0x80540A80; // type:label scope:local ...bss.0 = .bss:0x80540A80; // type:label scope:local
AlarmForWA = .bss:0x80540AC0; // 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 AlarmForTimeout = .bss:0x80540AE8; // type:object size:0x28 scope:local align:8
AlarmForBreak = .bss:0x80540B10; // type:object size:0x28 scope:local AlarmForBreak = .bss:0x80540B10; // type:object size:0x28 scope:local align:8
Prev = .bss:0x80540B38; // type:object size:0xC scope:local Prev = .bss:0x80540B38; // type:object size:0xC scope:local
Curr = .bss:0x80540B44; // 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 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 __OSErrorTable = .bss:0x80541250; // type:object size:0x44 scope:global data:4byte
...bss.0 = .bss:0x80541250; // type:label scope:local ...bss.0 = .bss:0x80541250; // type:label scope:local
lbl_80541298 = .bss:0x80541298; // type:object size:0x2E8 data:4byte 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 Scb = .bss:0x805415A0; // type:object size:0x54 scope:local align:32 data:4byte
...bss.0 = .bss:0x805415A0; // type:label scope:local ...bss.0 = .bss:0x805415A0; // type:label scope:local
RunQueue = .bss:0x805415F8; // type:object size:0x100 scope:local data:4byte 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 aramQueueHi = .bss:0x80567214; // type:object size:0x284 scope:local
aramStreamBuffers = .bss:0x80567498; // type:object size:0x400 scope:local data:4byte aramStreamBuffers = .bss:0x80567498; // type:object size:0x400 scope:local data:4byte
dsp_task = .bss:0x805678A0; // type:object size:0x50 scope:local align:8 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_run_callback = .bss:0x80569908; // type:object size:0x30 scope:local
__block_for_prep_callback = .bss:0x80569938; // 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 __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 synthVoice = .sbss:0x805A9A38; // type:object size:0x4 scope:global data:4byte
synthMessageCallback = .sbss:0x805A9A3C; // 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 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 nextPublicID = .sbss:0x805A9A50; // type:object size:0x4 scope:local data:4byte
streamCallDelay = .sbss:0x805A9A54; // type:object size:0x1 scope:local data:byte streamCallDelay = .sbss:0x805A9A54; // type:object size:0x1 scope:local data:byte
streamCallCnt = .sbss:0x805A9A55; // 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 cflags = cflags_musyx if not debug else cflags_musyx_debug
return { return {
"lib": "MusyX", "lib": "musyx" + "D" if config.debug else "",
"mw_version": mw_version, "mw_version": mw_version,
"host": False, "host": False,
"cflags": [ "cflags": [
@ -1040,7 +1040,9 @@ config.libs = [
DolphinLib( DolphinLib(
"mtx", "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/mtx44vec.c"),
Object(NonMatching, "Dolphin/mtx/mtx44.c"), Object(NonMatching, "Dolphin/mtx/mtx44.c"),
Object(NonMatching, "Dolphin/mtx/vec.c"), Object(NonMatching, "Dolphin/mtx/vec.c"),
@ -1163,9 +1165,9 @@ config.libs = [
MusyX( MusyX(
# debug=True, # debug=True,
# mw_version="GC/1.2.5", # mw_version="GC/1.2.5",
#major=1, # major=2,
#minor=5, # minor=0,
#patch=3, # patch=0,
objects=[ objects=[
Object(Matching, "musyx/runtime/seq.c"), Object(Matching, "musyx/runtime/seq.c"),
Object(Matching, "musyx/runtime/synth.c"), Object(Matching, "musyx/runtime/synth.c"),
@ -1222,6 +1224,12 @@ config.libs = [
Object(NonMatching, "musyx/txwin/txwin.c"), Object(NonMatching, "musyx/txwin/txwin.c"),
], ],
}, },
DolphinLib(
"Dummy",
[
Object(Matching, "Dolphin/dummy.c"),
],
),
DolphinLib( DolphinLib(
"dtk", "dtk",
[ [

View File

@ -27,7 +27,7 @@ static inline void __SOME_ASSERT_DERP() { __SOME_ASSERT_DERP2() != 0; }
#ifndef MUSY_ASSERT_MSG #ifndef MUSY_ASSERT_MSG
#ifdef _DEBUG #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) \ #define MUSY_ASSERT_MSG(cond, msg) \
do { \ do { \
s32 tmp = 1; \ s32 tmp = 1; \

View File

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

View File

@ -903,7 +903,6 @@ void synthInit(u32 mixFrq, u32 numVoices);
void synthSetBpm(u32 pbm, u8 set, u8 section); void synthSetBpm(u32 pbm, u8 set, u8 section);
void synthFXCloneMidiSetup(SYNTH_VOICE* dest, SYNTH_VOICE* src); void synthFXCloneMidiSetup(SYNTH_VOICE* dest, SYNTH_VOICE* src);
void synthSetMusicVolumeType(u8 vGroup, u8 type); void synthSetMusicVolumeType(u8 vGroup, u8 type);
void synthAddJob(SYNTH_VOICE* svoice, SYNTH_JOBTYPE jobType, u32 deltaTime);
extern s32 synthGlobalVariable[16]; extern s32 synthGlobalVariable[16];
extern u16 voicePrioSortRootListRoot; 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); void salApplyMatrix(const SND_FMATRIX* a, const SND_FVECTOR* b, SND_FVECTOR* out);
f32 salNormalizeVector(SND_FVECTOR* vec); f32 salNormalizeVector(SND_FVECTOR* vec);
void salCrossProduct(SND_FVECTOR* out, const SND_FVECTOR* a, const SND_FVECTOR* b); 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); void salInvertMatrix(SND_FMATRIX* out, const SND_FMATRIX* in);
/* hardware */ /* hardware */

View File

@ -62,7 +62,7 @@ typedef struct PRG_STATE {
u16 macId; // offset 0x0, size 0x2 u16 macId; // offset 0x0, size 0x2
u8 priority; // offset 0x2, size 0x1 u8 priority; // offset 0x2, size 0x1
u8 maxVoices; // offset 0x3, 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 u8 program; // offset 0x4, size 0x1
#endif #endif
} PRG_STATE; } 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); 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); void synthVolume(u8 volume, u16 time, u8 vGroup, u8 seqMode, u32 seqId);
u32 synthStartSound(u16 id, u8 prio, u8 max, 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, u32 sourceID,
#endif #endif
u8 key, u8 vol, u8 panning, u8 midi, u8 midiSet, u8 section, u16 step, 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); u32 voiceAllocate(u8 priority, u8 maxVoices, u16 allocId, u8 fxFlag);
void voiceFree(SYNTH_VOICE* svoice); 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 #ifdef __cplusplus
} }
#endif #endif

View File

@ -7,15 +7,15 @@
#endif #endif
#ifndef MUSY_VERSION_MAJOR #ifndef MUSY_VERSION_MAJOR
#define MUSY_VERSION_MAJOR 1 #define MUSY_VERSION_MAJOR 2
#endif #endif
#ifndef MUSY_VERSION_MINOR #ifndef MUSY_VERSION_MINOR
#define MUSY_VERSION_MINOR 5 #define MUSY_VERSION_MINOR 0
#endif #endif
#ifndef MUSY_VERSION_PATCH #ifndef MUSY_VERSION_PATCH
#define MUSY_VERSION_PATCH 3 #define MUSY_VERSION_PATCH 0
#endif #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 "dolphin/dsp.h"
#include "musyx/dsp_import.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 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 u32 oldState = 0;
static volatile u16 hwIrqLevel = 0; static volatile u16 hwIrqLevel = 0;

View File

@ -1,5 +1,6 @@
#include "musyx/musyx_priv.h" #include "musyx/musyx_priv.h"
#include "musyx/synth.h"
static GSTACK gs[128]; static GSTACK gs[128];
static s16 sp; 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].macId = seq->normtab[prg].macro;
seq->prgState[midi].priority = seq->normtab[prg].prio; seq->prgState[midi].priority = seq->normtab[prg].prio;
seq->prgState[midi].maxVoices = seq->normtab[prg].maxVoices; 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; seq->prgState[midi].program = prg;
#endif #endif
return; 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].macId = seq->drumtab[prg].macro;
seq->prgState[midi].priority = seq->drumtab[prg].prio; seq->prgState[midi].priority = seq->drumtab[prg].prio;
seq->prgState[midi].maxVoices = seq->drumtab[prg].maxVoices; 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; seq->prgState[midi].program = prg;
#endif #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 = AllocateNote(event->time + pe->length, secIndex)) != NULL) {
if ((note->id = synthStartSound( if ((note->id = synthStartSound(
macId, cseq->prgState[midi].priority, cseq->prgState[midi].maxVoices, 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) | cseq->groupID | (cseq->prgState[midi].program << 16) |
((midi == 9 ? 1 : 0) << 24), ((midi == 9 ? 1 : 0) << 24),
#endif #endif

View File

@ -15,7 +15,7 @@ static u8 s3dUseMaxVoices;
static void UpdateRoomDistances() { static void UpdateRoomDistances() {
SND_ROOM* r; // r30 SND_ROOM* r; // r30
SND_LISTENER* li; // r31 SND_LISTENER* li; // r31
float distance; // r63 f32 distance; // r63
u32 n; // r29 u32 n; // r29
SND_FVECTOR d; // r1+0x8 SND_FVECTOR d; // r1+0x8
@ -39,15 +39,15 @@ static void UpdateRoomDistances() {
} }
} }
static CheckRoomStatus() { static void CheckRoomStatus() {
SND_LISTENER* li; // r30 SND_LISTENER* li; // r30
SND_EMITTER* em; // r28 SND_EMITTER* em; // r28
SND_ROOM* r; // r27 SND_ROOM* r; // r27
SND_ROOM* max_room; // r29 SND_ROOM* max_room; // r29
SND_ROOM* room; // r31 SND_ROOM* room; // r31
SND_FVECTOR d; // r1+0x8 SND_FVECTOR d; // r1+0x8
float distance; // r63 f32 distance; // r63
float maxDis; // r62 f32 maxDis; // r62
u32 li_num; // r25 u32 li_num; // r25
u32 i; // r26 u32 i; // r26
u32 mask; // r23 u32 mask; // r23
@ -78,7 +78,89 @@ static CheckRoomStatus() {
break; 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) { static void CalcDoorParameters(SND_DOOR* door) {
float f; // r1+0xC f32 f; // r1+0xC
float v; // r63 f32 v; // r63
v = door->open; v = door->open;
f = (1.f - door->open) * door->dampen; f = (1.f - door->open) * door->dampen;
door->input.volA = door->fxVol * v; 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, bool sndAddDoor(SND_DOOR* door, SND_ROOM* a, SND_ROOM* b, SND_FVECTOR* pos, f32 dampen, f32 open,
float open, unsigned char fxVol, s16 filterCoef[4], u32 flags) { unsigned char fxVol, s16 filterCoef[4], u32 flags) {
hwDisableIrq(); hwDisableIrq();
@ -258,19 +340,94 @@ bool sndRemoveDoor(SND_DOOR* door) {
return 1; return 1;
} }
static void CalcEmitter(struct SND_EMITTER* em, float* vol, float* doppler, float* xPan, static void CalcEmitter(struct SND_EMITTER* em, f32* vol, f32* doppler, f32* xPan, f32* yPan,
float* yPan, float* zPan) { f32* zPan) {
SND_LISTENER* li; // r31 SND_LISTENER* li; // r31
SND_FVECTOR d; // r1+0x44 SND_FVECTOR d; // r1+0x44
SND_FVECTOR v; // r1+0x38 SND_FVECTOR v; // r1+0x38
SND_FVECTOR p; // r1+0x2C SND_FVECTOR p; // r1+0x2C
float relspeed; // r60 f32 relspeed; // r60
float distance; // r61 f32 distance; // r61
float new_distance; // r59 f32 new_distance; // r59
float ft; // r63 f32 ft; // r63
float vd; // r62 f32 vd; // r62
SND_FVECTOR pan; // r1+0x20 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) { static u8 clip127(u8 v) {
@ -287,8 +444,7 @@ static u16 clip3FFF(u32 v) {
return v; return v;
} }
static void SetFXParameters(SND_EMITTER* em, float vol, float xPan, float yPan, float zPan, static void SetFXParameters(SND_EMITTER* em, f32 vol, f32 xPan, f32 yPan, f32 zPan, f32 doppler) {
float doppler) {
SND_VOICEID vid; // r30 SND_VOICEID vid; // r30
u8 i; // r28 u8 i; // r28
SND_PARAMETER* pPtr; // r31 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, 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) { 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; 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(); hwDisableIrq();
em = em_buffer == NULL ? &tmp_em : em_buffer; 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) { if (em->vid == -1) {
hwEnableIrq(); hwEnableIrq();
return -1; return -1;
} else { }
SetFXParameters(em, cvol, xPan, yPan, zPan, pitch); SetFXParameters(em, cvol, xPan, yPan, zPan, pitch);
hwEnableIrq(); hwEnableIrq();
return em->vid; return em->vid;
} }
}
} else { } else {
if ((em->next = s3dEmitterRoot) != NULL) { if ((em->next = s3dEmitterRoot) != NULL) {
s3dEmitterRoot->prev = em; s3dEmitterRoot->prev = em;
@ -437,13 +592,14 @@ static SND_VOICEID AddEmitter(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVEC
em->VolLevelCnt = 0; em->VolLevelCnt = 0;
em->flags |= 0x30000; em->flags |= 0x30000;
em->maxVoices = synthFXGetMaxVoices(em->fxid); em->maxVoices = synthFXGetMaxVoices(em->fxid);
}
hwEnableIrq(); hwEnableIrq();
return -1; return -1;
} }
}
unsigned long sndAddEmitter(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, unsigned long sndAddEmitter(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis,
float maxDis, float comp, unsigned long flags, unsigned short fxid, f32 comp, unsigned long flags, unsigned short fxid,
unsigned char maxVol, unsigned char minVol, SND_ROOM* room) { unsigned char maxVol, unsigned char minVol, SND_ROOM* room) {
if (sndActive) { if (sndActive) {
return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, fxid | 0x80000000, maxVol, 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, unsigned long sndAddEmitterEx(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 long flags, unsigned short fxid, unsigned short groupid, unsigned short fxid, unsigned short groupid, unsigned char maxVol,
unsigned char maxVol, unsigned char minVol, struct SND_ROOM* room) { unsigned char minVol, struct SND_ROOM* room) {
if (sndActive) { if (sndActive) {
return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, groupid, maxVol, minVol, room, return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, groupid, maxVol, minVol, room,
NULL, 0); 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, unsigned long sndAddEmitterPara(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 long flags, unsigned short fxid, unsigned char maxVol, unsigned short fxid, unsigned char maxVol, unsigned char minVol,
unsigned char minVol, struct SND_ROOM* room, struct SND_ROOM* room, struct SND_PARAMETER_INFO* para) {
struct SND_PARAMETER_INFO* para) {
if (sndActive) { if (sndActive) {
return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, fxid | 0x80000000, maxVol, return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, fxid | 0x80000000, maxVol,
minVol, room, para, 0); 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, 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 long flags, unsigned short fxid, unsigned short groupid,
unsigned char maxVol, unsigned char minVol, struct SND_ROOM* room, unsigned char maxVol, unsigned char minVol, struct SND_ROOM* room,
struct SND_PARAMETER_INFO* para) { 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, 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 long flags, unsigned short fxid, unsigned char maxVol,
unsigned char minVol, unsigned char studio) { unsigned char minVol, unsigned char studio) {
if (sndActive) { 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, 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 long flags, unsigned short fxid,
unsigned short groupid, unsigned char maxVol, unsigned short groupid, unsigned char maxVol,
unsigned char minVol, unsigned char studio) { 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, 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 long flags, unsigned short fxid,
unsigned char maxVol, unsigned char minVol, unsigned char maxVol, unsigned char minVol,
unsigned char studio, struct SND_PARAMETER_INFO* para) { 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, 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 long flags, unsigned short fxid,
unsigned short groupid, unsigned char maxVol, unsigned short groupid, unsigned char maxVol,
unsigned char minVol, unsigned char studio, 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, unsigned long sndAddListenerEx(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR* dir,
SND_FVECTOR* heading, SND_FVECTOR* up, float front_sur, SND_FVECTOR* heading, SND_FVECTOR* up, f32 front_sur, f32 back_sur,
float back_sur, float soundSpeed, float volPosOffset, f32 soundSpeed, f32 volPosOffset, unsigned long flags,
unsigned long flags, unsigned char vol, SND_ROOM* room) { unsigned char vol, SND_ROOM* room) {
if (sndActive) { if (sndActive) {
hwDisableIrq(); 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, unsigned long sndAddListener(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR* dir,
SND_FVECTOR* heading, SND_FVECTOR* up, float front_sur, float back_sur, SND_FVECTOR* heading, SND_FVECTOR* up, f32 front_sur, f32 back_sur,
float soundSpeed, unsigned long flags, unsigned char vol, f32 soundSpeed, unsigned long flags, unsigned char vol,
SND_ROOM* room) { SND_ROOM* room) {
return sndAddListenerEx(li, pos, dir, heading, up, front_sur, back_sur, soundSpeed, 0.f, flags, return sndAddListenerEx(li, pos, dir, heading, up, front_sur, back_sur, soundSpeed, 0.f, flags,
vol, room); vol, room);
@ -713,18 +868,18 @@ unsigned long sndRemoveListener(SND_LISTENER* li) {
typedef struct START_LIST { typedef struct START_LIST {
// total size: 0x1C // total size: 0x1C
struct START_LIST* next; // offset 0x0, size 0x4 struct START_LIST* next; // offset 0x0, size 0x4
float vol; // offset 0x4, size 0x4 f32 vol; // offset 0x4, size 0x4
float xPan; // offset 0x8, size 0x4 f32 xPan; // offset 0x8, size 0x4
float yPan; // offset 0xC, size 0x4 f32 yPan; // offset 0xC, size 0x4
float zPan; // offset 0x10, size 0x4 f32 zPan; // offset 0x10, size 0x4
float pitch; // offset 0x14, size 0x4 f32 pitch; // offset 0x14, size 0x4
SND_EMITTER* em; // offset 0x18, size 0x4 SND_EMITTER* em; // offset 0x18, size 0x4
} START_LIST; } START_LIST;
typedef struct RUN_LIST { typedef struct RUN_LIST {
// total size: 0xC // total size: 0xC
struct RUN_LIST* next; // offset 0x0, size 0x4 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 SND_EMITTER* em; // offset 0x8, size 0x4
} RUN_LIST; } RUN_LIST;
@ -749,7 +904,7 @@ void ClearStartList() {
runListNum = 0; runListNum = 0;
} }
void AddRunningEmitter(SND_EMITTER* em, float vol) { void AddRunningEmitter(SND_EMITTER* em, f32 vol) {
long i; // r30 long i; // r30
RUN_LIST* rl; // r29 RUN_LIST* rl; // r29
RUN_LIST* lrl; // r28 RUN_LIST* lrl; // r28
@ -789,8 +944,7 @@ void AddRunningEmitter(SND_EMITTER* em, float vol) {
runList[runListNum++].vol = vol; runList[runListNum++].vol = vol;
} }
bool AddStartingEmitter(SND_EMITTER* em, float vol, float xPan, float yPan, float zPan, bool AddStartingEmitter(SND_EMITTER* em, f32 vol, f32 xPan, f32 yPan, f32 zPan, f32 pitch) {
float pitch) {
long i; // r30 long i; // r30
START_LIST* sl; // r29 START_LIST* sl; // r29
@ -845,17 +999,153 @@ void StartContinousEmitters() {
long i; // r30 long i; // r30
START_LIST* sl; // r29 START_LIST* sl; // r29
SND_EMITTER* em; // r31 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() { void s3dHandle() {
SND_EMITTER* em; // r31 SND_EMITTER* em; // r31
SND_EMITTER* nem; // r30 SND_EMITTER* nem; // r30
float vol; // r1+0x18 f32 vol; // r1+0x18
float xPan; // r1+0x14 f32 xPan; // r1+0x14
float yPan; // r1+0x10 f32 yPan; // r1+0x10
float zPan; // r1+0xC f32 zPan; // r1+0xC
float pitch; // r1+0x8 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) { 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, void sndGet3DParameters(SND_3DINFO* info, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis, f32 comp,
u8 maxVol, u8 minVol, SND_ROOM* room) { u8 maxVol, u8 minVol, SND_ROOM* room) {
float xPan; // r1+0x34 f32 xPan; // r1+0x34
float yPan; // r1+0x30 f32 yPan; // r1+0x30
float zPan; // r1+0x2C f32 zPan; // r1+0x2C
float cvol; // r1+0x28 f32 cvol; // r1+0x28
float pitch; // r1+0x24 f32 pitch; // r1+0x24
static SND_EMITTER em; static SND_EMITTER em;
hwDisableIrq(); hwDisableIrq();

View File

@ -31,6 +31,8 @@ u8 synthAuxBMIDI[8];
u8 synthAuxBMIDISet[8]; u8 synthAuxBMIDISet[8];
u8 synthTrackVolume[64]; // size: 0x40 u8 synthTrackVolume[64]; // size: 0x40
static void synthAddJob(SYNTH_VOICE* svoice, SYNTH_JOBTYPE jobType, u32 deltaTime);
void synthSetBpm(u32 bpm, u8 set, u8 section) { void synthSetBpm(u32 bpm, u8 set, u8 section) {
if (set == 0xFF) { if (set == 0xFF) {
set = 8; set = 8;
@ -323,7 +325,7 @@ static void unblockAllAllocatedVoices(u32 vid) {
#endif #endif
u32 synthStartSound(u16 id, u8 prio, u8 max, 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, u32 sourceID,
#endif #endif
u8 key, u8 vol, u8 panning, u8 midi, u8 midiSet, u8 section, u16 step, 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, 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 0, // TODO
#endif #endif
fx->key | 0x80, vol, pan, 0xFF, 0xFF, 0, 0, 0xFF, fx->vGroup, 0, studio, 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; return 0;
} }
void sndVirtualSampleFreeBuffers() { s32 sndVirtualSampleFreeBuffers() {
u8 i; // r31 u8 i; // r31
#line 481 #line 481
MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized.");