Added full bank and sample external loading

This commit is contained in:
KiritoDv
2023-09-15 20:47:05 -06:00
parent dc644cc2ae
commit 6315d3fdd4
32 changed files with 6335 additions and 1000 deletions
+2 -95
View File
@@ -15,8 +15,8 @@ set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use")
set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard to use")
add_compile_options($<$<CXX_COMPILER_ID:MSVC>:/MP>)
add_compile_options($<$<CXX_COMPILER_ID:MSVC>:/MT>)
# add_compile_options(-fsanitize=address)
# add_link_options(-fsanitize=address)
#add_compile_options(-fsanitize=address)
#add_link_options(-fsanitize=address)
# Add a custom module path to locate additional CMake modules
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
@@ -507,99 +507,6 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang")
endif()
endif()
#==============================================================================#
# Sound File Generation #
#==============================================================================#
execute_process(
OUTPUT_VARIABLE endian_and_bitwidth
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/determine-endian-bitwidth.py
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
string(REPLACE " " ";" endian_and_bitwidth ${endian_and_bitwidth})
set (TABLE_FILES "")
file(GLOB_RECURSE AIFF_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS "*.aiff")
foreach(aifffile ${AIFF_FILES})
get_filename_component(OUTPUT_FILE_WLE ${aifffile} NAME_WLE)
get_filename_component(OUTPUT_DIR ${aifffile} DIRECTORY)
set(OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_DIR}/${OUTPUT_FILE_WLE}.table)
list(APPEND TABLE_FILES ${OUTPUT_FILE})
add_custom_command(
OUTPUT ${OUTPUT_FILE}
COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
VERBATIM COMMAND ${CMAKE_COMMAND} -E env "TOOLS_PATH=$<TARGET_FILE_DIR:mio0>" $<TARGET_FILE:aiff_extract_cookbook> ${CMAKE_CURRENT_SOURCE_DIR}/${aifffile} > ${OUTPUT_FILE}
DEPENDS aiff_extract_cookbook
DEPENDS ${aifffile}
)
endforeach(aifffile)
set(AIFC_FILES "")
foreach(aifffile ${AIFF_FILES})
get_filename_component(OUTPUT_FILE_WLE ${aifffile} NAME_WLE)
get_filename_component(OUTPUT_DIR ${aifffile} DIRECTORY)
set(OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_DIR}/${OUTPUT_FILE_WLE}.aifc)
list(APPEND AIFC_FILES ${OUTPUT_FILE})
add_custom_command(
OUTPUT ${OUTPUT_FILE}
COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
VERBATIM COMMAND $<TARGET_FILE:vadpcm_enc> -c ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_DIR}/${OUTPUT_FILE_WLE}.table ${CMAKE_CURRENT_SOURCE_DIR}/${aifffile} ${OUTPUT_FILE}
DEPENDS vadpcm_enc
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_DIR}/${OUTPUT_FILE_WLE}.table ${CMAKE_CURRENT_SOURCE_DIR}/${aifffile}
)
endforeach(aifffile)
add_custom_command(
OUTPUT sound/sound_data.ctl.inc.c sound/sound_data.tbl.inc.c
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/assemble_sound.py ${CMAKE_CURRENT_BINARY_DIR}/sound/samples/ ${CMAKE_CURRENT_SOURCE_DIR}/sound/sound_banks ${CMAKE_CURRENT_BINARY_DIR}/sound/sound_data.ctl ${CMAKE_CURRENT_BINARY_DIR}/sound/ctl_header ${CMAKE_CURRENT_BINARY_DIR}/sound/sound_data.tbl ${CMAKE_CURRENT_BINARY_DIR}/sound/tbl_header -DVERSION_US ${endian_and_bitwidth}
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/conv2hex.py ${CMAKE_CURRENT_BINARY_DIR}/sound/sound_data.ctl > ${CMAKE_CURRENT_BINARY_DIR}/sound/sound_data.ctl.inc.c
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/conv2hex.py ${CMAKE_CURRENT_BINARY_DIR}/sound/sound_data.tbl > ${CMAKE_CURRENT_BINARY_DIR}/sound/sound_data.tbl.inc.c
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS ${TABLE_FILES}
DEPENDS ${AIFC_FILES}
)
list(APPEND INC_C_FILES ${CMAKE_CURRENT_BINARY_DIR}/sound/sound_data.ctl.inc.c ${CMAKE_CURRENT_BINARY_DIR}/sound/sound_data.tbl.inc.c)
file(GLOB_RECURSE SEQUENCES_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "sound/*.m64")
file(GLOB_RECURSE SEQUENCES_S_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "sound/*.s")
foreach(sequence_s ${SEQUENCES_S_FILES})
get_filename_component(OUTPUT_FILE_WLE ${sequence_s} NAME_WLE)
get_filename_component(OUTPUT_DIR ${sequence_s} DIRECTORY)
set(OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_DIR}/${OUTPUT_FILE_WLE}.m64)
if(APPLE)
set(COPY_COMMAND i686-w64-mingw32-objcopy)
else()
set(COPY_COMMAND objcopy)
endif()
if(APPLE)
set(AS_COMMAND i686-w64-mingw32-as)
else()
set(AS_COMMAND as)
endif()
add_custom_command(
OUTPUT ${OUTPUT_FILE}
COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
COMMAND ${CPP} ${CMAKE_CURRENT_SOURCE_DIR}/${sequence_s} -I${CMAKE_CURRENT_SOURCE_DIR}/include -DVERSION_US | ${AS_COMMAND} -o ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_DIR}/${OUTPUT_FILE_WLE}.o
VERBATIM COMMAND ${COPY_COMMAND} -j .rodata ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_DIR}/${OUTPUT_FILE_WLE}.o -O binary ${OUTPUT_FILE}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${sequence_s}
)
list(APPEND SEQUENCES_FILES ${OUTPUT_FILE})
endforeach(sequence_s)
add_custom_command(
OUTPUT sound/sequences.bin.inc.c sound/bank_sets.inc.c
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/assemble_sound.py --sequences ${CMAKE_CURRENT_BINARY_DIR}/sound/sequences.bin ${CMAKE_CURRENT_BINARY_DIR}/sound/sequences_header ${CMAKE_CURRENT_BINARY_DIR}/sound/bank_sets ${CMAKE_CURRENT_SOURCE_DIR}/sound/sound_banks ${CMAKE_CURRENT_SOURCE_DIR}/sound/sequences.json ${SEQUENCES_FILES} -DVERSION_US ${endian_and_bitwidth}
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/conv2hex.py ${CMAKE_CURRENT_BINARY_DIR}/sound/sequences.bin > ${CMAKE_CURRENT_BINARY_DIR}/sound/sequences.bin.inc.c
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/conv2hex.py ${CMAKE_CURRENT_BINARY_DIR}/sound/bank_sets > ${CMAKE_CURRENT_BINARY_DIR}/sound/bank_sets.inc.c
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS ${SEQUENCES_FILES}
)
list(APPEND INC_C_FILES ${CMAKE_CURRENT_BINARY_DIR}/sound/sequences.bin.inc.c ${CMAKE_CURRENT_BINARY_DIR}/sound/bank_sets.inc.c)
add_custom_target(
ConvertIncCFiles
DEPENDS ${INC_C_FILES}
+1
View File
@@ -1086,6 +1086,7 @@
"sound/sequences/sh/20_cutscene_ending.m64": [1887,{"sh":[7981824]}],
"sound/sequences/sh/21_menu_file_select.m64": [786,{"sh":[7983712]}],
"sound/sequences/sh/22_cutscene_lakitu.m64": [317,{"sh":[7984512]}],
"sound/sequences/us/00_sound_player.m64": [13456,{"us":[8063360]}],
"sound/sequences/us/01_cutscene_collect_star.m64": [619,{"us":[8076816]}],
"sound/sequences/us/02_menu_title_screen.m64": [8254,{"us":[8077440]}],
"sound/sequences/us/03_level_grass.m64": [5122,{"us":[8085696]}],
+129
View File
@@ -0,0 +1,129 @@
#pragma once
#include "align_asset_macro.h"
#define dgBank00 "__OTR__sound/banks/us/00_bank"
static const ALIGN_ASSET(2) char gBank00[] = dgBank00;
#define dgBank01 "__OTR__sound/banks/us/01_bank"
static const ALIGN_ASSET(2) char gBank01[] = dgBank01;
#define dgBank02 "__OTR__sound/banks/us/02_bank"
static const ALIGN_ASSET(2) char gBank02[] = dgBank02;
#define dgBank03 "__OTR__sound/banks/us/03_bank"
static const ALIGN_ASSET(2) char gBank03[] = dgBank03;
#define dgBank04 "__OTR__sound/banks/us/04_bank"
static const ALIGN_ASSET(2) char gBank04[] = dgBank04;
#define dgBank05 "__OTR__sound/banks/us/05_bank"
static const ALIGN_ASSET(2) char gBank05[] = dgBank05;
#define dgBank06 "__OTR__sound/banks/us/06_bank"
static const ALIGN_ASSET(2) char gBank06[] = dgBank06;
#define dgBank07 "__OTR__sound/banks/us/07_bank"
static const ALIGN_ASSET(2) char gBank07[] = dgBank07;
#define dgBank08 "__OTR__sound/banks/us/08_bank"
static const ALIGN_ASSET(2) char gBank08[] = dgBank08;
#define dgBank09 "__OTR__sound/banks/us/09_bank"
static const ALIGN_ASSET(2) char gBank09[] = dgBank09;
#define dgBank0A "__OTR__sound/banks/us/0A_bank"
static const ALIGN_ASSET(2) char gBank0A[] = dgBank0A;
#define dgBank0B "__OTR__sound/banks/us/0B_bank"
static const ALIGN_ASSET(2) char gBank0B[] = dgBank0B;
#define dgBank0C "__OTR__sound/banks/us/0C_bank"
static const ALIGN_ASSET(2) char gBank0C[] = dgBank0C;
#define dgBank0D "__OTR__sound/banks/us/0D_bank"
static const ALIGN_ASSET(2) char gBank0D[] = dgBank0D;
#define dgBank0E "__OTR__sound/banks/us/0E_bank"
static const ALIGN_ASSET(2) char gBank0E[] = dgBank0E;
#define dgBank0F "__OTR__sound/banks/us/0F_bank"
static const ALIGN_ASSET(2) char gBank0F[] = dgBank0F;
#define dgBank10 "__OTR__sound/banks/us/10_bank"
static const ALIGN_ASSET(2) char gBank10[] = dgBank10;
#define dgBank11 "__OTR__sound/banks/us/11_bank"
static const ALIGN_ASSET(2) char gBank11[] = dgBank11;
#define dgBank12 "__OTR__sound/banks/us/12_bank"
static const ALIGN_ASSET(2) char gBank12[] = dgBank12;
#define dgBank13 "__OTR__sound/banks/us/13_bank"
static const ALIGN_ASSET(2) char gBank13[] = dgBank13;
#define dgBank14 "__OTR__sound/banks/us/14_bank"
static const ALIGN_ASSET(2) char gBank14[] = dgBank14;
#define dgBank15 "__OTR__sound/banks/us/15_bank"
static const ALIGN_ASSET(2) char gBank15[] = dgBank15;
#define dgBank16 "__OTR__sound/banks/us/16_bank"
static const ALIGN_ASSET(2) char gBank16[] = dgBank16;
#define dgBank17 "__OTR__sound/banks/us/17_bank"
static const ALIGN_ASSET(2) char gBank17[] = dgBank17;
#define dgBank18 "__OTR__sound/banks/us/18_bank"
static const ALIGN_ASSET(2) char gBank18[] = dgBank18;
#define dgBank19 "__OTR__sound/banks/us/19_bank"
static const ALIGN_ASSET(2) char gBank19[] = dgBank19;
#define dgBank1A "__OTR__sound/banks/us/1A_bank"
static const ALIGN_ASSET(2) char gBank1A[] = dgBank1A;
#define dgBank1B "__OTR__sound/banks/us/1B_bank"
static const ALIGN_ASSET(2) char gBank1B[] = dgBank1B;
#define dgBank1C "__OTR__sound/banks/us/1C_bank"
static const ALIGN_ASSET(2) char gBank1C[] = dgBank1C;
#define dgBank1D "__OTR__sound/banks/us/1D_bank"
static const ALIGN_ASSET(2) char gBank1D[] = dgBank1D;
#define dgBank1E "__OTR__sound/banks/us/1E_bank"
static const ALIGN_ASSET(2) char gBank1E[] = dgBank1E;
#define dgBank1F "__OTR__sound/banks/us/1F_bank"
static const ALIGN_ASSET(2) char gBank1F[] = dgBank1F;
#define dgBank20 "__OTR__sound/banks/us/20_bank"
static const ALIGN_ASSET(2) char gBank20[] = dgBank20;
#define dgBank21 "__OTR__sound/banks/us/21_bank"
static const ALIGN_ASSET(2) char gBank21[] = dgBank21;
#define dgBank22 "__OTR__sound/banks/us/22_bank"
static const ALIGN_ASSET(2) char gBank22[] = dgBank22;
#define dgBank23 "__OTR__sound/banks/us/23_bank"
static const ALIGN_ASSET(2) char gBank23[] = dgBank23;
#define dgBank24 "__OTR__sound/banks/us/24_bank"
static const ALIGN_ASSET(2) char gBank24[] = dgBank24;
#define dgBank25 "__OTR__sound/banks/us/25_bank"
static const ALIGN_ASSET(2) char gBank25[] = dgBank25;
static const char* gBankTable[] = {
gBank00, gBank01, gBank02, gBank03,
gBank04, gBank05, gBank06, gBank07,
gBank08, gBank09, gBank0A, gBank0B,
gBank0C, gBank0D, gBank0E, gBank0F,
gBank10, gBank11, gBank12, gBank13,
gBank14, gBank15, gBank16, gBank17,
gBank18, gBank19, gBank1A, gBank1B,
gBank1C, gBank1D, gBank1E, gBank1F,
gBank20, gBank21, gBank22, gBank23,
gBank24, gBank25,
};
+4831
View File
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -20,4 +20,5 @@ Note that RECT commands must be enhanced to support negative coordinates with th
#define GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(v) ((int)floorf(GFX_DIMENSIONS_FROM_LEFT_EDGE(v)))
#define GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(v) ((int)ceilf(GFX_DIMENSIONS_FROM_RIGHT_EDGE(v)))
// If screen is taller than it is wide, radius should be equal to SCREEN_HEIGHT since we scale horizontally
#define GFX_DIMENSIONS_FULL_RADIUS (SCREEN_HEIGHT * (GFX_DIMENSIONS_ASPECT_RATIO > 1 ? GFX_DIMENSIONS_ASPECT_RATIO : 1))
#define GFX_DIMENSIONS_FULL_RADIUS (SCREEN_HEIGHT * (GFX_DIMENSIONS_ASPECT_RATIO > 1 ? GFX_DIMENSIONS_ASPECT_RATIO : 1))
#define GFX_FULL_WIDTH GFX_DIMENSIONS_FROM_RIGHT_EDGE(0)
File diff suppressed because it is too large Load Diff
+119
View File
@@ -0,0 +1,119 @@
#pragma once
#include "align_asset_macro.h"
#define dgSequence00 "__OTR__sound/sequences/us/00_sound_player"
static const ALIGN_ASSET(2) char gSequence00[] = dgSequence00;
#define dgSequence01 "__OTR__sound/sequences/us/01_cutscene_collect_star"
static const ALIGN_ASSET(2) char gSequence01[] = dgSequence01;
#define dgSequence02 "__OTR__sound/sequences/us/02_menu_title_screen"
static const ALIGN_ASSET(2) char gSequence02[] = dgSequence02;
#define dgSequence03 "__OTR__sound/sequences/us/03_level_grass"
static const ALIGN_ASSET(2) char gSequence03[] = dgSequence03;
#define dgSequence04 "__OTR__sound/sequences/us/04_level_inside_castle"
static const ALIGN_ASSET(2) char gSequence04[] = dgSequence04;
#define dgSequence05 "__OTR__sound/sequences/us/05_level_water"
static const ALIGN_ASSET(2) char gSequence05[] = dgSequence05;
#define dgSequence06 "__OTR__sound/sequences/us/06_level_hot"
static const ALIGN_ASSET(2) char gSequence06[] = dgSequence06;
#define dgSequence07 "__OTR__sound/sequences/us/07_level_boss_koopa"
static const ALIGN_ASSET(2) char gSequence07[] = dgSequence07;
#define dgSequence08 "__OTR__sound/sequences/us/08_level_snow"
static const ALIGN_ASSET(2) char gSequence08[] = dgSequence08;
#define dgSequence09 "__OTR__sound/sequences/us/09_level_slide"
static const ALIGN_ASSET(2) char gSequence09[] = dgSequence09;
#define dgSequence0A "__OTR__sound/sequences/us/0A_level_spooky"
static const ALIGN_ASSET(2) char gSequence0A[] = dgSequence0A;
#define dgSequence0B "__OTR__sound/sequences/us/0B_event_piranha_plant"
static const ALIGN_ASSET(2) char gSequence0B[] = dgSequence0B;
#define dgSequence0C "__OTR__sound/sequences/us/0C_level_underground"
static const ALIGN_ASSET(2) char gSequence0C[] = dgSequence0C;
#define dgSequence0D "__OTR__sound/sequences/us/0D_menu_star_select"
static const ALIGN_ASSET(2) char gSequence0D[] = dgSequence0D;
#define dgSequence0E "__OTR__sound/sequences/us/0E_event_powerup"
static const ALIGN_ASSET(2) char gSequence0E[] = dgSequence0E;
#define dgSequence0F "__OTR__sound/sequences/us/0F_event_metal_cap"
static const ALIGN_ASSET(2) char gSequence0F[] = dgSequence0F;
#define dgSequence10 "__OTR__sound/sequences/us/10_event_koopa_message"
static const ALIGN_ASSET(2) char gSequence10[] = dgSequence10;
#define dgSequence11 "__OTR__sound/sequences/us/11_level_koopa_road"
static const ALIGN_ASSET(2) char gSequence11[] = dgSequence11;
#define dgSequence12 "__OTR__sound/sequences/us/12_event_high_score"
static const ALIGN_ASSET(2) char gSequence12[] = dgSequence12;
#define dgSequence13 "__OTR__sound/sequences/us/13_event_merry_go_round"
static const ALIGN_ASSET(2) char gSequence13[] = dgSequence13;
#define dgSequence14 "__OTR__sound/sequences/us/14_event_race"
static const ALIGN_ASSET(2) char gSequence14[] = dgSequence14;
#define dgSequence15 "__OTR__sound/sequences/us/15_cutscene_star_spawn"
static const ALIGN_ASSET(2) char gSequence15[] = dgSequence15;
#define dgSequence16 "__OTR__sound/sequences/us/16_event_boss"
static const ALIGN_ASSET(2) char gSequence16[] = dgSequence16;
#define dgSequence17 "__OTR__sound/sequences/us/17_cutscene_collect_key"
static const ALIGN_ASSET(2) char gSequence17[] = dgSequence17;
#define dgSequence18 "__OTR__sound/sequences/us/18_event_endless_stairs"
static const ALIGN_ASSET(2) char gSequence18[] = dgSequence18;
#define dgSequence19 "__OTR__sound/sequences/us/19_level_boss_koopa_final"
static const ALIGN_ASSET(2) char gSequence19[] = dgSequence19;
#define dgSequence1A "__OTR__sound/sequences/us/1A_cutscene_credits"
static const ALIGN_ASSET(2) char gSequence1A[] = dgSequence1A;
#define dgSequence1B "__OTR__sound/sequences/us/1B_event_solve_puzzle"
static const ALIGN_ASSET(2) char gSequence1B[] = dgSequence1B;
#define dgSequence1C "__OTR__sound/sequences/us/1C_event_toad_message"
static const ALIGN_ASSET(2) char gSequence1C[] = dgSequence1C;
#define dgSequence1D "__OTR__sound/sequences/us/1D_event_peach_message"
static const ALIGN_ASSET(2) char gSequence1D[] = dgSequence1D;
#define dgSequence1E "__OTR__sound/sequences/us/1E_cutscene_intro"
static const ALIGN_ASSET(2) char gSequence1E[] = dgSequence1E;
#define dgSequence1F "__OTR__sound/sequences/us/1F_cutscene_victory"
static const ALIGN_ASSET(2) char gSequence1F[] = dgSequence1F;
#define dgSequence20 "__OTR__sound/sequences/us/20_cutscene_ending"
static const ALIGN_ASSET(2) char gSequence20[] = dgSequence20;
#define dgSequence21 "__OTR__sound/sequences/us/21_menu_file_select"
static const ALIGN_ASSET(2) char gSequence21[] = dgSequence21;
#define dgSequence22 "__OTR__sound/sequences/us/22_cutscene_lakitu"
static const ALIGN_ASSET(2) char gSequence22[] = dgSequence22;
static const char* gSequenceTable[] = {
gSequence00, gSequence01, gSequence02, gSequence03,
gSequence04, gSequence05, gSequence06, gSequence07,
gSequence08, gSequence09, gSequence0A, gSequence0B,
gSequence0C, gSequence0D, gSequence0E, gSequence0F,
gSequence10, gSequence11, gSequence12, gSequence13,
gSequence14, gSequence15, gSequence16, gSequence17,
gSequence18, gSequence19, gSequence1A, gSequence1B,
gSequence1C, gSequence1D, gSequence1E, gSequence1F,
gSequence20, gSequence21, gSequence22,
};
+2 -6
View File
@@ -1,3 +1,5 @@
#include "sound/sound_data.h"
unsigned char gSoundDataADSR[] = {
#include "sound/sound_data.ctl.inc.c"
};
@@ -9,9 +11,3 @@ unsigned char gSoundDataRaw[] = {
unsigned char gMusicData[] = {
#include "sound/sequences.bin.inc.c"
};
#ifndef VERSION_SH
unsigned char gBankSetsData[] = {
#include "sound/bank_sets.inc.c"
};
#endif
+11
View File
@@ -0,0 +1,11 @@
#pragma once
#include "types.h"
#include "align_asset_macro.h"
extern u8 gSoundDataADSR[]; // sound_data.ctl
extern u8 gSoundDataRaw[]; // sound_data.tbl
extern u8 gMusicData[]; // sequences.s
#define dgBankSetsData "__OTR__sound/bank_sets"
static const ALIGN_ASSET(2) char gBankSetsData[] = dgBankSetsData;
@@ -19,81 +19,6 @@
#define PORTAMENTO_MODE_4 4
#define PORTAMENTO_MODE_5 5
#define COPT 0
#define M64_READ_U8(state, dst) \
{ \
u8 * _ptr_pc; \
u8 _pc; \
_ptr_pc = (*state).pc; \
((*state).pc)++; \
_pc = *_ptr_pc; \
dst = _pc; \
}
#define M64_READ_S16(state, dst) \
{ \
s16 _ret; \
_ret = *(*state).pc << 8; \
((*state).pc)++; \
_ret = *(*state).pc | _ret; \
((*state).pc)++; \
dst = _ret; \
}
#define M64_READ_COMPRESSED_U16(state, dst) \
{ \
u16 ret = *(state->pc++); \
if (ret & 0x80) { \
ret = (ret << 8) & 0x7f00; \
ret = *(state->pc++) | ret; \
} \
dst = ret; \
}
#define GET_INSTRUMENT(seqChannel, instId, _instOut, _adsr, dst, l) \
{ \
struct AdsrSettings *adsr = _adsr; \
struct Instrument **instOut = _instOut;\
u8 _instId = instId; \
struct Instrument *inst; \
UNUSED u32 pad; \
/* copt inlines instId here */ \
if (instId >= gCtlEntries[(*seqChannel).bankId].numInstruments) { \
_instId = gCtlEntries[(*seqChannel).bankId].numInstruments; \
if (_instId == 0) { \
dst = 0; \
goto ret ## l; \
} \
_instId--; \
} \
inst = gCtlEntries[(*seqChannel).bankId].instruments[_instId]; \
if (inst == NULL) { \
while (_instId != 0xff) { \
inst = gCtlEntries[(*seqChannel).bankId].instruments[_instId]; \
if (inst != NULL) { \
goto gi ## l; \
} \
_instId--; \
} \
gi ## l:; \
} \
if (((uintptr_t) gBankLoadedPool.persistent.pool.start <= (uintptr_t) inst \
&& (uintptr_t) inst <= (uintptr_t)(gBankLoadedPool.persistent.pool.start \
+ gBankLoadedPool.persistent.pool.size)) \
|| ((uintptr_t) gBankLoadedPool.temporary.pool.start <= (uintptr_t) inst \
&& (uintptr_t) inst <= (uintptr_t)(gBankLoadedPool.temporary.pool.start \
+ gBankLoadedPool.temporary.pool.size))) { \
(*adsr).envelope = (*inst).envelope; \
(*adsr).releaseRate = (*inst).releaseRate; \
*instOut = inst; \
_instId++; \
goto ret ## l; \
} \
gAudioErrorFlags = _instId + 0x20000; \
*instOut = NULL; \
ret ## l: ; \
}
void seq_channel_layer_process_script(struct SequenceChannelLayer *layer) {
struct SequencePlayer *seqPlayer; // sp5C, t4
struct SequenceChannel *seqChannel; // sp58, t5
@@ -150,7 +75,8 @@ void seq_channel_layer_process_script(struct SequenceChannelLayer *layer) {
seqPlayer = (*seqChannel).seqPlayer;
for (;;) {
state = &layer->scriptState;
//M64_READ_U8(state, cmd);
// M64_READ_U8(state, cmd);
// cmd = m64_read_u8(state);
{
u8 *_ptr_pc;
_ptr_pc = (*state).pc++;
@@ -173,13 +99,13 @@ void seq_channel_layer_process_script(struct SequenceChannelLayer *layer) {
break;
case 0xfc: // layer_call
M64_READ_S16(state, sp3A);
sp3A = m64_read_s16(state);
state->depth++, state->stack[state->depth - 1] = state->pc;
state->pc = seqPlayer->seqData + sp3A;
break;
case 0xf8: // layer_loop; loop start, N iterations (or 256 if N = 0)
M64_READ_U8(state, state->remLoopIters[state->depth]);
state->remLoopIters[state->depth] = m64_read_u8(state);
state->depth++, state->stack[state->depth - 1] = state->pc;
break;
@@ -192,7 +118,7 @@ void seq_channel_layer_process_script(struct SequenceChannelLayer *layer) {
break;
case 0xfb: // layer_jump
M64_READ_S16(state, sp3A);
sp3A = m64_read_s16(state);
state->pc = seqPlayer->seqData + sp3A;
break;
@@ -233,21 +159,21 @@ void seq_channel_layer_process_script(struct SequenceChannelLayer *layer) {
break;
case 0xc3: // layer_setshortnotedefaultplaypercentage
M64_READ_COMPRESSED_U16(state, sp3A);
sp3A = m64_read_compressed_u16(state);
layer->shortNoteDefaultPlayPercentage = sp3A;
break;
case 0xc6: // layer_setinstr
M64_READ_U8(state, cmdSemitone);
cmdSemitone = m64_read_u8(state);
if (cmdSemitone < 127) {
GET_INSTRUMENT(seqChannel, cmdSemitone, &(*layer).instrument, &(*layer).adsr, cmdSemitone, 1);
get_instrument(seqChannel, cmdSemitone, &(*layer).instrument, &(*layer).adsr);
}
break;
case 0xc7: // layer_portamento
M64_READ_U8(state, (*layer).portamento.mode);
M64_READ_U8(state, cmdSemitone);
(*layer).portamento.mode = m64_read_u8(state);
cmdSemitone = m64_read_u8(state);
cmdSemitone = cmdSemitone + (*seqChannel).transposition;
cmdSemitone += (*layer).transposition;
@@ -264,7 +190,7 @@ void seq_channel_layer_process_script(struct SequenceChannelLayer *layer) {
break;
}
M64_READ_COMPRESSED_U16(state, sp3A);
sp3A = m64_read_compressed_u16(state);
layer->portamentoTime = sp3A;
break;
@@ -286,7 +212,7 @@ void seq_channel_layer_process_script(struct SequenceChannelLayer *layer) {
}
if (cmd == 0xc0) { // layer_delay
M64_READ_COMPRESSED_U16(state, layer->delay);
layer->delay = m64_read_compressed_u16(state);
layer->stopSomething = TRUE;
} else {
layer->stopSomething = FALSE;
@@ -294,14 +220,14 @@ void seq_channel_layer_process_script(struct SequenceChannelLayer *layer) {
if (seqChannel->largeNotes == TRUE) {
switch (cmd & 0xc0) {
case 0x00: // layer_note0 (play percentage, velocity, duration)
M64_READ_COMPRESSED_U16(state, sp3A);
sp3A = m64_read_compressed_u16(state);
vel = *((*state).pc++);
layer->noteDuration = *((*state).pc++);
layer->playPercentage = sp3A;
goto l1090;
case 0x40: // layer_note1 (play percentage, velocity)
M64_READ_COMPRESSED_U16(state, sp3A);
sp3A = m64_read_compressed_u16(state);
vel = *((*state).pc++);
layer->noteDuration = 0;
layer->playPercentage = sp3A;
@@ -319,7 +245,7 @@ l1090:
} else {
switch (cmd & 0xc0) {
case 0x00: // play note, type 0 (play percentage)
M64_READ_COMPRESSED_U16(state, sp3A);
sp3A = m64_read_compressed_u16(state);
layer->playPercentage = sp3A;
goto l1138;
@@ -346,8 +272,9 @@ l1138:
} else {
if (seqChannel->instOrWave == 0) { // drum
cmdSemitone += (*seqChannel).transposition + (*layer).transposition;
if (cmdSemitone >= gCtlEntries[seqChannel->bankId].numDrums) {
cmdSemitone = gCtlEntries[seqChannel->bankId].numDrums;
struct CtlEntry* bank = GameEngine_LoadBank(seqChannel->bankId);
if (cmdSemitone >= bank->numDrums) {
cmdSemitone = bank->numDrums;
if (cmdSemitone == 0) {
// this goto looks a bit like a function return...
layer->stopSomething = TRUE;
@@ -357,7 +284,7 @@ l1138:
cmdSemitone--;
}
drum = gCtlEntries[seqChannel->bankId].drums[cmdSemitone];
drum = bank->drums[cmdSemitone];
if (drum == NULL) {
layer->stopSomething = TRUE;
} else {
@@ -380,8 +307,6 @@ l1138:
}
if (layer->portamento.mode != 0) {
//! copt needs a ternary:
//usedSemitone = (layer->portamentoTargetNote < cmdSemitone) ? cmdSemitone : layer->portamentoTargetNote;
if (layer->portamentoTargetNote < cmdSemitone) {
usedSemitone = cmdSemitone;
} else {
-70
View File
@@ -440,76 +440,6 @@ void process_level_music_dynamics(void);
static u8 begin_background_music_fade(u16 fadeDuration);
void func_80320ED8(void);
#ifndef VERSION_JP
void unused_8031E4F0(void) {
// This is a debug function which is almost entirely optimized away,
// except for loops, string literals, and a read of a volatile variable.
// The string literals have allowed it to be partially reconstructed.
s32 i;
stubbed_printf("AUTOSEQ ");
stubbed_printf("%2x %2x <%5x : %5x / %5x>\n", gSeqLoadedPool.temporary.entries[0].id,
gSeqLoadedPool.temporary.entries[1].id, gSeqLoadedPool.temporary.entries[0].size,
gSeqLoadedPool.temporary.entries[1].size, gSeqLoadedPool.temporary.pool.size);
stubbed_printf("AUTOBNK ");
stubbed_printf("%2x %3x <%5x : %5x / %5x>\n", gBankLoadedPool.temporary.entries[0].id,
gBankLoadedPool.temporary.entries[1].id, gBankLoadedPool.temporary.entries[0].size,
gBankLoadedPool.temporary.entries[1].size, gBankLoadedPool.temporary.pool.size);
stubbed_printf("STAYSEQ ");
stubbed_printf("[%2x] <%5x / %5x>\n", gSeqLoadedPool.persistent.numEntries,
gSeqLoadedPool.persistent.pool.cur - gSeqLoadedPool.persistent.pool.start,
gSeqLoadedPool.persistent.pool.size);
for (i = 0; (u32) i < gSeqLoadedPool.persistent.numEntries; i++) {
stubbed_printf("%2x ", gSeqLoadedPool.persistent.entries[i].id);
}
stubbed_printf("\n");
stubbed_printf("STAYBNK ");
stubbed_printf("[%2x] <%5x / %5x>\n", gBankLoadedPool.persistent.numEntries,
gBankLoadedPool.persistent.pool.cur - gBankLoadedPool.persistent.pool.start,
gBankLoadedPool.persistent.pool.size);
for (i = 0; (u32) i < gBankLoadedPool.persistent.numEntries; i++) {
stubbed_printf("%2x ", gBankLoadedPool.persistent.entries[i].id);
}
stubbed_printf("\n\n");
stubbed_printf(" 0123456789ABCDEF0123456789ABCDEF01234567\n");
stubbed_printf("--------------------------------------------\n");
// gSeqLoadStatus/gBankLoadStatus, 4 entries at a time?
stubbed_printf("SEQ ");
for (i = 0; i < 40; i++) {
stubbed_printf("%1x", 0);
}
stubbed_printf("\n");
stubbed_printf("BNK ");
for (i = 0; i < 40; i += 4) {
stubbed_printf("%1x", 0);
}
stubbed_printf("\n");
stubbed_printf("FIXHEAP ");
stubbed_printf("%4x / %4x\n", 0, 0);
stubbed_printf("DRVHEAP ");
stubbed_printf("%5x / %5x\n", 0, 0);
stubbed_printf("DMACACHE %4d Blocks\n", 0);
stubbed_printf("CHANNELS %2d / MAX %3d \n", 0, 0);
stubbed_printf("TEMPOMAX %d\n", gTempoInternalToExternal / TEMPO_SCALE);
stubbed_printf("TEMPO G0 %d\n", gSequencePlayers[SEQ_PLAYER_LEVEL].tempo / TEMPO_SCALE);
stubbed_printf("TEMPO G1 %d\n", gSequencePlayers[SEQ_PLAYER_ENV].tempo / TEMPO_SCALE);
stubbed_printf("TEMPO G2 %d\n", gSequencePlayers[SEQ_PLAYER_SFX].tempo / TEMPO_SCALE);
stubbed_printf("DEBUGFLAG %8x\n", gAudioErrorFlags);
}
void unused_8031E568(void) {
stubbed_printf("COUNT %8d\n", gAudioFrameCount);
}
#endif
#if defined(VERSION_EU) || defined(VERSION_SH)
const char unusedErrorStr1[] = "Error : Queue is not empty ( %x ) \n";
const char unusedErrorStr2[] = "specchg error\n";
-30
View File
@@ -36,9 +36,6 @@ u8 sAudioHeapPad[0x20]; // probably two unused pools
struct SoundAllocPool gSeqAndBankPool;
struct SoundAllocPool gPersistentCommonPool;
struct SoundAllocPool gTemporaryCommonPool;
struct SoundMultiPool gSeqLoadedPool;
struct SoundMultiPool gBankLoadedPool;
struct SoundMultiPool gUnusedLoadedPool;
#ifdef VERSION_SH
@@ -55,8 +52,6 @@ struct PoolSplit sTemporaryCommonPoolSplit;
#ifdef VERSION_SH
u8 gUnkLoadStatus[0x40];
#endif
u8 gBankLoadStatus[0x40];
u8 gSeqLoadStatus[0x100];
#if defined(VERSION_EU) || defined(VERSION_SH)
volatile u8 gAudioResetStatus;
@@ -188,14 +183,6 @@ void reset_bank_and_seq_load_status(void) {
gSeqLoadStatus[i] = SOUND_LOAD_STATUS_NOT_LOADED;
}
}
#else
for (i = 0; i < 64; i++) {
gBankLoadStatus[i] = SOUND_LOAD_STATUS_NOT_LOADED;
}
for (i = 0; i < 256; i++) {
gSeqLoadStatus[i] = SOUND_LOAD_STATUS_NOT_LOADED;
}
#endif
}
@@ -361,23 +348,15 @@ void seq_and_bank_pool_init(struct PoolSplit2 *a) {
void persistent_pools_init(struct PoolSplit *a) {
gPersistentCommonPool.cur = gPersistentCommonPool.start;
sound_alloc_pool_init(&gSeqLoadedPool.persistent.pool, SOUND_ALLOC_FUNC(&gPersistentCommonPool, a->wantSeq), a->wantSeq);
sound_alloc_pool_init(&gBankLoadedPool.persistent.pool, SOUND_ALLOC_FUNC(&gPersistentCommonPool, a->wantBank), a->wantBank);
sound_alloc_pool_init(&gUnusedLoadedPool.persistent.pool, SOUND_ALLOC_FUNC(&gPersistentCommonPool, a->wantUnused),
a->wantUnused);
persistent_pool_clear(&gSeqLoadedPool.persistent);
persistent_pool_clear(&gBankLoadedPool.persistent);
persistent_pool_clear(&gUnusedLoadedPool.persistent);
}
void temporary_pools_init(struct PoolSplit *a) {
gTemporaryCommonPool.cur = gTemporaryCommonPool.start;
sound_alloc_pool_init(&gSeqLoadedPool.temporary.pool, SOUND_ALLOC_FUNC(&gTemporaryCommonPool, a->wantSeq), a->wantSeq);
sound_alloc_pool_init(&gBankLoadedPool.temporary.pool, SOUND_ALLOC_FUNC(&gTemporaryCommonPool, a->wantBank), a->wantBank);
sound_alloc_pool_init(&gUnusedLoadedPool.temporary.pool, SOUND_ALLOC_FUNC(&gTemporaryCommonPool, a->wantUnused),
a->wantUnused);
temporary_pool_clear(&gSeqLoadedPool.temporary);
temporary_pool_clear(&gBankLoadedPool.temporary);
temporary_pool_clear(&gUnusedLoadedPool.temporary);
}
#undef SOUND_ALLOC_FUNC
@@ -444,15 +423,6 @@ void *alloc_bank_or_seq(struct SoundMultiPool *arg0, s32 arg1, s32 size, s32 arg
if (arg3 == 0) {
tp = &arg0->temporary;
#ifndef VERSION_SH
if (arg0 == &gSeqLoadedPool) {
table = gSeqLoadStatus;
isSound = FALSE;
} else if (arg0 == &gBankLoadedPool) {
table = gBankLoadStatus;
isSound = TRUE;
}
#endif
#ifdef VERSION_SH
if (tp->entries[0].id == (s8)nullID) {
+3 -6
View File
@@ -3,6 +3,7 @@
#include <libultra/types.h>
#include "port/Engine.h"
#include "internal.h"
#define SOUND_LOAD_STATUS_NOT_LOADED 0
@@ -12,8 +13,8 @@
#define SOUND_LOAD_STATUS_4 4
#define SOUND_LOAD_STATUS_5 5
#define IS_BANK_LOAD_COMPLETE(bankId) (gBankLoadStatus[bankId] >= SOUND_LOAD_STATUS_COMPLETE)
#define IS_SEQ_LOAD_COMPLETE(seqId) (gSeqLoadStatus[seqId] >= SOUND_LOAD_STATUS_COMPLETE)
#define IS_BANK_LOAD_COMPLETE(bankId) GameEngine_IsBankLoaded(bankId)
#define IS_SEQ_LOAD_COMPLETE(seqId) GameEngine_IsSequenceLoaded(seqId)
struct SoundAllocPool {
u8 *start;
@@ -91,15 +92,11 @@ extern struct SoundAllocPool gAudioInitPool;
extern struct SoundAllocPool gNotesAndBuffersPool;
extern struct SoundAllocPool gPersistentCommonPool;
extern struct SoundAllocPool gTemporaryCommonPool;
extern struct SoundMultiPool gSeqLoadedPool;
extern struct SoundMultiPool gBankLoadedPool;
#ifdef VERSION_SH
extern struct Unk1Pool gUnkPool1;
extern struct UnkPool gUnkPool2;
extern struct UnkPool gUnkPool3;
#endif
extern u8 gBankLoadStatus[64];
extern u8 gSeqLoadStatus[256];
extern volatile u8 gAudioResetStatus;
extern u8 gAudioResetPresetIdToLoad;
+3 -3
View File
@@ -163,13 +163,13 @@ struct AdpcmLoop {
u32 end;
u32 count;
u32 pad;
s16 state[16]; // only exists if count != 0. 8-byte aligned
s16* state; // only exists if count != 0. 8-byte aligned
};
struct AdpcmBook {
s32 order;
s32 npredictors;
s16 book[1]; // size 8 * order * npredictors. 8-byte aligned
s16* book; // size 8 * order * npredictors. 8-byte aligned
};
struct AudioBankSample {
@@ -217,7 +217,7 @@ struct Drum {
struct AudioBank {
struct Drum **drums;
struct Instrument *instruments[1];
struct Instrument **instruments;
}; // dynamic size
struct CtlEntry {
+26 -505
View File
File diff suppressed because it is too large Load Diff
-4
View File
@@ -30,12 +30,8 @@ extern struct NotePool gNoteFreeLists;
extern OSMesgQueue gCurrAudioFrameDmaQueue;
extern u32 gSampleDmaNumListItems;
extern ALSeqFile *gAlCtlHeader;
extern ALSeqFile *gAlTbl;
extern ALSeqFile *gSeqFileHeader;
extern u8 *gAlBankSets;
extern struct CtlEntry *gCtlEntries;
#if defined(VERSION_EU) || defined(VERSION_SH)
extern struct AudioBufferParametersEU gAudioBufferParameters;
#endif
+13 -177
View File
@@ -315,7 +315,7 @@ void sequence_player_disable(struct SequencePlayer *seqPlayer) {
&& gSeqLoadStatus[seqPlayer->seqId] != 5
#endif
) {
gSeqLoadStatus[seqPlayer->seqId] = SOUND_LOAD_STATUS_DISCARDABLE;
GameEngine_UnloadSequence(seqPlayer->seqId);
}
if (IS_BANK_LOAD_COMPLETE(seqPlayer->defaultBank[0])
@@ -326,26 +326,9 @@ void sequence_player_disable(struct SequencePlayer *seqPlayer) {
#ifdef VERSION_SH
gBankLoadStatus[seqPlayer->defaultBank[0]] = 4;
#else
gBankLoadStatus[seqPlayer->defaultBank[0]] = SOUND_LOAD_STATUS_DISCARDABLE;
GameEngine_UnloadBank(seqPlayer->defaultBank[0]);
#endif
}
// (Note that if this is called from alloc_bank_or_seq, the side will get swapped
// later in that function. Thus, we signal that we want to load into the slot
// of the bank that we no longer need.)
#if defined(VERSION_EU) || defined(VERSION_SH)
if (seqPlayer->defaultBank[0] == gBankLoadedPool.temporary.entries[0].id) {
gBankLoadedPool.temporary.nextSide = 1;
} else if (seqPlayer->defaultBank[0] == gBankLoadedPool.temporary.entries[1].id) {
gBankLoadedPool.temporary.nextSide = 0;
}
#else
if (gBankLoadedPool.temporary.entries[0].id == seqPlayer->defaultBank[0]) {
gBankLoadedPool.temporary.nextSide = 1;
} else if (gBankLoadedPool.temporary.entries[1].id == seqPlayer->defaultBank[0]) {
gBankLoadedPool.temporary.nextSide = 0;
}
#endif
}
/**
@@ -1401,10 +1384,13 @@ s32 seq_channel_layer_process_script_part3(struct SequenceChannelLayer *layer, s
#endif
u8 get_instrument(struct SequenceChannel *seqChannel, u8 instId, struct Instrument **instOut, struct AdsrSettings *adsr) {
struct Instrument *inst;
#if defined(VERSION_EU) || defined(VERSION_SH)
inst = get_instrument_inner(seqChannel->bankId, instId);
if (inst == NULL) {
struct CtlEntry *bank = GameEngine_LoadBank(seqChannel->bankId);
if(instId >= bank->numInstruments) {
*instOut = NULL;
return 0;
}
struct Instrument* inst = bank->instruments[instId];
if(inst == NULL) {
*instOut = NULL;
return 0;
}
@@ -1413,47 +1399,6 @@ u8 get_instrument(struct SequenceChannel *seqChannel, u8 instId, struct Instrume
*instOut = inst;
instId++;
return instId;
#else
UNUSED u32 pad;
if (instId >= gCtlEntries[seqChannel->bankId].numInstruments) {
instId = gCtlEntries[seqChannel->bankId].numInstruments;
if (instId == 0) {
return 0;
}
instId--;
}
inst = gCtlEntries[seqChannel->bankId].instruments[instId];
if (inst == NULL) {
struct SequenceChannel seqChannelCpy = *seqChannel;
while (instId != 0xff) {
inst = gCtlEntries[seqChannelCpy.bankId].instruments[instId];
if (inst != NULL) {
break;
}
instId--;
}
}
if (((uintptr_t) gBankLoadedPool.persistent.pool.start <= (uintptr_t) inst
&& (uintptr_t) inst <= (uintptr_t)(gBankLoadedPool.persistent.pool.start
+ gBankLoadedPool.persistent.pool.size))
|| ((uintptr_t) gBankLoadedPool.temporary.pool.start <= (uintptr_t) inst
&& (uintptr_t) inst <= (uintptr_t)(gBankLoadedPool.temporary.pool.start
+ gBankLoadedPool.temporary.pool.size))) {
adsr->envelope = inst->envelope;
adsr->releaseRate = inst->releaseRate;
*instOut = inst;
instId++;
return instId;
}
gAudioErrorFlags = instId + 0x20000;
*instOut = NULL;
return 0;
#endif
}
void set_instrument(struct SequenceChannel *seqChannel, u8 instId) {
@@ -1844,7 +1789,7 @@ void sequence_channel_process_script(struct SequenceChannel *seqChannel) {
#ifdef VERSION_SH
if (get_bank_or_seq(1, 2, cmd) != NULL)
#else
if (get_bank_or_seq(&gBankLoadedPool, 2, cmd) != NULL)
if(IS_BANK_LOAD_COMPLETE(cmd))
#endif
{
seqChannel->bankId = cmd;
@@ -2225,9 +2170,6 @@ void sequence_channel_process_script(struct SequenceChannel *seqChannel) {
void sequence_player_process_sequence(struct SequencePlayer *seqPlayer) {
u8 cmd;
#ifdef VERSION_SH
UNUSED u32 pad;
#endif
u8 loBits;
u8 temp;
s32 value;
@@ -2235,96 +2177,20 @@ void sequence_player_process_sequence(struct SequencePlayer *seqPlayer) {
u16 u16v;
u8 *seqData;
struct M64ScriptState *state;
#if defined(VERSION_EU) || defined(VERSION_SH)
s32 temp32;
#endif
if (seqPlayer->enabled == FALSE) {
return;
}
#ifndef VERSION_SH
if (seqPlayer->bankDmaInProgress == TRUE) {
#ifdef VERSION_EU
if (osRecvMesg(&seqPlayer->bankDmaMesgQueue, NULL, 0) == -1) {
return;
}
if (seqPlayer->bankDmaRemaining == 0) {
seqPlayer->bankDmaInProgress = FALSE;
patch_audio_bank(
(struct AudioBank *) (gCtlEntries[seqPlayer->loadingBankId].instruments - 1),
gAlTbl->seqArray[seqPlayer->loadingBankId].offset,
gCtlEntries[seqPlayer->loadingBankId].numInstruments,
gCtlEntries[seqPlayer->loadingBankId].numDrums);
gCtlEntries[seqPlayer->loadingBankId].drums =
((struct AudioBank *) (gCtlEntries[seqPlayer->loadingBankId].instruments - 1))->drums;
gBankLoadStatus[seqPlayer->loadingBankId] = SOUND_LOAD_STATUS_COMPLETE;
} else {
audio_dma_partial_copy_async(&seqPlayer->bankDmaCurrDevAddr, &seqPlayer->bankDmaCurrMemAddr,
&seqPlayer->bankDmaRemaining, &seqPlayer->bankDmaMesgQueue,
&seqPlayer->bankDmaIoMesg);
}
#else
if (!OS_MESG_VALID(seqPlayer->bankDmaMesg)) {
return;
}
if (seqPlayer->bankDmaRemaining == 0) {
seqPlayer->bankDmaInProgress = FALSE;
patch_audio_bank(seqPlayer->loadingBank, gAlTbl->seqArray[seqPlayer->loadingBankId].offset,
seqPlayer->loadingBankNumInstruments, seqPlayer->loadingBankNumDrums);
gCtlEntries[seqPlayer->loadingBankId].numInstruments = seqPlayer->loadingBankNumInstruments;
gCtlEntries[seqPlayer->loadingBankId].numDrums = seqPlayer->loadingBankNumDrums;
gCtlEntries[seqPlayer->loadingBankId].instruments = seqPlayer->loadingBank->instruments;
gCtlEntries[seqPlayer->loadingBankId].drums = seqPlayer->loadingBank->drums;
gBankLoadStatus[seqPlayer->loadingBankId] = SOUND_LOAD_STATUS_COMPLETE;
} else {
osCreateMesgQueue(&seqPlayer->bankDmaMesgQueue, &seqPlayer->bankDmaMesg, 1);
seqPlayer->bankDmaMesg = OS_MESG_PTR(NULL);
audio_dma_partial_copy_async(&seqPlayer->bankDmaCurrDevAddr, &seqPlayer->bankDmaCurrMemAddr,
&seqPlayer->bankDmaRemaining, &seqPlayer->bankDmaMesgQueue,
&seqPlayer->bankDmaIoMesg);
}
#endif
return;
}
if (seqPlayer->seqDmaInProgress == TRUE) {
#ifdef VERSION_EU
if (osRecvMesg(&seqPlayer->seqDmaMesgQueue, NULL, 0) == -1) {
return;
}
#else
if (!OS_MESG_VALID(seqPlayer->seqDmaMesg)) {
return;
}
#endif
seqPlayer->seqDmaInProgress = FALSE;
gSeqLoadStatus[seqPlayer->seqId] = SOUND_LOAD_STATUS_COMPLETE;
}
#endif
// If discarded, bail out.
if (IS_SEQ_LOAD_COMPLETE(seqPlayer->seqId) == FALSE
|| (
#ifdef VERSION_SH
seqPlayer->defaultBank[0] != 0xff &&
#endif
IS_BANK_LOAD_COMPLETE(seqPlayer->defaultBank[0]) == FALSE)) {
if (IS_SEQ_LOAD_COMPLETE(seqPlayer->seqId) == FALSE || IS_BANK_LOAD_COMPLETE(seqPlayer->defaultBank[0]) == FALSE ){
eu_stubbed_printf_1("Disappear Sequence or Bank %d\n", seqPlayer->seqId);
sequence_player_disable(seqPlayer);
return;
}
// Remove possible SOUND_LOAD_STATUS_DISCARDABLE marks.
#ifdef VERSION_SH
if (gSeqLoadStatus[seqPlayer->seqId] != 5)
#endif
gSeqLoadStatus[seqPlayer->seqId] = SOUND_LOAD_STATUS_COMPLETE;
#ifdef VERSION_SH
if (gBankLoadStatus[seqPlayer->defaultBank[0]] != 5)
#endif
gBankLoadStatus[seqPlayer->defaultBank[0]] = SOUND_LOAD_STATUS_COMPLETE;
GameEngine_LoadSequence(seqPlayer->seqId);
GameEngine_LoadBank(seqPlayer->defaultBank[0]);
if (seqPlayer->muted && (seqPlayer->muteBehavior & MUTE_BEHAVIOR_STOP_SCRIPT) != 0) {
return;
@@ -2354,11 +2220,7 @@ void sequence_player_process_sequence(struct SequencePlayer *seqPlayer) {
sequence_player_disable(seqPlayer);
break;
}
#if defined(VERSION_EU) || defined(VERSION_SH)
state->pc = state->stack[--state->depth];
#else
state->depth--, state->pc = state->stack[state->depth];
#endif
}
if (cmd == 0xfd) { // seq_delay
@@ -2378,27 +2240,13 @@ void sequence_player_process_sequence(struct SequencePlayer *seqPlayer) {
case 0xfc: // seq_call
u16v = m64_read_s16(state);
if (0 && state->depth >= 4) {
eu_stubbed_printf_0("Macro Level Over Error!\n");
}
#if defined(VERSION_EU) || defined(VERSION_SH)
state->stack[state->depth++] = state->pc;
#else
state->depth++, state->stack[state->depth - 1] = state->pc;
#endif
state->pc = seqPlayer->seqData + u16v;
break;
case 0xf8: // seq_loop; loop start, N iterations (or 256 if N = 0)
if (0 && state->depth >= 4) {
eu_stubbed_printf_0("Macro Level Over Error!\n");
}
state->remLoopIters[state->depth] = m64_read_u8(state);
#if defined(VERSION_EU) || defined(VERSION_SH)
state->stack[state->depth++] = state->pc;
#else
state->depth++, state->stack[state->depth - 1] = state->pc;
#endif
break;
case 0xf7: // seq_loopend
@@ -2725,18 +2573,11 @@ void process_sequences(UNUSED s32 iterationsRemaining) {
s32 i;
for (i = 0; i < SEQUENCE_PLAYERS; i++) {
if (gSequencePlayers[i].enabled == TRUE) {
#if defined(VERSION_EU) || defined(VERSION_SH)
sequence_player_process_sequence(&gSequencePlayers[i]);
sequence_player_process_sound(&gSequencePlayers[i]);
#else
sequence_player_process_sequence(gSequencePlayers + i);
sequence_player_process_sound(gSequencePlayers + i);
#endif
}
}
#if defined(VERSION_JP) || defined(VERSION_US)
reclaim_notes();
#endif
process_notes();
}
@@ -2788,11 +2629,6 @@ void init_sequence_players(void) {
for (i = 0; i < ARRAY_COUNT(gSequenceChannels); i++) {
gSequenceChannels[i].seqPlayer = NULL;
gSequenceChannels[i].enabled = FALSE;
#if defined(VERSION_JP) || defined(VERSION_US)
}
for (i = 0; i < ARRAY_COUNT(gSequenceChannels); i++) {
#endif
for (j = 0; j < LAYERS_MAX; j++) {
gSequenceChannels[i].layers[j] = NULL;
}
+19 -2
View File
@@ -59,6 +59,8 @@ struct Skybox {
};
struct Skybox sSkyBoxInfo[2];
static uint8_t** gSkyboxTiles;
static s8 gLastSkybox;
static const char* gSkyboxTextures[] = {
gSkyboxWater, gSkyboxBitfs, gSkyboxWdw, gSkyboxCloudFloor, gSkyboxCcm,
@@ -246,7 +248,12 @@ void draw_skybox_tile_grid(Gfx **dlist, s8 background, s8 player, s8 colorIndex)
void* data = ResourceGetDataByName(gSkyboxTextures[background]);
uint8_t* texture = malloc(2048);
uint8_t* texture = gSkyboxTiles[tileIndex];
if(texture == NULL){
texture = malloc(2048);
gSkyboxTiles[tileIndex] = texture;
}
// Memcpy texture with calculated offset from x and y using the fact that every tile is 2048 bytes
memcpy(texture, CalculateDataOffset(data, x, y), 2048);
@@ -286,7 +293,7 @@ void *create_skybox_ortho_matrix(s8 player) {
* Creates the skybox's display list, then draws the 3x3 grid of tiles.
*/
Gfx *init_skybox_display_list(s8 player, s8 background, s8 colorIndex) {
s32 dlCommandCount = 5 + (3 * 3) * 7; // 5 for the start and end, plus 9 skybox tiles
s32 dlCommandCount = 10 + (3 * 3) * 7; // 5 for the start and end, plus 9 skybox tiles
void *skybox = alloc_display_list(dlCommandCount * sizeof(Gfx));
Gfx *dlist = skybox;
@@ -294,6 +301,15 @@ Gfx *init_skybox_display_list(s8 player, s8 background, s8 colorIndex) {
return NULL;
} else {
Mtx *ortho = create_skybox_ortho_matrix(player);
if(gSkyboxTiles == NULL){
gSkyboxTiles = malloc(80 * sizeof(uint8_t*));
gLastSkybox = background;
} else if(gLastSkybox != background ){
for(size_t i = 0; i < 80; i++){
gSPInvalidateTexCache(dlist++, (uintptr_t) gSkyboxTiles[i]);
}
gLastSkybox = background;
}
gSPDisplayList(dlist++, dl_skybox_begin);
gSPMatrix(dlist++, VIRTUAL_TO_PHYSICAL(ortho), G_MTX_PROJECTION | G_MTX_MUL | G_MTX_NOPUSH);
@@ -302,6 +318,7 @@ Gfx *init_skybox_display_list(s8 player, s8 background, s8 colorIndex) {
gSPDisplayList(dlist++, dl_skybox_end);
gSPEndDisplayList(dlist);
}
return skybox;
}
+59
View File
@@ -1,6 +1,11 @@
#include "Engine.h"
#include "ImguiUI.h"
#include "port/importer/AnimationFactory.h"
#include "port/importer/AudioBankFactory.h"
#include "port/importer/AudioSampleFactory.h"
#include "audio/internal.h"
#include "banks_table.h"
#include "sequences_table.h"
#include <iostream>
#include <Fast3D/gfx_pc.h>
@@ -15,6 +20,8 @@ GameEngine::GameEngine(){
this->context->GetWindow()->SetTargetFps(30);
this->context->GetWindow()->SetMaximumFrameLatency(1);
this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::Anim, "Animation", std::make_shared<CubeOS::AnimationFactory>());
this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::Bank, "Bank", std::make_shared<CubeOS::AudioBankFactory>());
this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::Audio, "Audio", std::make_shared<CubeOS::AudioSampleFactory>());
}
void GameEngine::Create(){
@@ -50,4 +57,56 @@ extern "C" uint32_t GameEngine_GetSampleRate() {
extern "C" float GameEngine_GetAspectRatio() {
return gfx_current_dimensions.aspect_ratio;
}
extern "C" CtlEntry* GameEngine_LoadBank(uint8_t bankId) {
auto engine = GameEngine::Instance;
if(bankId > (sizeof(gBankTable) / sizeof(gBankTable[0]))){
return nullptr;
}
if(engine->banks.contains(bankId)){
return engine->banks[bankId];
}
auto ctl = static_cast<CtlEntry *>(ResourceGetDataByName(gBankTable[bankId]));
engine->banks[bankId] = ctl;
return ctl;
}
extern "C" uint8_t GameEngine_IsBankLoaded(uint8_t bankId) {
auto engine = GameEngine::Instance;
GameEngine_LoadBank(bankId);
return engine->banks.contains(bankId);
}
extern "C" void GameEngine_UnloadBank(uint8_t bankId) {
auto engine = GameEngine::Instance;
if(engine->banks.contains(bankId)){
engine->banks.erase(bankId);
}
}
extern "C" AudioBankSample* GameEngine_LoadSequence(uint8_t seqId) {
auto engine = GameEngine::Instance;
if(seqId > (sizeof(gSequenceTable) / sizeof(gSequenceTable[0]))){
return nullptr;
}
if(engine->samples.contains(seqId)){
return engine->samples[seqId];
}
auto sample = static_cast<AudioBankSample *>(ResourceGetDataByName(gSequenceTable[seqId]));
engine->samples[seqId] = sample;
return sample;
}
extern "C" uint8_t GameEngine_IsSequenceLoaded(uint8_t seqId) {
auto engine = GameEngine::Instance;
GameEngine_LoadSequence(seqId);
return engine->samples.contains(seqId);
}
extern "C" void GameEngine_UnloadSequence(uint8_t seqId) {
auto engine = GameEngine::Instance;
if(engine->samples.contains(seqId)){
engine->samples.erase(seqId);
}
}

Some files were not shown because too many files have changed in this diff Show More