mirror of https://github.com/PrimeDecomp/prime.git
Alignment fixes, found exact MusyX version used
Former-commit-id: 66a930d6ee1bb21ae695ece190221a4540ab99b6
This commit is contained in:
parent
bb7c4c10ae
commit
476175e460
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
24
configure.py
24
configure.py
|
@ -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"),
|
||||
|
@ -1161,11 +1163,11 @@ config.libs = [
|
|||
],
|
||||
},
|
||||
MusyX(
|
||||
#debug=True,
|
||||
#mw_version="GC/1.2.5",
|
||||
#major=1,
|
||||
#minor=5,
|
||||
#patch=3,
|
||||
# debug=True,
|
||||
# mw_version="GC/1.2.5",
|
||||
# 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",
|
||||
[
|
||||
|
|
|
@ -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; \
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
@ -1059,7 +1066,7 @@ u16 inpGetExCtrl(SYNTH_VOICE* svoice, u8 ctrl);
|
|||
u16 inpGetMidiCtrl(u8 ctrl, u8 channel, u8 set);
|
||||
void inpSetMidiLastNote(u8 midi, u8 midiSet, u8 key);
|
||||
u16 inpGetModulation(SYNTH_VOICE* svoice);
|
||||
void inpResetMidiCtrl(u8 ch, u8 set, u32 coldReset) ;
|
||||
void inpResetMidiCtrl(u8 ch, u8 set, u32 coldReset);
|
||||
void inpResetChannelDefaults(u8 midi, u8 midiSet);
|
||||
u16 inpGetPitchBend(SYNTH_VOICE* svoice);
|
||||
u16 inpGetDoppler(SYNTH_VOICE* svoice);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
#pragma force_active on
|
||||
__declspec(section ".data") char dummy[4];
|
|
@ -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;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
|
||||
#include "musyx/musyx_priv.h"
|
||||
#include "musyx/synth.h"
|
||||
|
||||
static GSTACK gs[128];
|
||||
static s16 sp;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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.");
|
||||
|
|
Loading…
Reference in New Issue