summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorengineer124 <47598039+engineer124@users.noreply.github.com>2022-01-11 11:27:36 +1100
committerGitHub <noreply@github.com>2022-01-11 00:27:36 +0000
commit133e02a8a744ec7252b71ca5a0e310367dae037d (patch)
treeba70920d638ff945e806df1b11297b3e33ab43f9 /src/code
parent6069a1585f34d46178b38554c8d547a266bb4123 (diff)
z_sound_source OK (#353)
* z_sound_source OK * Fix Pos * Lib_PlaySfxByPos * Change function names * format * Update names to match OoT * cleanup from the merge * Fix name
Diffstat (limited to 'src/code')
-rw-r--r--src/code/audio/code_8019AF00.c2
-rw-r--r--src/code/audio/code_801A5BD0.c2
-rw-r--r--src/code/code_800F0390.c11
-rw-r--r--src/code/z_actor.c14
-rw-r--r--src/code/z_collision_check.c20
-rw-r--r--src/code/z_effect_soft_sprite.c4
-rw-r--r--src/code/z_en_item00.c8
-rw-r--r--src/code/z_fireobj.c2
-rw-r--r--src/code/z_lib.c4
-rw-r--r--src/code/z_sound_source.c75
10 files changed, 103 insertions, 39 deletions
diff --git a/src/code/audio/code_8019AF00.c b/src/code/audio/code_8019AF00.c
index 9354af188..5d0a166a2 100644
--- a/src/code/audio/code_8019AF00.c
+++ b/src/code/audio/code_8019AF00.c
@@ -134,7 +134,7 @@
#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019F170.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019F1C0.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/Audio_PlaySfxAtPos.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019F208.s")
diff --git a/src/code/audio/code_801A5BD0.c b/src/code/audio/code_801A5BD0.c
index 0a13b00ec..7d796aa9f 100644
--- a/src/code/audio/code_801A5BD0.c
+++ b/src/code/audio/code_801A5BD0.c
@@ -24,7 +24,7 @@
#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A7284.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A72CC.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/Audio_StopSfxByPos.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A7328.s")
diff --git a/src/code/code_800F0390.c b/src/code/code_800F0390.c
deleted file mode 100644
index f495cfe5e..000000000
--- a/src/code/code_800F0390.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "global.h"
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_800F0390/func_800F0390.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_800F0390/func_800F03C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_800F0390/func_800F048C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_800F0390/Audio_PlaySoundAtPosition.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_800F0390/func_800F0590.s")
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index 49eee7235..0b38d135f 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -2139,7 +2139,7 @@ void func_800B8E58(Player* player, u16 sfxId) {
* Plays the sound effect at the actor's position
*/
void Actor_PlaySfxAtPos(Actor* actor, u16 sfxId) {
- func_8019F1C0(&actor->projectedPos, sfxId);
+ Audio_PlaySfxAtPos(&actor->projectedPos, sfxId);
}
void func_800B8EF4(GlobalContext* globalCtx, Actor* actor) {
@@ -2155,8 +2155,8 @@ void func_800B8EF4(GlobalContext* globalCtx, Actor* actor) {
sfxId = SurfaceType_GetSfx(&globalCtx->colCtx, actor->floorPoly, actor->floorBgId);
}
- func_8019F1C0(&actor->projectedPos, NA_SE_EV_BOMB_BOUND);
- func_8019F1C0(&actor->projectedPos, sfxId + SFX_FLAG);
+ Audio_PlaySfxAtPos(&actor->projectedPos, NA_SE_EV_BOMB_BOUND);
+ Audio_PlaySfxAtPos(&actor->projectedPos, sfxId + SFX_FLAG);
}
void func_800B8F98(Actor* actor, u16 sfxId) {
@@ -2580,7 +2580,7 @@ void func_800B9D1C(Actor* actor) {
} else if (actor->audioFlags & 0x10) {
func_801A0810(&D_801DB4A4, NA_SE_SY_TIMER - SFX_FLAG, (sfxId - 1));
} else if (actor->audioFlags & 1) {
- func_8019F1C0(&actor->projectedPos, sfxId);
+ Audio_PlaySfxAtPos(&actor->projectedPos, sfxId);
}
}
@@ -3345,7 +3345,7 @@ Actor* Actor_Delete(ActorContext* actorCtx, Actor* actor, GlobalContext* globalC
actorCtx->targetContext.bgmEnemy = NULL;
}
- func_801A72CC(&actor->projectedPos);
+ Audio_StopSfxByPos(&actor->projectedPos);
Actor_Destroy(actor, globalCtx);
newHead = Actor_RemoveFromCategory(globalCtx, actorCtx, actor);
@@ -3487,7 +3487,7 @@ void func_800BB8EC(GameState* gameState, ActorContext* actorCtx, Actor** arg2, A
*/
void Enemy_StartFinishingBlow(GlobalContext* globalCtx, Actor* actor) {
globalCtx->actorCtx.freezeFlashTimer = 5;
- Audio_PlaySoundAtPosition(globalCtx, &actor->world.pos, 20, NA_SE_EN_LAST_DAMAGE);
+ SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &actor->world.pos, 20, NA_SE_EN_LAST_DAMAGE);
}
// blinking routine
@@ -4717,7 +4717,7 @@ void Actor_SpawnIceEffects(GlobalContext* globalCtx, Actor* actor, Vec3f limbPos
s16 yaw;
s32 j;
- Audio_PlaySoundAtPosition(globalCtx, &actor->world.pos, 30, NA_SE_EV_ICE_BROKEN);
+ SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &actor->world.pos, 30, NA_SE_EV_ICE_BROKEN);
for (i = 0; i < limbPosCount; i++) {
yaw = Actor_YawToPoint(actor, limbPos);
diff --git a/src/code/z_collision_check.c b/src/code/z_collision_check.c
index 44885d6c7..ddf21fe17 100644
--- a/src/code/z_collision_check.c
+++ b/src/code/z_collision_check.c
@@ -1525,7 +1525,7 @@ void CollisionCheck_HitSolid(GlobalContext* globalCtx, ColliderInfo* info, Colli
if (collider->actor == NULL) {
play_sound(NA_SE_IT_SHIELD_BOUND);
} else {
- func_8019F1C0(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
+ Audio_PlaySfxAtPos(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
}
} else if (flags == TOUCH_SFX_NORMAL) {
EffectSsHitMark_SpawnFixedScale(globalCtx, 3, hitPos);
@@ -1539,14 +1539,14 @@ void CollisionCheck_HitSolid(GlobalContext* globalCtx, ColliderInfo* info, Colli
if (collider->actor == NULL) {
play_sound(NA_SE_IT_SHIELD_BOUND);
} else {
- func_8019F1C0(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
+ Audio_PlaySfxAtPos(&collider->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
}
} else if (flags == TOUCH_SFX_WOOD) {
EffectSsHitMark_SpawnFixedScale(globalCtx, 1, hitPos);
if (collider->actor == NULL) {
play_sound(NA_SE_IT_REFLECTION_WOOD);
} else {
- func_8019F1C0(&collider->actor->projectedPos, NA_SE_IT_REFLECTION_WOOD);
+ Audio_PlaySfxAtPos(&collider->actor->projectedPos, NA_SE_IT_REFLECTION_WOOD);
}
}
}
@@ -1557,13 +1557,13 @@ void CollisionCheck_HitSolid(GlobalContext* globalCtx, ColliderInfo* info, Colli
s32 CollisionCheck_SwordHitAudio(Collider* at, ColliderInfo* acInfo) {
if (at->actor != NULL && at->actor->category == ACTORCAT_PLAYER) {
if (acInfo->elemType == ELEMTYPE_UNK0) {
- func_8019F1C0(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE);
+ Audio_PlaySfxAtPos(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE);
} else if (acInfo->elemType == ELEMTYPE_UNK1) {
- func_8019F1C0(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE_HARD);
+ Audio_PlaySfxAtPos(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE_HARD);
} else if (acInfo->elemType == ELEMTYPE_UNK2) {
- func_8019F1C0(&at->actor->projectedPos, 0);
+ Audio_PlaySfxAtPos(&at->actor->projectedPos, 0);
} else if (acInfo->elemType == ELEMTYPE_UNK3) {
- func_8019F1C0(&at->actor->projectedPos, 0);
+ Audio_PlaySfxAtPos(&at->actor->projectedPos, 0);
}
}
return 1;
@@ -1618,7 +1618,7 @@ void CollisionCheck_HitEffects(GlobalContext* globalCtx, Collider* at, ColliderI
if (ac->actor == NULL) {
play_sound(NA_SE_IT_SHIELD_BOUND);
} else {
- func_8019F1C0(&ac->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
+ Audio_PlaySfxAtPos(&ac->actor->projectedPos, NA_SE_IT_SHIELD_BOUND);
}
}
}
@@ -3905,7 +3905,7 @@ void CollisionCheck_SpawnShieldParticlesMetal(GlobalContext* globalCtx, Vec3f* v
*/
void CollisionCheck_SpawnShieldParticlesMetalSound(GlobalContext* globalCtx, Vec3f* v, Vec3f* pos) {
CollisionCheck_SpawnShieldParticles(globalCtx, v);
- func_8019F1C0(pos, NA_SE_IT_SHIELD_REFLECT_SW);
+ Audio_PlaySfxAtPos(pos, NA_SE_IT_SHIELD_REFLECT_SW);
}
/**
@@ -3945,7 +3945,7 @@ void CollisionCheck_SpawnShieldParticlesWood(GlobalContext* globalCtx, Vec3f* v,
shieldParticleInitWood.lightPoint.z = shieldParticleInitWood.position.z;
Effect_Add(globalCtx, &effectIndex, EFFECT_SHIELD_PARTICLE, 0, 1, &shieldParticleInitWood);
- func_8019F1C0(pos, NA_SE_IT_REFLECTION_WOOD);
+ Audio_PlaySfxAtPos(pos, NA_SE_IT_REFLECTION_WOOD);
}
/**
diff --git a/src/code/z_effect_soft_sprite.c b/src/code/z_effect_soft_sprite.c
index fddcf7f95..11545da01 100644
--- a/src/code/z_effect_soft_sprite.c
+++ b/src/code/z_effect_soft_sprite.c
@@ -58,11 +58,11 @@ EffectSs* EffectSS_GetTable() {
void EffectSS_Delete(EffectSs* effectSs) {
if (effectSs->flags & 2) {
- func_801A72CC(&effectSs->pos);
+ Audio_StopSfxByPos(&effectSs->pos);
}
if (effectSs->flags & 4) {
- func_801A72CC(&effectSs->vec);
+ Audio_StopSfxByPos(&effectSs->vec);
}
EffectSS_ResetEntry(effectSs);
diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c
index ec32550f8..2f0668c66 100644
--- a/src/code/z_en_item00.c
+++ b/src/code/z_en_item00.c
@@ -858,7 +858,7 @@ Actor* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 param
spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) << 9) & 0xFE00) | 0x102);
if (!Flags_GetCollectible(globalCtx, (param7F00 >> 8) & 0x7F)) {
- Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
+ SoundSource_PlaySfxAtFixedWorldPos(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
}
} else {
spawnedActor =
@@ -866,7 +866,7 @@ Actor* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 param
spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) & 0x7F) << 9) | 7);
if (param20000 == 0) {
if (!Flags_GetCollectible(globalCtx, (param7F00 >> 8) & 0x7F)) {
- Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
+ SoundSource_PlaySfxAtFixedWorldPos(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
}
}
}
@@ -924,7 +924,7 @@ Actor* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, s32 para
spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) & 0x7F) << 9) | 7);
}
if (Flags_GetCollectible(globalCtx, (param7F00 >> 8) & 0x7F) == 0) {
- Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
+ SoundSource_PlaySfxAtFixedWorldPos(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
}
} else {
params = func_800A7650(params & 0xFF);
@@ -1080,7 +1080,7 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3
if (gSaveContext.health <= 0x10) {
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
spawnPos->z, 0, 0, 0, 2);
- Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
+ SoundSource_PlaySfxAtFixedWorldPos(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
return;
}
diff --git a/src/code/z_fireobj.c b/src/code/z_fireobj.c
index 7c5de646a..2cf05e02a 100644
--- a/src/code/z_fireobj.c
+++ b/src/code/z_fireobj.c
@@ -131,7 +131,7 @@ void FireObj_UpdateStateTransitions(GlobalContext* globalCtx, FireObj* fire) {
}
} else if (player->unk_B28 == 0) {
player->unk_B28 = 0xD2;
- Audio_PlaySoundAtPosition(globalCtx, &fire->position, 20, NA_SE_EV_FLAME_IGNITION);
+ SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &fire->position, 20, NA_SE_EV_FLAME_IGNITION);
} else if (player->unk_B28 < 0xC8) {
player->unk_B28 = 0xC8;
}
diff --git a/src/code/z_lib.c b/src/code/z_lib.c
index 5bc49c8ac..84eb8c051 100644
--- a/src/code/z_lib.c
+++ b/src/code/z_lib.c
@@ -647,8 +647,8 @@ void func_801000CC(u16 sfxId) {
func_8019F128(sfxId);
}
-void func_801000F4(s32 a0, u16 sfxId) {
- func_8019F1C0(a0, sfxId);
+void Lib_PlaySfxAtPos(Vec3f* pos, u16 sfxId) {
+ Audio_PlaySfxAtPos(pos, sfxId);
}
void Lib_Vec3f_TranslateAndRotateY(Vec3f* translation, s16 a, Vec3f* src, Vec3f* dst) {
diff --git a/src/code/z_sound_source.c b/src/code/z_sound_source.c
new file mode 100644
index 000000000..ba7036a4c
--- /dev/null
+++ b/src/code/z_sound_source.c
@@ -0,0 +1,75 @@
+#include "global.h"
+
+void SoundSource_InitAll(GlobalContext* globalCtx) {
+ SoundSource* sources = &globalCtx->soundSources[0];
+ s32 i;
+
+ // clang-format off
+ for (i = 0; i < ARRAY_COUNT(globalCtx->soundSources); i++) { sources[i].countdown = 0; }
+ // clang-format on
+}
+
+void SoundSource_UpdateAll(GlobalContext* globalCtx) {
+ SoundSource* source = &globalCtx->soundSources[0];
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(globalCtx->soundSources); i++) {
+ if (source->countdown != 0) {
+ if (DECR(source->countdown) == 0) {
+ Audio_StopSfxByPos(&source->projectedPos);
+ } else {
+ SkinMatrix_Vec3fMtxFMultXYZ(&globalCtx->viewProjectionMtxF, &source->worldPos, &source->projectedPos);
+ if (source->playSfxEachFrame) {
+ Audio_PlaySfxAtPos(&source->projectedPos, source->sfxId);
+ }
+ }
+ }
+
+ source++;
+ }
+}
+
+void SoundSource_Add(GlobalContext* globalCtx, Vec3f* worldPos, u32 duration, u16 sfxId, u32 playSfxEachFrame) {
+ s32 countdown;
+ SoundSource* source;
+ s32 smallestCountdown = 0xFFFF;
+ SoundSource* backupSource = NULL;
+ s32 i;
+
+ source = &globalCtx->soundSources[0];
+ for (i = 0; i < ARRAY_COUNT(globalCtx->soundSources); i++) {
+ if (source->countdown == 0) {
+ break;
+ }
+
+ // Store the sound source with the smallest remaining countdown
+ countdown = source->countdown;
+ if (countdown < smallestCountdown) {
+ smallestCountdown = countdown;
+ backupSource = source;
+ }
+ source++;
+ }
+
+ // If no sound source is available, replace the sound source with the smallest remaining countdown
+ if (i >= ARRAY_COUNT(globalCtx->soundSources)) {
+ source = backupSource;
+ Audio_StopSfxByPos(&source->projectedPos);
+ }
+
+ source->worldPos = *worldPos;
+ source->countdown = duration;
+ source->playSfxEachFrame = playSfxEachFrame;
+ source->sfxId = sfxId;
+
+ SkinMatrix_Vec3fMtxFMultXYZ(&globalCtx->viewProjectionMtxF, &source->worldPos, &source->projectedPos);
+ Audio_PlaySfxAtPos(&source->projectedPos, sfxId);
+}
+
+void SoundSource_PlaySfxAtFixedWorldPos(GlobalContext* globalCtx, Vec3f* worldPos, u32 duration, u16 sfxId) {
+ SoundSource_Add(globalCtx, worldPos, duration, sfxId, false);
+}
+
+void SoundSource_PlaySfxEachFrameAtFixedWorldPos(GlobalContext* globalCtx, Vec3f* worldPos, u32 duration, u16 sfxId) {
+ SoundSource_Add(globalCtx, worldPos, duration, sfxId, true);
+}