Make XA Audio play
This commit is contained in:
parent
ae201e1163
commit
6a48901e0b
|
@ -7,4 +7,5 @@
|
||||||
*.dep
|
*.dep
|
||||||
*.o
|
*.o
|
||||||
*.ii
|
*.ii
|
||||||
*.s
|
*.s
|
||||||
|
*.xa
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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, ¶m, 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
|
@ -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;
|
||||||
}
|
}
|
Loading…
Reference in New Issue