diff options
-rw-r--r-- | FAQ-psx.txt | 3 | ||||
-rwxr-xr-x | Makefile | 2 | ||||
-rwxr-xr-x | Xenogears/Makefile | 2 | ||||
-rw-r--r-- | psxdev/vlc.c | 2 | ||||
-rw-r--r-- | psxdev/xadecode.h | 8 | ||||
-rw-r--r-- | str-util.cpp | 79 |
6 files changed, 71 insertions, 25 deletions
diff --git a/FAQ-psx.txt b/FAQ-psx.txt index 6bb7fe8..6ec6061 100644 --- a/FAQ-psx.txt +++ b/FAQ-psx.txt @@ -1,3 +1,6 @@ + + + Q: What is the asm used in the PSX? A: The PSX is equipped with a MIPS r3000. This processor is little endian, so don't you worry if you know SNES or PC hacking. @@ -27,7 +27,7 @@ dte-tool: dteutils.o generic.h generic.o fileutils.o fileutils.h dtemain.o Makef ${CXX} ${LDFLAGS} dteutils.o generic.o fileutils.o dtemain.o -o dte-tool str-tool: str-util.o generic.h generic.o fileutils.o fileutils.h cdutils.o cdutils.h yazedc.o yazedc.h Makefile - ${CXX} ${LDFLAGS} str-util.o generic.o fileutils.o cdutils.o yazedc.o psxdev/bs.o psxdev/idctfst.o psxdev/jfdctint.o psxdev/vlc.o -o str-tool -lSDL + ${CXX} ${LDFLAGS} str-util.o generic.o fileutils.o cdutils.o yazedc.o psxdev/bs.o psxdev/idctfst.o psxdev/jfdctint.o psxdev/vlc.o psxdev/xadecode.o -o str-tool -lSDL clean: for d in ${SUBDIRS} ; do make -C $$d clean || exit -1 ; done diff --git a/Xenogears/Makefile b/Xenogears/Makefile index 9b8d9db..e5b3945 100755 --- a/Xenogears/Makefile +++ b/Xenogears/Makefile @@ -1,6 +1,6 @@ #!/usr/bin/make -f -CPPFLAGS=-Wall -g -O3 -mcpu=i686 -pedantic -pedantic-errors -Werror -I.. +CPPFLAGS=-Wall -g -O3 -mcpu=i686 -pedantic -pedantic-errors -I.. CXX=g++ TARGET = reinsert main_dump Decrypt script-comp script-dec XenoCD1.sqr XenoCD2.sqr diff --git a/psxdev/vlc.c b/psxdev/vlc.c index 196fa96..4ff3d06 100644 --- a/psxdev/vlc.c +++ b/psxdev/vlc.c @@ -428,7 +428,7 @@ static void yuv2rgb15(BLOCK *blk,Uint16 *image) } } -enum {B,G,R}; +enum {R, G, B}; static void yuv2rgb24(BLOCK *blk,Uint8 image[][3]) { diff --git a/psxdev/xadecode.h b/psxdev/xadecode.h index 025d36a..b886285 100644 --- a/psxdev/xadecode.h +++ b/psxdev/xadecode.h @@ -61,6 +61,10 @@ typedef unsigned short WORD; typedef long FXD; #endif +#ifdef __cplusplus +extern "C" { +#endif + long decodeSoundSect(SoundSector *ssct, char *wav); long decodeSoundSect1(SoundSector *ssct, char *wav); long convXaToWave(char *adp, char *wav, int cn, int fn_s, int fn_e); @@ -81,4 +85,8 @@ char xahalfhz(SoundSector *ss); FXD FXD_FixMul(FXD a, FXD b); #endif +#ifdef __cplusplus +} +#endif + #endif diff --git a/str-util.cpp b/str-util.cpp index 7c76917..b1a2f2d 100644 --- a/str-util.cpp +++ b/str-util.cpp @@ -42,14 +42,27 @@ struct STR_Header { Uint16 Channels; } PACKED; -Byte * video = 0, * audio = 0; +Byte * video = 0, * audio = 0, * audio2 = 0; int width, height; SDL_Surface * screen = 0; Uint8 bpp; -extern void mixaudio(void *unused, Uint8 *stream, int len); +int32 audio_len = 0, audio_len2 = 0; +Uint8 *audio_pos; + +void mixaudio(void *unused, Uint8 *stream, int len) { + /* Only play if we have data left */ + if ( audio_len == 0 ) + return; + + /* Mix as much data as possible */ + len = ( len > audio_len ? audio_len : len ); + SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME); + audio_pos += len; + audio_len -= len; +} void process_one_sector(FILE * f) { Byte sector[2336]; @@ -57,14 +70,14 @@ void process_one_sector(FILE * f) { fread(sector, 2336, 1, f); h = (STR_Header *) ((Byte *) sector + 8); - +/* printm(M_BARE, "SubHeader FN : %x\n", sector[0]); printm(M_BARE, "SubHeader CN : %x\n", sector[1]); printm(M_BARE, "SubHeader SM : %x\n", sector[2]); printm(M_BARE, "SubHeader CI : %x\n", sector[3]); - +*/ if ((sector[2] == 0x48) || (sector[2] == 0x42)) { - printm(M_BARE, "Video sector\n"); +/* printm(M_BARE, "Video sector\n"); printm(M_BARE, "Status : %04x\n", h->StSTATUS); printm(M_BARE, "Type : %04x\n", h->StTYPE); printm(M_BARE, "Sector Offset: %i\n", h->StSECTOR_OFFSET); @@ -75,7 +88,7 @@ void process_one_sector(FILE * f) { printm(M_BARE, "Movie Height : %i\n", h->StMOVIE_HEIGHT); printm(M_BARE, "Movie HeadM : %08x\n", h->StMOVIE_HEADM); printm(M_BARE, "Movie HeadV : %08x\n", h->StMOVIE_HEADV); - printm(M_BARE, "Channels : %04x\n", h->Channels); + printm(M_BARE, "Channels : %04x\n", h->Channels); */ if (h->StSECTOR_OFFSET == 0) { video = (Byte *) malloc(h->StSECTOR_SIZE * 2016); if (!screen) { @@ -95,14 +108,14 @@ void process_one_sector(FILE * f) { if (h->StSECTOR_SIZE == (h->StSECTOR_OFFSET + 1)) { // Frame finished. - printm(M_BARE, "End of Frame.\n"); +// printm(M_BARE, "End of Frame.\n"); Uint8 * buffer = ((Uint8 *) screen->pixels); if (SDL_MUSTLOCK(screen)) if (SDL_LockSurface(screen) < 0) exit(1); - printm(M_BARE, "Width: %i, Height: %i - bpp: %i\n", width, height, bpp); +// printm(M_BARE, "Width: %i, Height: %i - bpp: %i\n", width, height, bpp); bs_decode_rgb24(buffer, (bs_header_t *) video, width, height, 0); // fwrite(screen->pixels, 3, width * height, stdout); @@ -114,37 +127,59 @@ void process_one_sector(FILE * f) { free(video); } } else if (sector[2] == 0x64) { - SoundSector * buffer = (SoundSector *) sector); - printm(M_BARE, "Audio sector\n"); + int locked = 0; + + SoundSector * buffer = (SoundSector *) sector; +/* printm(M_BARE, "Audio sector\n"); printm(M_BARE, "Frequency: %i\n", xahalfhz(buffer) ? 18900 : 37800); - printm(M_BARE, "Channels : %s\n", xastereo(buffer) ? "stereo" : "mono"); + printm(M_BARE, "Channels : %s\n", xastereo(buffer) ? "stereo" : "mono"); */ // fwrite(sector + 8, 1, 2324, stdout); - if (!audio) { + + while (audio_len > 0) { + SDL_Delay(1); + } + + if (!audio2) { SDL_AudioSpec fmt; /* Un son sereo de 16 bits à 44kHz */ - fmt.freq = xahalfhz(&buffer)?"18900":"37800"; + fmt.freq = xahalfhz(buffer) ? 18900 : 37800; fmt.format = AUDIO_S16; - fmt.channels = 2; - fmt.samples = 512; /*Une bonne valeur pour les jeux */ + fmt.channels = xastereo(buffer) ? 2 : 1; + fmt.samples = 128; /*Une bonne valeur pour les jeux */ fmt.callback = mixaudio; fmt.userdata = NULL; /* Ouvre le contexte audio et joue le son */ - if ( SDL_OpenAudio(&fmt, NULL) < 0 ) { - fprintf(stderr, "Impossible d'acce'der a` l'audio: %s\n", SDL_GetError()); + if (SDL_OpenAudio(&fmt, NULL) < 0) { + fprintf(stderr, "Impossible d'accéder à l'audio: %s\n", SDL_GetError()); exit(1); } - SDL_PauseAudio(0); + initXaDecode(); } else { - free(audio); + if (audio) { + SDL_LockAudio(); + free(audio); + locked = 1; + } + audio_pos = audio = audio2; + audio_len = audio_len2; } - audio = (Byte *) malloc(2336); + + audio2 = (Byte *) malloc(8192); + switchXaDecode(xachannel(buffer)); + audio_len2 = convXaToWave((char *) buffer, (char *) audio2, xachannel(buffer), 0, 255); + if (locked) + SDL_UnlockAudio(); + else if (audio) + SDL_PauseAudio(0); + saveXaDecode(xachannel(buffer)); + } else { - printm(M_BARE, "Unknow sector\n"); +// printm(M_BARE, "Unknow sector\n"); } - printm(M_BARE, "---------------------------------\n\n"); +// printm(M_BARE, "---------------------------------\n\n"); } int main(int argc, char ** argv) { |