mirror of
https://github.com/pret/pmd-sky.git
synced 2026-09-30 06:12:17 -05:00
convert snd_util to c
This commit is contained in:
@@ -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
|
||||
|
||||
38
lib/NitroSDK/src/snd_util.c
Normal file
38
lib/NitroSDK/src/snd_util.c
Normal 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);
|
||||
}
|
||||
@@ -2,5 +2,6 @@
|
||||
#define NITRO_SND_H_
|
||||
|
||||
#include <nitro/snd/common/main.h>
|
||||
#include <nitro/snd/common/util.h>
|
||||
|
||||
#endif //NITRO_SND_H_
|
||||
|
||||
189
lib/include/nitro/snd/common/channel.h
Normal file
189
lib/include/nitro/snd/common/channel.h
Normal 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
|
||||
72
lib/include/nitro/snd/common/util.h
Normal file
72
lib/include/nitro/snd/common/util.h
Normal 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
|
||||
2
main.lsf
2
main.lsf
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user