예제 #1
0
Mai_Status MaiWaveOutWO::enqueue(Mai_I8 *buf, Mai_U32 size, Mai_Bool is_syn)
{
	mcs0.enter();
	
	/*Mai_U32 buf_required = (size + sbuf_size - 1) / sbuf_size;
	SLBufferQueueState state;
	(*bufferQueueItf)->GetState(bufferQueueItf, &state);
	*/
	if ( (!is_syn) )//&& ( (sbuf_num - state.count) < buf_required ) )
	{
		mcs0.leave();
		return -1;
	}
	
	Mai_U32 buf_loc = 0;
	while ( (!is_stop) && (size) )//(buf_required)
	{
		WAVEHDR *h_now = &ppWaveHeader[sbuf_counter / sbuf_size];
		if (h_now->dwFlags & WHDR_DONE)
		{
			::waveOutUnprepareHeader(p0, h_now, sizeof(WAVEHDR));
			Mai_U32 to_copy = size;
			if (to_copy > sbuf_size) to_copy = sbuf_size;
			Mai_memcpy(sbuf + sbuf_counter, buf + buf_loc, to_copy);
			h_now->dwBufferLength = to_copy;
			h_now->dwFlags = 0;
			::waveOutPrepareHeader(p0, h_now, sizeof(WAVEHDR));
			::waveOutWrite(p0, h_now, sizeof(WAVEHDR));
			sbuf_counter += sbuf_size;
			sbuf_counter %= sbuf_num * sbuf_size;
			buf_loc += to_copy;
			size -= to_copy;
		}
		else
		{
			Mai_Sleep(1);
		}
	}
	
	mcs0.leave();
	return 0;
}
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;
}