convert snd_util to c

This commit is contained in:
Seth Barberee
2026-06-08 16:52:50 -07:00
parent 44e5349f2f
commit cb17a87680
6 changed files with 301 additions and 41 deletions

View File

@@ -1,40 +0,0 @@
.include "asm/macros.inc"
.include "include/nitro.inc"
.text
arm_func_start Snd_CalcChannelVolume
Snd_CalcChannelVolume: ; 0x0207D540
ldr r1, _0207D5A8 ; =0xFFFFFD2D
cmp r0, r1
movlt r0, r1
blt _0207D558
cmp r0, #0
movgt r0, #0
_0207D558:
add r1, r0, #0xd3
mvn r2, #0xef
cmp r0, r2
ldr r3, _0207D5AC ; =VolumeTable
add r1, r1, #0x200
ldrb r3, [r3, r1]
movlt r0, #3
blt _0207D598
add r1, r2, #0x78
cmp r0, r1
movlt r0, #2
blt _0207D598
add r1, r2, #0xb4
cmp r0, r1
movlt r0, #1
movge r0, #0
_0207D598:
orr r0, r3, r0, lsl #8
mov r0, r0, lsl #0x10
mov r0, r0, lsr #0x10
bx lr
.align 2, 0
_0207D5A8: .word 0xFFFFFD2D
_0207D5AC: .word VolumeTable
arm_func_end Snd_CalcChannelVolume

View File

@@ -0,0 +1,38 @@
#include <nitro/snd/common/util.h>
#include <nitro/snd/common/channel.h>
#define SND_VOLUME_SHIFT_2_MIN -240
#define SND_VOLUME_SHIFT_1_MIN -120
#define SND_VOLUME_SHIFT_0_MIN -60
extern const u8 VolumeTable[SND_VOLUME_TABLE_SIZE];
u16 Snd_CalcChannelVolume (int dB)
{
SNDChannelDataShift shift;
u8 volume;
if (dB < SND_VOLUME_DB_MIN) {
dB = SND_VOLUME_DB_MIN;
} else if (dB > SND_VOLUME_DB_MAX) {
dB = SND_VOLUME_DB_MAX;
}
#ifdef SND_USE_SYSTEM_ROM_TABLE
volume = SVC_GetVolumeTable(dB - SND_VOLUME_DB_MIN);
#else
volume = VolumeTable[dB - SND_VOLUME_DB_MIN];
#endif
if (dB < SND_VOLUME_SHIFT_2_MIN) {
shift = SND_CHANNEL_DATASHIFT_4BIT;
} else if (dB < SND_VOLUME_SHIFT_1_MIN) {
shift = SND_CHANNEL_DATASHIFT_2BIT;
} else if (dB < SND_VOLUME_SHIFT_0_MIN) {
shift = SND_CHANNEL_DATASHIFT_1BIT;
} else {
shift = SND_CHANNEL_DATASHIFT_NONE;
}
return (u16)(shift << 8 | volume);
}

View File

@@ -2,5 +2,6 @@
#define NITRO_SND_H_
#include <nitro/snd/common/main.h>
#include <nitro/snd/common/util.h>
#endif //NITRO_SND_H_

View File

@@ -0,0 +1,189 @@
#ifndef NITRO_SND_COMMON_CHANNEL_H_
#define NITRO_SND_COMMON_CHANNEL_H_
#include <nitro/types.h>
// #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL))
// #include <nitro/misc.h>
// #include <nitro/hw/common/armArch.h>
//
// #ifdef SDK_ARM7
// #include <nitro/hw/ARM7/ioreg_SND.h>
// #endif
// #else
// #define HW_CPU_CLOCK_ARM7 33513982
// #endif
#ifdef __cplusplus
extern "C" {
#endif
#define SND_TIMER_CLOCK (HW_CPU_CLOCK_ARM7 / 2)
#define SND_CHANNEL_NUM 16
#define SND_CHANNEL_MIN 0
#define SND_CHANNEL_MAX 15
#define SND_PSG_CHANNEL_MIN 8
#define SND_PSG_CHANNEL_MAX 13
#define SND_PSG_CHANNEL_NUM (SND_PSG_CHANNEL_MAX - SND_PSG_CHANNEL_MIN + 1)
#define SND_NOISE_CHANNEL_MIN 14
#define SND_NOISE_CHANNEL_MAX 15
#define SND_NOISE_CHANNEL_NUM (SND_NOISE_CHANNEL_MAX - SND_NOISE_CHANNEL_MIN + 1)
#define SND_CHANNEL_PAN_MIN 0
#define SND_CHANNEL_PAN_CENTER 64
#define SND_CHANNEL_PAN_MAX 0x7f
#define SND_CHANNEL_VOLUME_MIN 0
#define SND_CHANNEL_VOLUME_MAX 0x7f
#define SND_CHANNEL_TIMER_MIN 0x10
#define SND_CHANNEL_TIMER_MAX 0xffff
#define SND_CHANNEL_LOOP_START_MAX 0xffff
#define SND_CHANNEL_LOOP_LEN_MAX 0x3fffff
#define SND_CHANNEL_SAD_MASK 0x07fffffc
#define SND_PCM_CHANNEL_MASK 0xffff
#define SND_PSG_CHANNEL_MASK 0x3f00
#define SND_NOISE_CHANNEL_MASK 0xc000
#define SND_CAPIN_CHANNEL_MASK 0x0005
#define SND_CAPOUT_CHANNEL_MASK 0x000a
#define SND_CHANNEL_STOP_HOLD (1 << 0)
#define SND_CHANNEL_REG_OFFSET(ch) ((ch) << 4)
#ifdef SDK_ARM9
#define REG_SND_SOUND0CNT_E_SHIFT 31
#define REG_SND_SOUND0CNT_E_SIZE 1
#define REG_SND_SOUND0CNT_E_MASK 0x80000000
#define REG_SND_SOUND0CNT_FORMAT_SHIFT 29
#define REG_SND_SOUND0CNT_FORMAT_SIZE 2
#define REG_SND_SOUND0CNT_FORMAT_MASK 0x60000000
#define REG_SND_SOUND0CNT_REPEAT_SHIFT 27
#define REG_SND_SOUND0CNT_REPEAT_SIZE 2
#define REG_SND_SOUND0CNT_REPEAT_MASK 0x18000000
#define REG_SND_SOUND0CNT_DUTY_SHIFT 24
#define REG_SND_SOUND0CNT_DUTY_SIZE 3
#define REG_SND_SOUND0CNT_DUTY_MASK 0x07000000
#define REG_SND_SOUND0CNT_PAN_SHIFT 16
#define REG_SND_SOUND0CNT_PAN_SIZE 7
#define REG_SND_SOUND0CNT_PAN_MASK 0x007f0000
#define REG_SND_SOUND0CNT_HOLD_SHIFT 15
#define REG_SND_SOUND0CNT_HOLD_SIZE 1
#define REG_SND_SOUND0CNT_HOLD_MASK 0x00008000
#define REG_SND_SOUND0CNT_SHIFT_SHIFT 8
#define REG_SND_SOUND0CNT_SHIFT_SIZE 2
#define REG_SND_SOUND0CNT_SHIFT_MASK 0x00000300
#define REG_SND_SOUND0CNT_VOLUME_SHIFT 0
#define REG_SND_SOUND0CNT_VOLUME_SIZE 7
#define REG_SND_SOUND0CNT_VOLUME_MASK 0x0000007f
#endif
typedef enum {
SND_CHANNEL_0,
SND_CHANNEL_1,
SND_CHANNEL_2,
SND_CHANNEL_3,
SND_CHANNEL_4,
SND_CHANNEL_5,
SND_CHANNEL_6,
SND_CHANNEL_7,
SND_CHANNEL_8,
SND_CHANNEL_9,
SND_CHANNEL_10,
SND_CHANNEL_11,
SND_CHANNEL_12,
SND_CHANNEL_13,
SND_CHANNEL_14,
SND_CHANNEL_15
} SNDChannelId;
typedef enum {
SND_WAVE_FORMAT_PCM8,
SND_WAVE_FORMAT_PCM16,
SND_WAVE_FORMAT_ADPCM,
SND_WAVE_FORMAT_PSG,
SND_WAVE_FORMAT_NOISE = SND_WAVE_FORMAT_PSG
} SNDWaveFormat;
typedef enum {
SND_CHANNEL_LOOP_MANUAL,
SND_CHANNEL_LOOP_REPEAT,
SND_CHANNEL_LOOP_1SHOT
} SNDChannelLoop;
#define SND_CHANNEL_LOOP_REPAET SND_CHANNEL_LOOP_REPEAT
typedef enum {
SND_DUTY_1_8,
SND_DUTY_2_8,
SND_DUTY_3_8,
SND_DUTY_4_8,
SND_DUTY_5_8,
SND_DUTY_6_8,
SND_DUTY_7_8
} SNDDuty;
typedef enum {
SND_CHANNEL_DATASHIFT_NONE,
SND_CHANNEL_DATASHIFT_1BIT,
SND_CHANNEL_DATASHIFT_2BIT,
SND_CHANNEL_DATASHIFT_4BIT
} SNDChannelDataShift;
#ifdef SDK_ARM7
#if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL))
static inline void SND_StartChannel (int chNo)
{
SDK_MINMAX_ASSERT(chNo, SND_CHANNEL_MIN, SND_CHANNEL_MAX);
*((REGType8v *)(REG_SOUND0CNT_8_ADDR + SND_CHANNEL_REG_OFFSET(chNo)))
|= REG_SND_SOUND0CNT_8_E_MASK;
}
#else
void SND_StartChannel(int chNo);
#endif
#endif
#ifdef SDK_ARM7
void SND_SetupChannelPcm(int chNo,
const void * dataaddr,
SNDWaveFormat format,
SNDChannelLoop loop,
int loopStart,
int loopLen, int volume, SNDChannelDataShift shift, int timer, int pan);
void SND_SetupChannelPsg(int chNo,
SNDDuty duty,
int volume, SNDChannelDataShift shift, int timer, int pan);
void SND_SetupChannelNoise(int chNo, int volume, SNDChannelDataShift shift, int timer, int pan);
void SND_StopChannel(int chNo, s32 flags);
void SND_SetChannelVolume(int chNo, int volume, SNDChannelDataShift shift);
void SND_SetChannelTimer(int chNo, int timer);
void SND_SetChannelPan(int chNo, int pan);
BOOL SND_IsChannelActive(int chNo);
void SND_SetMasterPan(int pan);
u32 SND_GetChannelControl(int chNo);
#endif
#ifdef SDK_ARM7
void SNDi_SetSurroundDecay(int decay);
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,72 @@
#ifndef NITRO_SND_COMMON_UTIL_H_
#define NITRO_SND_COMMON_UTIL_H_
#include <nitro/types.h>
// #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL))
// #include <nitro/misc.h>
// #else
// #define SDK_MINMAX_ASSERT(exp, min, max) ((void) 0)
// #endif
#ifdef __cplusplus
extern "C" {
#endif
#define SND_PITCH_DIVISION_BIT 6
#define SND_PITCH_DIVISION_RANGE (1 << SND_PITCH_DIVISION_BIT)
#define SND_PITCH_TABLE_SIZE (12 * SND_PITCH_DIVISION_RANGE)
#define SND_PITCH_TABLE_BIAS 0x10000
#define SND_PITCH_TABLE_SHIFT 16
#define SND_VOLUME_DB_MIN (-723)
#define SND_VOLUME_DB_MAX 0
#define SND_VOLUME_TABLE_SIZE (SND_VOLUME_DB_MAX - SND_VOLUME_DB_MIN + 1)
#define SND_CALC_DECIBEL_SCALE_MAX 127
#define SND_DECIBEL_TABLE_SIZE 128
#define SND_DECIBEL_SQUARE_TABLE_SIZE 128
#define SND_SIN_TABLE_SIZE 32
#define SND_SIN_PERIOD (SND_SIN_TABLE_SIZE * 4)
// extern const s16 SNDi_DecibelTable[SND_DECIBEL_TABLE_SIZE];
// extern const s16 SNDi_DecibelSquareTable[SND_DECIBEL_SQUARE_TABLE_SIZE];
// #ifndef _MSC_VER
// static inline
// #else
// __inline
// #endif
// s16 SND_CalcDecibel (int scale)
// {
// SDK_MINMAX_ASSERT(scale, 0, SND_CALC_DECIBEL_SCALE_MAX);
// return SNDi_DecibelTable[scale];
// }
//
// #ifndef _MSC_VER
// static inline
// #else
// __inline
// #endif
// s16 SND_CalcDecibelSquare (int scale)
// {
// SDK_MINMAX_ASSERT(scale, 0, SND_CALC_DECIBEL_SCALE_MAX);
// return SNDi_DecibelSquareTable[scale];
// }
//u16 SND_CalcTimer(int orgTimer, int pitch);
u16 Snd_CalcChannelVolume(int dB);
// #ifdef SDK_ARM7
// u16 SND_CalcRandom(void);
// s8 SND_SinIdx(int index);
// #endif
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -272,7 +272,7 @@ Static main
Object lib/NitroSDK/asm/snd_command.o
Object lib/NitroSDK/asm/snd_alarm.o
Object lib/NitroSDK/asm/snd_work.o
Object lib/NitroSDK/asm/snd_util.o
Object lib/NitroSDK/src/snd_util.o
Object lib/NitroSDK/asm/snd_bank.o
Object lib/NitroSDK/src/pxi_init.o
Object lib/NitroSDK/asm/pxi_fifo.o