Make XA Audio play

This commit is contained in:
jaby 2022-08-09 15:37:28 +02:00
parent 2f498a0f40
commit 9728e56ba2
6 changed files with 146 additions and 3 deletions

3
.gitignore vendored
View File

@ -7,4 +7,5 @@
*.dep *.dep
*.o *.o
*.ii *.ii
*.s *.s
*.xa

View File

@ -14,7 +14,7 @@ rwildcard = $(wildcard $(addprefix $1/*.,$2)) $(foreach d,$(wildcard $1/*),$(cal
SRCS = $(call rwildcard, src, c cpp) SRCS = $(call rwildcard, src, c cpp)
SRCS += $(PCSX_REDUX)/common/crt0/crt0.s SRCS += $(PCSX_REDUX)/common/crt0/crt0.s
CPPFLAGS += -I$(PSYQ_PATH)/Include CPPFLAGS += -I$(PSYQ_PATH)/Include -D_WCHAR_T
LDFLAGS += -L$(PSYQ_PATH)/Lib LDFLAGS += -L$(PSYQ_PATH)/Lib
LDFLAGS += -Wl,--start-group LDFLAGS += -Wl,--start-group

View File

@ -15,6 +15,12 @@
<file name="SYSTEM.CNF" type="data" source="Library/Code/iso/JabyEngine.cnf"/> <file name="SYSTEM.CNF" type="data" source="Library/Code/iso/JabyEngine.cnf"/>
<file name="SCES_003.90" type="data" source="Library/Code/bin/PSX-release/JabyEngine.psexe"/> <file name="SCES_003.90" type="data" source="Library/Code/bin/PSX-release/JabyEngine.psexe"/>
<dir name="XA">
<file name="FOX.XA" type="xa" source="Ressource/fox.xa"/>
<file name="SHARK.XA" type="xa" source="Ressource/shark.xa"/>
<file name="FOXSHK.XA" type="xa" source="Ressource/fox_shark_sub.xa"/>
<file name="FXSHKT.XA" type="xa" source="Ressource/fox_shark_sub_vtx.xa"/>
</dir>
<!--<dummy sectors="1024"/>--> <!--<dummy sectors="1024"/>-->
</directory_tree> </directory_tree>
</track> </track>

View File

@ -0,0 +1,94 @@
#include "XAAudio.h"
#include <STDDEF.H>
#include <LIBSND.H>
namespace XAAudio
{
static constexpr int BigSectorSize = 2340;
static CdlCB oldCallback = nullptr;
static CdlLOC curLoc;
static int curChannel;
static u_char buffer[(sizeof(u_long)*8)];
static u_short getChannel(u_char *buffer)
{
const u_short currentChannel = *((unsigned short *)(buffer + 12) + 1);
return ((currentChannel&31744) >> 10);
}
static u_short getID(u_char *buffer)
{
return *(u_short*)(buffer + 12);
}
void cbready(int intr, u_char *result)
{
static const u_short VideoFrameID = 352;
if(intr == CdlDataReady)
{
CdGetSector((u_long*)buffer, 8);
const u_short ID = getID(buffer);
const u_short actChannel = getChannel(buffer);
if((ID == VideoFrameID) && (actChannel == curChannel))
{
CdControlF(CdlReadS, (u_char*)&curLoc);
}
}
}
void enable(bool doubleSpeed)
{
// setup the XA playback - adjust the speed as needed by your XA samples
u_char param[4];
param[0] = (((doubleSpeed) ? CdlModeSpeed : 0x0)|CdlModeRT|CdlModeSF|CdlModeSize1);
CdControlB(CdlSetmode, param, 0);
CdControlF(CdlPause, 0);
oldCallback = CdReadyCallback((CdlCB)cbready);
}
void disable()
{
// reset any callback that we replaced
CdControlF(CdlPause, 0);
CdReadyCallback(oldCallback);
// clear XA mode
u_char param = 0x0;
CdControlB(CdlSetmode, &param, 0);
}
void play(const CdlLOC &file, int channel)
{
CdlFILTER theFilter;
curLoc = file;
curChannel = channel;
// set the volume to max
SsSetSerialVol(SS_SERIAL_A, 127, 127);
// set up the XA filter
theFilter.file = 1;
theFilter.chan = channel;
CdControlF(CdlSetfilter, (u_char*)&theFilter);
// begin playing
CdControlF(CdlReadS, (u_char*)&file);
}
CdlLOC locate(const char* fileName)
{
CdlFILE file = {0};
CdSearchFile(&file, const_cast<char*>(fileName));
return file.pos;
}
}

View File

@ -0,0 +1,16 @@
#ifndef XAAUDIO_H
#define XAAUDIO_H
#include <STDDEF.H>
#include <LIBCD.H>
namespace XAAudio
{
void enable(bool doubleSpeed);
void disable();
void play(const CdlLOC &file, int channel);
CdlLOC locate(const char* fileName);
}
#endif // !XAAUDIO_H

View File

@ -1,9 +1,11 @@
#include "Audio/XAAudio.h"
#include "JabyEngine.h" #include "JabyEngine.h"
#include <types.h> #include <types.h>
#include <libcd.h> #include <libcd.h>
#include <libetc.h> #include <libetc.h>
#include <libgte.h> #include <libgte.h>
#include <libgpu.h> #include <libgpu.h>
#include <libsnd.h>
#include <stdio.h> #include <stdio.h>
static CdlLOC TOC[100] = {0}; static CdlLOC TOC[100] = {0};
@ -13,7 +15,10 @@ static void setup() {
//ResetGraph(0); //ResetGraph(0);
CdInit(); CdInit();
CdSetDebug(0); CdSetDebug(3);
SetVideoMode(MODE_PAL);
SsSetTickMode(SS_TICK50);
//SetDispMask(1); //SetDispMask(1);
} }
@ -37,13 +42,34 @@ static void play_track(int track, int track_count) {
CdControlB(CdlPlay, 0, 0); // play track CdControlB(CdlPlay, 0, 0); // play track
} }
static void play_xa_track(const char* name, int channel) {
CdlFILE file;
if(CdSearchFile(&file, const_cast<char*>(name)) == nullptr)
{
printf("Couldn't locate file %s on disk!\n", name);
return;
}
XAAudio::enable(true);
XAAudio::play(file.pos, 1);
}
int main() { int main() {
setup(); setup();
const int track_count = fill_toc(); const int track_count = fill_toc();
printf("Hello Planschi!\nI found %i tracks\n", track_count); printf("Hello Planschi!\nI found %i tracks\n", track_count);
#ifdef USE_CDDA
//Play CDDA
play_track(2, track_count); play_track(2, track_count);
#else
//Play CDXA
play_xa_track("\\XA\\FOXSHK.XA;1", 0);
#endif
while(true); while(true);
return 0; return 0;
} }