diff options
Diffstat (limited to 'str-util.cpp')
| -rw-r--r-- | str-util.cpp | 79 | 
1 files changed, 57 insertions, 22 deletions
| 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) { | 
