mirror of https://github.com/PrimeDecomp/prime.git
Link delay_fx.c
This commit is contained in:
parent
863cf71312
commit
14dc741030
2
Makefile
2
Makefile
|
@ -130,6 +130,8 @@ $(BUILD_DIR)/src/musyx/snd_init.o: CFLAGS := $(CFLAGS_MUSYX)
|
||||||
$(BUILD_DIR)/src/musyx/dsp_import.o: CFLAGS := $(CFLAGS_MUSYX)
|
$(BUILD_DIR)/src/musyx/dsp_import.o: CFLAGS := $(CFLAGS_MUSYX)
|
||||||
$(BUILD_DIR)/src/musyx/hw_memory.o: CFLAGS := $(CFLAGS_MUSYX)
|
$(BUILD_DIR)/src/musyx/hw_memory.o: CFLAGS := $(CFLAGS_MUSYX)
|
||||||
$(BUILD_DIR)/src/musyx/reverb_fx.o: CFLAGS := $(CFLAGS_MUSYX)
|
$(BUILD_DIR)/src/musyx/reverb_fx.o: CFLAGS := $(CFLAGS_MUSYX)
|
||||||
|
$(BUILD_DIR)/src/musyx/delay_fx.o: CFLAGS := $(CFLAGS_MUSYX)
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# Recipes
|
# Recipes
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
#ifndef bool8
|
#ifndef bool8
|
||||||
typedef char bool8;
|
typedef unsigned char bool8;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -26,6 +26,9 @@ typedef struct _SND_HOOKS {
|
||||||
|
|
||||||
#define SND_AUX_NUMPARAMETERS 4
|
#define SND_AUX_NUMPARAMETERS 4
|
||||||
|
|
||||||
|
#define SND_AUX_REASON_BUFFERUPDATE 0
|
||||||
|
#define SND_AUX_REASON_PARAMETERUPDATE 1
|
||||||
|
|
||||||
typedef struct SND_AUX_INFO {
|
typedef struct SND_AUX_INFO {
|
||||||
union SND_AUX_DATA {
|
union SND_AUX_DATA {
|
||||||
struct SND_AUX_BUFFERUPDATE {
|
struct SND_AUX_BUFFERUPDATE {
|
||||||
|
@ -73,6 +76,31 @@ typedef struct SND_AUX_REVERBHI {
|
||||||
f32 crosstalk;
|
f32 crosstalk;
|
||||||
} SND_AUX_REVERBHI;
|
} SND_AUX_REVERBHI;
|
||||||
|
|
||||||
|
void sndAuxCallbackReverbHI(u8 reason, SND_AUX_INFO* info, void* user);
|
||||||
|
bool8 sndAuxCallbackPrepareReverbHI(SND_AUX_REVERBHI *rev);
|
||||||
|
bool8 sndAuxCallbackShutdownReverbHI(SND_AUX_REVERBHI* rev);
|
||||||
|
|
||||||
|
typedef struct SND_AUX_DELAY {
|
||||||
|
u32 currentSize[3];
|
||||||
|
u32 currentPos[3];
|
||||||
|
u32 currentFeedback[3];
|
||||||
|
u32 currentOutput[3];
|
||||||
|
|
||||||
|
s32* left;
|
||||||
|
s32* right;
|
||||||
|
s32* sur;
|
||||||
|
|
||||||
|
u32 delay[3]; // Delay buffer length in ms per channel
|
||||||
|
u32 feedback[3]; // Feedback volume in % per channel
|
||||||
|
u32 output[3]; // Output volume in % per channel
|
||||||
|
} SND_AUX_DELAY;
|
||||||
|
|
||||||
|
|
||||||
|
void sndAuxCallbackDelay(u8 reason,SND_AUX_INFO *info, void *user);
|
||||||
|
bool8 sndAuxCallbackUpdateSettingsDelay(SND_AUX_DELAY *delay);
|
||||||
|
bool8 sndAuxCallbackPrepareDelay(SND_AUX_DELAY *rev);
|
||||||
|
bool8 sndAuxCallbackShutdownDelay(SND_AUX_DELAY* rev);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -810,7 +810,7 @@ MUSYX_FILES :=\
|
||||||
$(BUILD_DIR)/asm/musyx/creverb.o\
|
$(BUILD_DIR)/asm/musyx/creverb.o\
|
||||||
$(BUILD_DIR)/src/musyx/reverb_fx.o\
|
$(BUILD_DIR)/src/musyx/reverb_fx.o\
|
||||||
$(BUILD_DIR)/asm/musyx/reverb.o\
|
$(BUILD_DIR)/asm/musyx/reverb.o\
|
||||||
$(BUILD_DIR)/asm/musyx/delay_fx.o\
|
$(BUILD_DIR)/src/musyx/delay_fx.o\
|
||||||
$(BUILD_DIR)/asm/musyx/chorus_fx.o
|
$(BUILD_DIR)/asm/musyx/chorus_fx.o
|
||||||
|
|
||||||
DTK_FILES :=\
|
DTK_FILES :=\
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
#include "musyx/musyx_priv.h"
|
||||||
|
|
||||||
|
void sndAuxCallbackDelay(u8 reason, SND_AUX_INFO* info, void* user) {
|
||||||
|
s32 curSur;
|
||||||
|
s32 curLeft;
|
||||||
|
s32 curRight;
|
||||||
|
s32 i;
|
||||||
|
s32* leftOffset;
|
||||||
|
s32* surOffset;
|
||||||
|
s32* rightOffset;
|
||||||
|
s32* leftPtr;
|
||||||
|
s32* rightPtr;
|
||||||
|
s32* surPtr;
|
||||||
|
SND_AUX_DELAY* delay;
|
||||||
|
|
||||||
|
switch (reason) {
|
||||||
|
case 0:
|
||||||
|
delay = (SND_AUX_DELAY*)user;
|
||||||
|
leftOffset = delay->left + (delay->currentPos[0] * 160);
|
||||||
|
leftPtr = info->data.bufferUpdate.left;
|
||||||
|
rightPtr = info->data.bufferUpdate.right;
|
||||||
|
rightOffset = delay->right + (delay->currentPos[1] * 160);
|
||||||
|
surPtr = info->data.bufferUpdate.surround;
|
||||||
|
surOffset = delay->sur + (delay->currentPos[2] * 160);
|
||||||
|
for (i = 160; i > 0; --i) {
|
||||||
|
curLeft = *leftOffset;
|
||||||
|
curRight = *rightOffset;
|
||||||
|
curSur = *surOffset;
|
||||||
|
*leftOffset = *leftPtr + ((s32)(curLeft * delay->currentFeedback[0]) >> 7);
|
||||||
|
++leftOffset;
|
||||||
|
*rightOffset = *rightPtr + ((s32)(curRight * delay->currentFeedback[1]) >> 7);
|
||||||
|
++rightOffset;
|
||||||
|
*surOffset = *surPtr + ((s32)(curSur * delay->currentFeedback[2]) >> 7);
|
||||||
|
++surOffset;
|
||||||
|
*leftPtr = (s32)(curLeft * delay->currentOutput[0]) >> 7;
|
||||||
|
++leftPtr;
|
||||||
|
*rightPtr = (s32)(curRight * delay->currentOutput[1]) >> 7;
|
||||||
|
++rightPtr;
|
||||||
|
*surPtr = (s32)(curSur * delay->currentOutput[2]) >> 7;
|
||||||
|
++surPtr;
|
||||||
|
}
|
||||||
|
delay->currentPos[0] = (delay->currentPos[0] + 1) % delay->currentSize[0];
|
||||||
|
delay->currentPos[1] = (delay->currentPos[1] + 1) % delay->currentSize[1];
|
||||||
|
delay->currentPos[2] = (delay->currentPos[2] + 1) % delay->currentSize[2];
|
||||||
|
/* fallthrough */
|
||||||
|
case 1:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 sndAuxCallbackUpdateSettingsDelay(SND_AUX_DELAY* delay) {
|
||||||
|
s32 i;
|
||||||
|
s32* left;
|
||||||
|
s32* right;
|
||||||
|
s32* sur;
|
||||||
|
sndAuxCallbackShutdownDelay(delay);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; ++i) {
|
||||||
|
delay->currentSize[i] = ((delay->delay[i] - 5) * 32 + 159) / 160;
|
||||||
|
delay->currentPos[i] = 0;
|
||||||
|
delay->currentFeedback[i] = (delay->feedback[i] << 7) / 100;
|
||||||
|
delay->currentOutput[i] = (delay->output[i] << 7) / 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
delay->left = (s32*)salMalloc(delay->currentSize[0] * 0x280);
|
||||||
|
delay->right = (s32*)salMalloc(delay->currentSize[1] * 0x280);
|
||||||
|
delay->sur = (s32*)salMalloc(delay->currentSize[2] * 0x280);
|
||||||
|
|
||||||
|
left = delay->left;
|
||||||
|
right = delay->right;
|
||||||
|
sur = delay->sur;
|
||||||
|
|
||||||
|
for (i = 0; i < delay->currentSize[0] * 160; ++i) {
|
||||||
|
*left = 0;
|
||||||
|
++left;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < delay->currentSize[1] * 160; ++i) {
|
||||||
|
*right = 0;
|
||||||
|
++right;
|
||||||
|
}
|
||||||
|
for (i = 0; i < delay->currentSize[2] * 160; ++i) {
|
||||||
|
*sur = 0;
|
||||||
|
++sur;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 sndAuxCallbackPrepareDelay(SND_AUX_DELAY* delay) {
|
||||||
|
delay->left = NULL;
|
||||||
|
return sndAuxCallbackUpdateSettingsDelay(delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 sndAuxCallbackShutdownDelay(SND_AUX_DELAY* delay) {
|
||||||
|
if (delay->left != NULL) {
|
||||||
|
salFree(delay->left);
|
||||||
|
salFree(delay->right);
|
||||||
|
salFree(delay->sur);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
|
@ -1,20 +1,16 @@
|
||||||
#include "musyx/musyx_priv.h"
|
#include "musyx/musyx_priv.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern bool8 ReverbHICreate(_SND_REVHI_WORK* rev, f32 coloration, f32 time, f32 mix, f32 damping, f32 preDelay, f32 crosstalk);
|
extern bool8 ReverbHICreate(_SND_REVHI_WORK* rev, f32 coloration, f32 time, f32 mix, f32 damping, f32 preDelay, f32 crosstalk);
|
||||||
extern void ReverbHIFree(_SND_REVHI_WORK* rev);
|
extern void ReverbHIFree(_SND_REVHI_WORK* rev);
|
||||||
|
|
||||||
void sndAuxCallbackReverbHI(u8 reason, SND_AUX_INFO* info, void* user) {
|
void sndAuxCallbackReverbHI(u8 reason, SND_AUX_INFO* info, void* user) {
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
case 0:
|
case SND_AUX_REASON_BUFFERUPDATE:
|
||||||
if (*((u8*)user + 0x1c4) == 0) {
|
if (((SND_AUX_REVERBHI*)user)->tempDisableFX == 0) {
|
||||||
ReverbHICallback(info->data.bufferUpdate.left, info->data.bufferUpdate.right, info->data.bufferUpdate.surround, user);
|
ReverbHICallback(info->data.bufferUpdate.left, info->data.bufferUpdate.right, info->data.bufferUpdate.surround, user);
|
||||||
}
|
}
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
case 1:
|
case SND_AUX_REASON_PARAMETERUPDATE:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,8 +24,3 @@ bool8 sndAuxCallbackShutdownReverbHI(SND_AUX_REVERBHI* rev) {
|
||||||
ReverbHIFree(&rev->rv);
|
ReverbHIFree(&rev->rv);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
Loading…
Reference in New Issue