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