DOOM64-RE

DOOM 64 Reverse Engineering
Log | Files | Refs | README | LICENSE

seqload.c (11338B)


      1 
      2 #define _ALIGN4_ 1
      3 #define _ALIGN8_ 1
      4 
      5 /* WESS API INCLUDES */
      6 #include "wessapi.h"	// audio stuff...
      7 #include "seqload.h"
      8 #include "soundhw.h"
      9 #include "wessarc.h"
     10 #include "wessseq.h"
     11 
     12 #include "funqueue.h"
     13 
     14 #include "graph.h"//debug
     15 
     16 #ifndef NOUSEWESSCODE
     17 
     18 module_header	sfile_hdr;				//800b6a60
     19 master_status_structure *ref_pm_stat;	//800B6A80
     20 char *loaderfile;						//800B6A84
     21 int ref_max_seq_num;					//800B6A88
     22 int opencount;							//800B6A8C
     23 int(*Error_func)(int, int);				//800B6A90
     24 int Error_module;						//800B6A94
     25 Wess_File_IO_Struct *fp_seq_file;		//800B6A98
     26 int seq_loader_offset;					//800B6A9C
     27 int seq_loader_enable;					//800B6AA0
     28 
     29 
     30 static void err(int code) // 800396C0
     31 {
     32 	if (Error_func) {
     33 		Error_func(Error_module, code);
     34 	}
     35 }
     36 
     37 void wess_seq_loader_install_error_handler(int(*error_func)(int, int), int module) // 800396F8
     38 {
     39 	Error_func = error_func;
     40 	Error_module = module;
     41 }
     42 
     43 int wess_seq_loader_count(void) // 8003970C
     44 {
     45 	return ref_max_seq_num;
     46 }
     47 
     48 int Is_Seq_Seq_Num_Valid(int seqnum) // 8003971C()
     49 {
     50 	if (seqnum >= 0)
     51     {
     52         if(ref_max_seq_num <= seqnum)
     53             return 0;
     54 
     55         return 1;
     56     }
     57     return 0;
     58 }
     59 
     60 int open_sequence_data(void) // 80039748
     61 {
     62 	if (opencount == 0)
     63 	{
     64 		fp_seq_file = module_open(loaderfile);
     65 		if (!fp_seq_file)
     66 		{
     67 			err(SEQLOAD_FOPEN);
     68 			return 0;
     69 		}
     70 	}
     71 	opencount += 1;
     72 	return 1;
     73 }
     74 
     75 void close_sequence_data(void) // 800397B8
     76 {
     77 	if (opencount == 1)
     78 	{
     79 		module_close(fp_seq_file);
     80 	}
     81 	if (opencount > 0)
     82 	{
     83 		opencount -= 1;
     84 	}
     85 	return;
     86 }
     87 
     88 int load_sequence_data(int seqnum, void *memptr) // 8003980C
     89 {
     90 	sequence_data *psq_info;
     91 	track_data	  *ptrk_info;
     92 	int seqload;
     93 	int seqread;
     94 	int seqseek;
     95 	int seekpos;
     96 	int numtracks, tracknum, readbytes, decomp_type;
     97 	char *pmem;
     98 	char *dmem;//data memory
     99 
    100 	//char *dat;
    101 	//int j;
    102 
    103 	pmem = (char *)memptr;
    104 
    105 	if (seq_loader_enable)
    106 	{
    107 		if (!Is_Seq_Seq_Num_Valid(seqnum))
    108 			return 0;
    109 
    110 		//printf("\nseqnum %d\n", seqnum);
    111 
    112 		psq_info = (ref_pm_stat->pmod_info->pseq_info + seqnum); /* pointer math */
    113 
    114 		numtracks = psq_info->seq_hdr.tracks;
    115 		//PRINTF_D(WHITE,"numtracks %d\n", numtracks);
    116 
    117 		if (wess_driver_max_trks_per_seq < numtracks)
    118 			return 0;
    119 
    120 		psq_info->ptrk_info = (track_data *)pmem;
    121 		pmem += (numtracks * sizeof(track_data));
    122 
    123 #if _ALIGN8_ == 1
    124 		//force align to word boundary because previous size adjust
    125 		//may wind up with odd address
    126 		pmem += (unsigned int)pmem & 1;
    127 		pmem += (unsigned int)pmem & 2;
    128 		pmem += (unsigned int)pmem & 4;
    129 #endif
    130 		dmem = pmem;
    131 		pmem += (unsigned int)psq_info->seq_hdr.trkinfolength;
    132 
    133 		//printf("trkinfolength %d\n", psq_info->seq_hdr.trkinfolength);
    134 		//getch();
    135 
    136 		// Read data
    137 		seekpos = psq_info->seq_hdr.fileposition + seq_loader_offset;
    138 		decomp_type = psq_info->seq_hdr.decomp_type;
    139 		readbytes = psq_info->seq_hdr.trkinfolength;
    140 
    141 		//PRINTF_D(WHITE,"seekpos %d",seekpos);
    142 		//PRINTF_D(WHITE,"readbytes %d",readbytes);
    143 
    144 		if (decomp_type == 0)
    145 		{
    146 			seqload = open_sequence_data();
    147 			if (!seqload)
    148 			{
    149 				err(SEQLOAD_FOPEN);
    150 				return (0);
    151 			}
    152 
    153 			seqseek = module_seek(fp_seq_file, seekpos, 0);
    154 			if (seqseek)
    155 			{
    156 				err(SEQLOAD_FSEEK);
    157 				return (0);
    158 			}
    159 
    160 			seqread = module_read(dmem, readbytes, fp_seq_file);
    161 
    162 			if (seqread != readbytes)
    163 			{
    164 				err(SEQLOAD_FREAD);
    165 				return (0);
    166 			}
    167 
    168 			close_sequence_data();
    169 		}
    170 		else
    171 		{
    172 			if (wess_decomp(decomp_type, loaderfile, seekpos, dmem, readbytes) < 0)
    173 				return(0);
    174 		}
    175 
    176 		tracknum = 0;
    177 		if (numtracks > 0)
    178 		{
    179 			if (numtracks & 3)
    180 			{
    181 				//printf("numtracks & 3 %d\n", (numtracks & 3));
    182 				do
    183 				{
    184 					ptrk_info = (psq_info->ptrk_info + tracknum);
    185 
    186 					ptrk_info->trk_hdr = (track_header *)dmem;
    187 					dmem += sizeof(track_header);
    188 
    189 					//PRINTF_D2(WHITE,0,20,"labellist_count %d", ptrk_info->trk_hdr->labellist_count);
    190 					//PRINTF_D2(WHITE,0,21,"data_size %d", ptrk_info->trk_hdr->data_size);
    191 					//WAIT();
    192 
    193 					ptrk_info->plabellist = (unsigned long *)dmem;
    194 					dmem += (ptrk_info->trk_hdr->labellist_count * sizeof(long));
    195 
    196 					ptrk_info->ptrk_data = (char *)dmem;
    197 					dmem += (ptrk_info->trk_hdr->data_size);
    198 
    199 					tracknum++;
    200 				} while ((numtracks & 3) != tracknum);
    201 			}
    202 
    203 			if (tracknum != numtracks)
    204 			{
    205 				do
    206 				{
    207 					ptrk_info = (psq_info->ptrk_info + tracknum);
    208 
    209 					//------------
    210 					ptrk_info->trk_hdr = (track_header *)dmem;
    211 					dmem += sizeof(track_header);
    212 
    213 					//printf("[0] labellist_count %d\n", ptrk_info->trk_hdr->labellist_count);
    214 					//printf("[0] data_size %d\n", ptrk_info->trk_hdr->data_size);
    215 
    216 					ptrk_info->plabellist = (unsigned long *)dmem;
    217 					dmem += (ptrk_info->trk_hdr->labellist_count * sizeof(long));
    218 
    219 					ptrk_info->ptrk_data = (char *)dmem;
    220 					dmem += (ptrk_info->trk_hdr->data_size);
    221 
    222 					//------------
    223 					(ptrk_info + 1)->trk_hdr = (track_header *)dmem;
    224 					dmem += sizeof(track_header);
    225 
    226 					//printf("[1] labellist_count %d\n", (ptrk_info + 1)->trk_hdr->labellist_count);
    227 					//printf("[1] data_size %d\n", (ptrk_info + 1)->trk_hdr->data_size);
    228 
    229 					(ptrk_info + 1)->plabellist = (unsigned long *)dmem;
    230 					dmem += ((ptrk_info + 1)->trk_hdr->labellist_count * sizeof(long));
    231 
    232 					(ptrk_info + 1)->ptrk_data = (char *)dmem;
    233 					dmem += ((ptrk_info + 1)->trk_hdr->data_size);
    234 
    235 					//------------
    236 					(ptrk_info + 2)->trk_hdr = (track_header *)dmem;
    237 					dmem += sizeof(track_header);
    238 
    239 
    240 					//printf("[2] labellist_count %d\n", (ptrk_info + 2)->trk_hdr->labellist_count);
    241 					//printf("[2] data_size %d\n", (ptrk_info + 2)->trk_hdr->data_size);
    242 
    243 					(ptrk_info + 2)->plabellist = (unsigned long *)dmem;
    244 					dmem += ((ptrk_info + 2)->trk_hdr->labellist_count * sizeof(long));
    245 
    246 					(ptrk_info + 2)->ptrk_data = (char *)dmem;
    247 					dmem += ((ptrk_info + 2)->trk_hdr->data_size);
    248 
    249 					//------------
    250 					(ptrk_info + 3)->trk_hdr = (track_header *)dmem;
    251 					dmem += sizeof(track_header);
    252 
    253 					//printf("[3] labellist_count %d\n", (ptrk_info + 3)->trk_hdr->labellist_count);
    254 					//printf("[3] data_size %d\n", (ptrk_info + 3)->trk_hdr->data_size);
    255 
    256 					(ptrk_info + 3)->plabellist = (unsigned long *)dmem;
    257 					dmem += ((ptrk_info + 3)->trk_hdr->labellist_count * sizeof(long));
    258 
    259 					(ptrk_info + 3)->ptrk_data = (char *)dmem;
    260 					dmem += ((ptrk_info + 3)->trk_hdr->data_size);
    261 
    262 					tracknum += 4;
    263 				} while (tracknum != numtracks);
    264 			}
    265 		}
    266 	}
    267 
    268 	return (int)((char *)pmem - (char *)memptr);//(int)(void *)((int)pmem - (int)memptr);
    269 }
    270 
    271 int wess_seq_loader_sizeof(void *input_pm_stat, char *seqfile) // 80039C20
    272 {
    273 	int size, seqload, seqseek, seqread, readbytes;
    274 
    275 	loaderfile = seqfile;
    276 	ref_pm_stat = (master_status_structure *)input_pm_stat;
    277 
    278 	size = 0;
    279 	if (ref_pm_stat != NULL)
    280 	{
    281 		seqload = open_sequence_data();
    282 		if (!seqload)
    283 		{
    284 			err(SEQLOAD_FOPEN);
    285 			return (0);
    286 		}
    287 
    288 		//printf("seqload %d\n",seqload);
    289 		//printf("opencount %d\n",opencount);
    290 
    291 		seqseek = module_seek(fp_seq_file, 0, 0);
    292 		if (seqseek)
    293 		{
    294 			err(SEQLOAD_FSEEK);
    295 			return (0);
    296 		}
    297 
    298 		readbytes = sizeof(module_header);
    299 		seqread = module_read(&sfile_hdr, sizeof(module_header), fp_seq_file);
    300 		if (seqread != readbytes)
    301 		{
    302 			err(SEQLOAD_FREAD);
    303 			return (0);
    304 		}
    305 
    306 		close_sequence_data();
    307 
    308 		//printf("module_id_text %x\n",sfile_hdr.module_id_text);
    309 		//printf("module_version %d\n",sfile_hdr.module_version);
    310 		//printf("sequences %d\n",sfile_hdr.sequences);
    311 		//printf("compress_size %d\n",sfile_hdr.compress_size);
    312 		//printf("data_size %d\n",sfile_hdr.data_size);
    313 
    314 		size = sfile_hdr.data_size;
    315 	}
    316 
    317 	return size;
    318 }
    319 
    320 int wess_seq_loader_init(void *input_pm_stat, char *seqfile, enum OpenSeqHandleFlag flag, char *memory_pointer, int memory_allowance) // 80039CE4
    321 {
    322 	int seqload;
    323 	int seqread;
    324 	int seqseek;
    325 	int readbytes;
    326 	int size;
    327 	int decomp_type;
    328 
    329 	seq_loader_enable = 0;
    330 
    331 	loaderfile = seqfile;
    332 	ref_pm_stat = (master_status_structure *)input_pm_stat;
    333 
    334 	size = 0;
    335 	if (ref_pm_stat != NULL)
    336 	{
    337 		seqload = open_sequence_data();
    338 		if (!seqload)
    339 		{
    340 			err(SEQLOAD_FOPEN);
    341 			return (0);
    342 		}
    343 
    344 		seqseek = module_seek(fp_seq_file, 0, 0);
    345 		if (seqseek)
    346 		{
    347 			err(SEQLOAD_FSEEK);
    348 			return (0);
    349 		}
    350 
    351 		readbytes = sizeof(module_header);
    352 		seqread = module_read(&sfile_hdr, sizeof(module_header), fp_seq_file);
    353 		if (seqread != readbytes)
    354 		{
    355 			err(SEQLOAD_FREAD);
    356 			return (0);
    357 		}
    358 
    359 		//PRINTF_D(WHITE,"WSD::module_id_text %x",sfile_hdr.module_id_text);
    360 		//PRINTF_D(WHITE,"WSD::module_version %d",sfile_hdr.module_version);
    361 		//PRINTF_D(WHITE,"WSD::decomp_type %d",sfile_hdr.decomp_type);
    362 		//PRINTF_D(WHITE,"WSD::sequences %d",sfile_hdr.sequences);
    363 		//PRINTF_D(WHITE,"WSD::compress_size %d",sfile_hdr.compress_size);
    364 		//PRINTF_D(WHITE,"WSD::data_size %d",sfile_hdr.data_size);
    365 
    366 		ref_max_seq_num = sfile_hdr.sequences;
    367 		ref_pm_stat->pmod_info->pseq_info = (sequence_data *)memory_pointer;
    368 
    369 		readbytes = sfile_hdr.data_size;
    370 		decomp_type = sfile_hdr.decomp_type;
    371 
    372 		if (!decomp_type)
    373 		{
    374 			//PRINTF_D(WHITE,"WSD::readbytes %d",readbytes);
    375 
    376 			seqread = module_read(ref_pm_stat->pmod_info->pseq_info, readbytes, fp_seq_file);
    377 
    378 			if (seqread != readbytes)
    379 			{
    380 				err(SEQLOAD_FREAD);
    381 				return (0);
    382 			}
    383 			seq_loader_offset = sfile_hdr.data_size + sizeof(module_header);
    384 		}
    385 		else
    386 		{
    387 			if (wess_decomp(decomp_type, loaderfile, sizeof(module_header), (char*)ref_pm_stat->pmod_info->pseq_info, readbytes) < 0)
    388 				return(0);
    389 
    390 			seq_loader_offset = sfile_hdr.compress_size + sizeof(module_header);
    391 		}
    392 
    393 		if (flag != YesOpenSeqHandle)
    394 		{
    395 			//PRINTF_D(WHITE,"WSD::close_sequence_data");
    396 			close_sequence_data();
    397 		}
    398 
    399 		seq_loader_enable = 1;
    400 
    401 		size = readbytes;
    402 	}
    403 
    404 	//PRINTF_D(WHITE,"WSD::seq_loader_offset %d",seq_loader_offset);
    405 	//PRINTF_D(WHITE,"WSD::size %d",size);
    406 
    407 	return size;
    408 }
    409 
    410 void wess_seq_loader_exit(void) // 80039EA4
    411 {
    412 	seq_loader_enable = 0;
    413 	close_sequence_data();
    414 }
    415 
    416 int wess_seq_sizeof(int seqnum) // 80039EC8
    417 {
    418 	sequence_data *psq_info;
    419 	int seq_sizeof, numtracks;
    420 
    421 	if (seq_loader_enable)
    422 	{
    423 		if (!Is_Seq_Seq_Num_Valid(seqnum))
    424 			return 0;
    425 
    426 		psq_info = ref_pm_stat->pmod_info->pseq_info+seqnum; /* pointer math */
    427 
    428 		//printf("\nseq_hdr.tracks %d\n",psq_info->seq_hdr.tracks);
    429 		//printf("seq_hdr.decomp_type %d\n",psq_info->seq_hdr.decomp_type);
    430 		//printf("seq_hdr.trkinfolength %d\n",psq_info->seq_hdr.trkinfolength);
    431 		//printf("seq_hdr.fileposition %d\n",psq_info->seq_hdr.fileposition);
    432 
    433 		numtracks = psq_info->seq_hdr.tracks;
    434 		if (wess_driver_max_trks_per_seq < numtracks)
    435 			return 0;
    436 
    437 		if (psq_info->ptrk_info)
    438 			return 0;
    439 
    440 		numtracks *= sizeof(sequence_data);
    441 
    442 #if _ALIGN8_ == 1
    443 		numtracks += (unsigned int)numtracks & 1;
    444 		numtracks += (unsigned int)numtracks & 2;
    445 		numtracks += (unsigned int)numtracks & 4;
    446 #endif
    447 
    448 		return (int)(psq_info->seq_hdr.trkinfolength + numtracks);
    449 	}
    450 	return 0;
    451 }
    452 
    453 int wess_seq_load(int seqnum, void *memptr) // 80039F84
    454 {
    455 	if (seq_loader_enable)
    456 	{
    457 		if (!Is_Seq_Seq_Num_Valid(seqnum))
    458 			return 0;
    459 
    460 		if (!(ref_pm_stat->pmod_info->pseq_info + seqnum)->ptrk_info)
    461 		{
    462 			//PRINTF_D(WHITE,"wess_seq_load %d", seqnum);
    463 			return load_sequence_data(seqnum, memptr);
    464 		}
    465 	}
    466 
    467 	return 0;
    468 }
    469 
    470 int wess_seq_free(int seqnum) // 8003A010
    471 {
    472 	sequence_data *psq_info;
    473 
    474 	if (seq_loader_enable)
    475 	{
    476 		if (!Is_Seq_Seq_Num_Valid(seqnum))
    477 			return 0;
    478 
    479 		psq_info = ref_pm_stat->pmod_info->pseq_info + seqnum; /* pointer math */
    480 
    481 		if (psq_info->ptrk_info)
    482 		{
    483 			psq_info->ptrk_info = 0;
    484 			return 1;
    485 		}
    486 	}
    487 	return 0;
    488 }
    489 
    490 #endif