MaiAT3PlusCoreDecoder::MaiAT3PlusCoreDecoder() { MaiAT3PlusCoreDecoderJointChnInfo *joint_chn_info = (MaiAT3PlusCoreDecoderJointChnInfo*)heap0.alloc(sizeof(MaiAT3PlusCoreDecoderJointChnInfo)); Mai_memset(joint_chn_info, 0, sizeof(MaiAT3PlusCoreDecoderJointChnInfo)); MaiAT3PlusCoreDecoderChnACCTableInner *inner0 = (MaiAT3PlusCoreDecoderChnACCTableInner*)heap0.alloc(sizeof(MaiAT3PlusCoreDecoderChnACCTableInner)); Mai_memset(inner0, 0, sizeof(MaiAT3PlusCoreDecoderChnACCTableInner)); MaiAT3PlusCoreDecoderChnACCTableInner *inner1 = (MaiAT3PlusCoreDecoderChnACCTableInner*)heap0.alloc(sizeof(MaiAT3PlusCoreDecoderChnACCTableInner)); Mai_memset(inner1, 0, sizeof(MaiAT3PlusCoreDecoderChnACCTableInner)); for (Mai_I32 a0 = 0; a0 < 2; a0++) { chn_info[a0] = (MaiAT3PlusCoreDecoderChnInfo*)heap0.alloc(sizeof(MaiAT3PlusCoreDecoderChnInfo)); Mai_memset(chn_info[a0], 0, sizeof(MaiAT3PlusCoreDecoderChnInfo)); chn_info[a0]->chn_flag = a0; chn_info[a0]->joint_chn_info = joint_chn_info; chn_info[a0]->acc_data_old = (MaiAT3PlusCoreDecoderChnACCData*)heap0.alloc(sizeof(MaiAT3PlusCoreDecoderChnACCData)); Mai_memset(chn_info[a0]->acc_data_old, 0, sizeof(MaiAT3PlusCoreDecoderChnACCData)); chn_info[a0]->acc_data_now = (MaiAT3PlusCoreDecoderChnACCData*)heap0.alloc(sizeof(MaiAT3PlusCoreDecoderChnACCData)); Mai_memset(chn_info[a0]->acc_data_now, 0, sizeof(MaiAT3PlusCoreDecoderChnACCData)); chn_info[a0]->acc_table_old = (MaiAT3PlusCoreDecoderChnACCTable*)heap0.alloc(sizeof(MaiAT3PlusCoreDecoderChnACCTable)); Mai_memset(chn_info[a0]->acc_table_old, 0, sizeof(MaiAT3PlusCoreDecoderChnACCTable)); chn_info[a0]->acc_table_old->inner = inner0; chn_info[a0]->acc_table_now = (MaiAT3PlusCoreDecoderChnACCTable*)heap0.alloc(sizeof(MaiAT3PlusCoreDecoderChnACCTable)); Mai_memset(chn_info[a0]->acc_table_now, 0, sizeof(MaiAT3PlusCoreDecoderChnACCTable)); chn_info[a0]->acc_table_now->inner = inner1; chn_info[a0]->chn_ref = chn_info[0]; } c900 = 3; for (Mai_I32 a0 = 0; a0 < 2; a0++) { for (Mai_I32 a1 = 0; a1 < 0x1000; a1++) { syn_buf[a0][a1] = 0.0f; } } for (Mai_I32 a0 = 0; a0 < 2; a0++) { for (Mai_I32 a1 = 0; a1 < 0x800; a1++) { kyou_buf[a0][a1] = 0.0f; } } }
MaiWaveOutWO::MaiWaveOutWO(Mai_U32 num_chn, Mai_U32 sam_rate, Mai_U32 bits_per_sam) { is_stop = 0; //create sbuf sbuf_num = 0x80; sbuf_size = 0x2000; sbuf = heap0.alloc(sbuf_num * sbuf_size); sbuf_counter = 0; ppWaveHeader = (WAVEHDR *)heap0.alloc(sbuf_num * sizeof(WAVEHDR)); WAVEFORMATEX wfx; Mai_memset(&wfx, 0, sizeof(wfx)); wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = num_chn; wfx.nSamplesPerSec = sam_rate; wfx.wBitsPerSample = bits_per_sam; wfx.cbSize = 0; wfx.nBlockAlign = wfx.wBitsPerSample * wfx.nChannels / 8; wfx.nAvgBytesPerSec = wfx.nChannels * wfx.nSamplesPerSec * wfx.wBitsPerSample / 8; ::waveOutOpen(&p0, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL); for (Mai_U32 a0 = 0; a0 < sbuf_num; a0++) { memset(&ppWaveHeader[a0], 0, sizeof(WAVEHDR)); ppWaveHeader[a0].dwLoops = 1; ppWaveHeader[a0].dwBufferLength = sbuf_size; ppWaveHeader[a0].lpData = (LPSTR)(sbuf + sbuf_size * a0); ppWaveHeader[a0].dwFlags = WHDR_DONE; } }
Mai_Status MaiAT3PlusCoreDecoder::decodeACC2Main(MaiBitReader *mbr0, MaiAT3PlusCoreDecoderChnInfo **chn_infos, Mai_U32 chns) { Mai_Status rs = 0; for (Mai_U32 a0 = 0; a0 < chns; a0++) { Mai_memset(chn_infos[a0]->acc_data_now->table, 0, sizeof(chn_infos[a0]->acc_data_now->table) ); Mai_U32 uk1b444 = mbr0->getWithI32Buffer(1); if (uk1b444) { chn_infos[a0]->uk1b450 = mbr0->getWithI32Buffer(4) + 1; Mai_U32 uk1b448 = mbr0->getWithI32Buffer(1); Mai_U32 uk1b44c = chn_infos[a0]->uk1b450; if (uk1b448) uk1b44c = mbr0->getWithI32Buffer(4) + 1; //call 478200 if (rs = MAPCDSF_decodeACC2MainSub0(mbr0, chn_infos[a0])) break; //call 478270 if (rs = MAPCDSF_decodeACC2MainSub1(mbr0, chn_infos[a0])) break; //call 478330 if (rs = MAPCDSF_decodeACC2MainSub2(mbr0, chn_infos[a0])) break; if (uk1b448) { for (Mai_U32 b0 = chn_infos[a0]->uk1b450; b0 < uk1b44c; b0++) { chn_infos[a0]->acc_data_now->table[b0].num_acc = chn_infos[a0]->acc_data_now->table[b0 - 1].num_acc; for (Mai_U32 b1 = 0; b1 < (Mai_U32)chn_infos[a0]->acc_data_now->table[b0].num_acc; b1++) { chn_infos[a0]->acc_data_now->table[b0].data1[b1] = chn_infos[a0]->acc_data_now->table[b0 - 1].data1[b1]; chn_infos[a0]->acc_data_now->table[b0].data0[b1] = chn_infos[a0]->acc_data_now->table[b0 - 1].data0[b1]; } } } } else { Mai_U32 uk1b44c = 0; } } return rs; }
Mai_Status MaiAT3PlusCoreDecoder::decodeACC6Inner(MaiBitReader *mbr0, MaiAT3PlusCoreDecoderChnInfo **chn_infos, Mai_U32 chns) { Mai_Status rs = 0; if (chns == 2) { Mai_memset(&chn_infos[0]->acc_table_now->inner->table_unk0, 0, sizeof(MaiAT3PlusCoreDecoderPackTable0)); Mai_memset(&chn_infos[0]->acc_table_now->inner->table_unk1, 0, sizeof(MaiAT3PlusCoreDecoderPackTable0)); Mai_memset(&chn_infos[0]->acc_table_now->inner->table_unk2, 0, sizeof(MaiAT3PlusCoreDecoderPackTable0)); } for (Mai_U32 a0 = 0; a0 < chns; a0++) { Mai_memset(chn_infos[a0]->acc_table_now->table, 0, sizeof(chn_infos[a0]->acc_table_now->table)); for (Mai_U32 a1 = 0; a1 < 0x10; a1++) { chn_infos[a0]->acc_table_now->table[a1].unk[7] = 0x20; chn_infos[a0]->acc_table_now->table[a1].unk[6] = 0; } } chn_infos[0]->acc_table_now->inner->ptr_to_use_now = chn_infos[0]->acc_table_now->inner->data; chn_infos[0]->acc_table_now->inner->unk0 = mbr0->getWithI32Buffer(1); if (chn_infos[0]->acc_table_now->inner->unk0) { chn_infos[0]->acc_table_now->inner->unk1 = mbr0->getWithI32Buffer(1); chn_infos[0]->acc_table_now->inner->unk2 = MAPCDSF_getHuffValue(&MAPCDSD_huff_table_global_11[0], mbr0) + 1; if (chns == 2) { MAPCDSF_readPackTable0(mbr0, &chn_infos[0]->acc_table_now->inner->table_unk0, chn_infos[0]->acc_table_now->inner->unk2); MAPCDSF_readPackTable0(mbr0, &chn_infos[0]->acc_table_now->inner->table_unk2, chn_infos[0]->acc_table_now->inner->unk2); MAPCDSF_readPackTable0(mbr0, &chn_infos[0]->acc_table_now->inner->table_unk1, chn_infos[0]->acc_table_now->inner->unk2); } for (Mai_U32 a0 = 0; a0 < chns; a0++) { //call 477e60 if (rs = MAPCDSF_decodeACC6InnerSub0(mbr0, chn_infos[a0])) break; } if (chns == 2) { for (Mai_I32 a0 = 0; a0 < chn_infos[0]->acc_table_now->inner->unk2; a0++) { if (chn_infos[0]->acc_table_now->inner->table_unk0.data[a0]) { /*for (Mai_I32 a1 = 0; a1 < 0xA; a1++) { chn_infos[1]->acc_table_now->table[a0].unk[a1] = chn_infos[0]->acc_table_now->table[a0].unk[a1]; //memcpy? }*/ Mai_memcpy( &chn_infos[1]->acc_table_now->table[a0], &chn_infos[0]->acc_table_now->table[a0], sizeof(MaiAT3PlusCoreDecoderChnACCTableTable)); //left to right acc5 copy 0x10 + 0x28 * a0 0x4 add zumi //left to right acc5 copy 0x14 + 0x28 * a0 0x4 add zumi //left to right acc5 copy 0x18 + 0x28 * a0 0x4 add zumi //left to right acc5 copy 0x1C + 0x28 * a0 0x4 add zumi } if (chn_infos[0]->acc_table_now->inner->table_unk2.data[a0]) { //swap? MaiAT3PlusCoreDecoderChnACCTableTable tmpbuf0; Mai_memcpy( &tmpbuf0, &chn_infos[1]->acc_table_now->table[a0], sizeof(MaiAT3PlusCoreDecoderChnACCTableTable)); Mai_memcpy( &chn_infos[1]->acc_table_now->table[a0], &chn_infos[0]->acc_table_now->table[a0], sizeof(MaiAT3PlusCoreDecoderChnACCTableTable)); Mai_memcpy( &chn_infos[0]->acc_table_now->table[a0], &tmpbuf0, sizeof(MaiAT3PlusCoreDecoderChnACCTableTable)); /* Mai_I32 tmpbuf0[0xA]; for (Mai_I32 a1 = 0; a1 < 0xA; a1++) { tmpbuf0[a1] = *(Mai_I32*)&infos.acc_struct_6_1.table0[a0 * 0x28 + a1 * 0x4]; } for (Mai_I32 a1 = 0; a1 < 0xA; a1++) { *(Mai_I32*)&infos.acc_struct_6_1.table0[a0 * 0x28 + a1 * 0x4] = *(Mai_I32*)&infos.acc_struct_6_0.table0[a0 * 0x28 + a1 * 0x4]; } for (Mai_I32 a1 = 0; a1 < 0xA; a1++) { *(Mai_I32*)&infos.acc_struct_6_0.table0[a0 * 0x28 + a1 * 0x4] = tmpbuf0[a1]; }*/ } } } } return rs; }