Fix XA playback delay

This commit is contained in:
ABelliqueux 2021-08-16 16:20:36 +02:00
parent d662d0b465
commit da2eac1d48
10 changed files with 29 additions and 56 deletions

View File

@ -16,6 +16,8 @@ struct NODE;
struct LEVEL;
struct VAGsound;
struct VAGbank;
struct XAbank;
struct XAsound;
typedef struct BODY {
VECTOR gForce;
@ -141,7 +143,7 @@ typedef struct XAsound {
} XAsound;
typedef struct XAbank {
char * name;
char name[16];
u_int index;
int offset;
XAsound samples[];

View File

@ -33,7 +33,7 @@
#define FNT_VRAM_X 960
#define FNT_VRAM_Y 256
#define FNT_SCR_X 16
#define FNT_SCR_Y 32
#define FNT_SCR_Y 168
#define FNT_SCR_W 240
#define FNT_SCR_H 48
#define FNT_SCR_BG 0

View File

@ -56,4 +56,5 @@ u_long setSPUtransfer(SpuVoiceAttr * voiceAttributes, VAGsound * sound);
void playSFX(SpuVoiceAttr * voiceAttributes, VAGsound * sound);
// XA playback
void XAsetup(void);
void getXAoffset(LEVEL * level);
void setXAsample(XAsound * sound, CdlFILTER * filter);

View File

@ -1021,11 +1021,9 @@ XAbank XABank0 = {
{
//channel 0
{ 0, 698464, 1, 0, 0, ((698464/2336)-1) * XA_CHANNELS, -1 },
{ 1, 366752, 1, 1 , 0, ((366752/2336)-1) * XA_CHANNELS, -1 },
{ 1, 366752, 1, 1 , 0, ((366752/2336)-1) * XA_CHANNELS, -1 }
}
};
// XA file to load
//~ static char * loadXA0 = "\\INTER8.XA;1";
LEVEL level0 = {
&level0_BGc,

View File

@ -39,4 +39,3 @@ extern NODE * level0_curNode;
extern NODE level0_nodePlane;
extern VAGbank VAGBank0;
extern XAbank XABank0;
//~ extern char * loadXA0;

View File

@ -11073,8 +11073,6 @@ XAbank XABank1 = {
{ 1, 366752, 1, 1 , 0, ((366752/2336)-1) * XA_CHANNELS, -1 },
}
};
// XA file to load
//~ static char * loadXA1 = "\\INTER8.XA;1";
LEVEL level1 = {
&level1_BGc,

View File

@ -178,4 +178,3 @@ extern NODE level1_nodegnd_002;
extern NODE level1_nodegnd;
extern VAGbank VAGBank1;
extern XAbank XABank1;
//~ extern char * loadXA1;

View File

@ -112,44 +112,7 @@ int atime = 0;
char spu_malloc_rec[SPU_MALLOC_RECSIZ * (2 + MALLOC_MAX + 1)];
// SPU settings
SpuCommonAttr spuSettings; // structure for changing common voice attributes
SpuVoiceAttr voiceAttributes ; // structure for changing individual voice attributes
// extern VAG files
//~ extern u_char _binary_VAG_0_come_vag_start;
//~ extern u_char _binary_VAG_1_cuek_vag_start;
//~ extern u_char _binary_VAG_2_erro_vag_start;
//~ extern u_char _binary_VAG_3_hehe_vag_start;
//~ extern u_char _binary_VAG_4_m4a1_vag_start;
//~ extern u_char _binary_VAG_5_punc_vag_start;
//~ extern u_char _binary_VAG_7_wron_vag_start;
//~ extern u_char _binary_VAG_8_yooo_vag_start;
// soundBank
//~ VAGbank VAGBank = {
//~ 8,
//~ {
//~ { &_binary_VAG_0_come_vag_start, SPU_00CH, 0 },
//~ { &_binary_VAG_1_cuek_vag_start, SPU_01CH, 0 },
//~ { &_binary_VAG_2_erro_vag_start, SPU_02CH, 0 },
//~ { &_binary_VAG_3_hehe_vag_start, SPU_03CH, 0 },
//~ { &_binary_VAG_4_m4a1_vag_start, SPU_04CH, 0 },
//~ { &_binary_VAG_5_punc_vag_start, SPU_05CH, 0 },
//~ { &_binary_VAG_7_wron_vag_start, SPU_06CH, 0 },
//~ { &_binary_VAG_8_yooo_vag_start, SPU_07CH, 0 }
//~ }
//~ };
// XA playback
//~ XAbank XABank = {
//~ 8,
//~ 0,
//~ {
//~ //channel 0
//~ { 0, 698464, 1, 0, 0, ((698464/2336)-1) * XA_CHANNELS, -1 },
//~ { 1, 366752, 1, 1 , 0, ((366752/2336)-1) * XA_CHANNELS, -1 },
//~ }
//~ };
//~ // XA file to load
//~ static char * loadXA = "\\INTER8.XA;1";
// File informations : pos, size, name
CdlFILE XAPos = {0};
SpuVoiceAttr voiceAttributes ; // structure for changing individual voice attributes
// CD filter
CdlFILTER filter;
// File position in m/s/f
@ -178,10 +141,6 @@ int main() {
CdInit();
// Load level
LoadLevelCD(overlayFile, &load_all_overlays_here);
// Load XA file
CdSearchFile( &XAPos, curLvl.XA->name);
// Set cd head to start of file
curLvl.XA->offset = CdPosToInt(&XAPos.pos);
#endif
// TODO : Add switch case to get the correct pointers
// Get needed pointers from level file
@ -190,6 +149,13 @@ int main() {
} else if ( level == 1) {
LvlPtrSet( &curLvl, &level1);
}
#ifdef USECD
getXAoffset(&curLvl);
//~ // Load XA file
//~ CdSearchFile(&XAPos, curLvl.XA->name);
//~ // Set cd head to start of file
//~ curLvl.XA->offset = CdPosToInt(&XAPos.pos);
#endif
levelWas = level;
// Copy light matrices / vector to scratchpad
setDCLightEnv(curLvl.cmat, curLvl.lgtmat, &lgtang);
@ -256,7 +222,7 @@ int main() {
// if sample's cursor is 0
if (curLvl.XA->samples[sample].cursor == 0){
// Convert sector number to CD position in min/second/frame and set CdlLOC accordingly.
CdIntToPos( curLvl.XA->samples[sample].start + curLvl.XA->offset , &loc);
CdIntToPos(curLvl.XA->samples[sample].start + curLvl.XA->offset , &loc);
// Send CDROM read command
CdControlF(CdlReadS, (u_char *)&loc);
XATime = VSync(-1);
@ -457,7 +423,7 @@ int main() {
AddPrims(otdisc[db], ot[db] + OTLEN - 1, ot[db]);
FntPrint("\n#Tri : %d\n", triCount);
FntPrint("#RCnt : %d %d %d\n", VSync(-1), XA_CDSPEED, dt);
FntPrint("#RCnt : %d %d %d\n", VSync(-1), dt);
FntPrint("CamAngle : %d\n", curCamAngle);
FntFlush(-1);
display( &disp[db], &draw[db], otdisc[db], primbuff[db], &nextpri, &db);

View File

@ -1,4 +1,5 @@
#include "../include/psx.h"
#include "../include/sound.h"
void setDCLightEnv(MATRIX * curLevelCMat, MATRIX * curLevelLgtMat, SVECTOR * curLevelLgtAng){
@ -103,8 +104,8 @@ void LvlPtrSet(LEVEL * curLevel, LEVEL * level){
curLevel->camPath = level->camPath;
curLevel->camAngles = level->camAngles;
curLevel->curNode = level->curNode; // Blank
curLevel->VAG = level->VAG; // Blank
curLevel->XA = level->XA; // Blank
curLevel->VAG = level->VAG;
curLevel->XA = level->XA;
//~ curLevel->actorPtr->body = level->actorPtr->body;
// Move these to drawPoly()
@ -121,6 +122,8 @@ int LoadLevelCD(const char*const LevelName, u_long * LoadAddress){
void SwitchLevel( LEVEL * curLevel, LEVEL * loadLevel ){
//~ ScrRst();
LvlPtrSet( curLevel, loadLevel);
// XA
getXAoffset(curLevel);
// Reload textures
for (int k = 0; k < *curLevel->meshes_length ; k++){
// Check data exists
@ -148,6 +151,7 @@ void SwitchLevel( LEVEL * curLevel, LEVEL * loadLevel ){
applyVector( &curLevel->propPtr->body->position, 0, 100, 0, -=);
applyVector( &curLevel->propPtr->body->velocity, 0, 0, 0, =);
applyVector( &curLevel->propPtr->body->gForce, 0, 0, 0, =);
};
void LoadTexture(u_long * tim, TIM_IMAGE * tparam){ // This part is from Lameguy64's tutorial series : lameguy64.net/svn/pstutorials/chapter1/3-textures.html login/pw: annoyingmous
OpenTIM(tim); // Open the tim binary data, feed it the address of the data in memory

View File

@ -73,7 +73,6 @@ u_long setSPUtransfer(SpuVoiceAttr * voiceAttributes, VAGsound * sound){
//~ return 1;
//~ }
//~ return transferred;
FntPrint("Tr: %", transferred);
return spu_address;
}
void playSFX(SpuVoiceAttr * voiceAttributes, VAGsound * sound){
@ -99,6 +98,13 @@ void XAsetup(void){
// Pause at current pos
CdControlF(CdlPause,0);
}
void getXAoffset(LEVEL * level){
CdlFILE XAPos = {0};
// Load XA file
CdSearchFile(&XAPos, level->XA->name);
// Set cd head to start of file
level->XA->offset = CdPosToInt(&XAPos.pos);
};
void setXAsample(XAsound * sound, CdlFILTER * filter){
filter->chan = sound->channel;
filter->file = sound->file;