Example #1
0
/**
 * Write the header
 * @param[in] hWave The handle of wave
 * @retval SUCCESS If succeeded
 * @retval FAILURE If failed
 */
static BRESULT WriteHeader(WAVEFILEH hWave)
{
	struct TagRiffChunk riff;
	struct tagChunk chunk;
	struct TagWaveFormat format;
	UINT nFileSize;
	UINT nBlockAlign;
	UINT nAvgBytesPerSec;

	nFileSize = hWave->nDataSize;
	nFileSize += 4 + sizeof(chunk) + sizeof(format) + sizeof(chunk);

	riff.riff = MAKEID('R', 'I', 'F', 'F');
	STOREINTELDWORD(riff.fileSize, nFileSize);
	riff.fileType = MAKEID('W', 'A', 'V', 'E');
	if (file_write(hWave->fh, &riff, sizeof(riff)) != sizeof(riff))
	{
		return FAILURE;
	}

	chunk.id = MAKEID('f', 'm', 't', ' ');
	STOREINTELDWORD(chunk.size, sizeof(format));
	if (file_write(hWave->fh, &chunk, sizeof(chunk)) != sizeof(chunk))
	{
		return FAILURE;
	}

	nBlockAlign = hWave->nChannels * (hWave->nBits / 8);
	nAvgBytesPerSec = nBlockAlign * hWave->nRate;
	STOREINTELWORD(format.formatTag, WAVE_FORMAT_PCM);
	STOREINTELWORD(format.channels, hWave->nChannels);
	STOREINTELDWORD(format.samplePerSec, hWave->nRate);
	STOREINTELDWORD(format.avgBytesPerSec, nAvgBytesPerSec);
	STOREINTELWORD(format.blockAlign, nBlockAlign);
	STOREINTELWORD(format.bitsPerSample, hWave->nBits);
	if (file_write(hWave->fh, &format, sizeof(format)) != sizeof(format))
	{
		return FAILURE;
	}

	chunk.id = MAKEID('d', 'a', 't', 'a');
	STOREINTELDWORD(chunk.size, hWave->nDataSize);
	if (file_write(hWave->fh, &chunk, sizeof(chunk)) != sizeof(chunk))
	{
		return FAILURE;
	}
	return SUCCESS;
}
Example #2
0
void NetChannel::CopyNormalFragments()
{
	fragbuf_t *p, *n;
	int totalSize;

	if (!m_incomingbufs[FRAG_NORMAL_STREAM]) {
		m_System->DPrintf("WARNING! NetChannel::CopyNormalFragments: called with no fragments readied.\n");
		return;
	}

	totalSize = 0;
	p = m_incomingbufs[FRAG_NORMAL_STREAM];
	while (p)
	{
		totalSize += p->size;
		p = p->next;
	}

	NetPacket *packet = new NetPacket;
	packet->seqnr = m_incoming_sequence;
	packet->connectionless = false;
	packet->time = m_System->GetTime();
	packet->address.FromNetAddress(&m_remote_address);
	packet->data.Resize(totalSize);

	p = m_incomingbufs[FRAG_NORMAL_STREAM];
	while (p)
	{
		n = p->next;
		packet->data.WriteBuf(p->data, p->size);

		Mem_Free(p);
		p = n;
	}

	if (*(uint32 *)packet->data.GetData() == MAKEID('B', 'Z', '2', '\0'))
	{
		char uncompressed[65536];
		unsigned int uncompressedSize = 65536;

		BZ2_bzBuffToBuffDecompress(uncompressed, &uncompressedSize, (char *)packet->data.GetData() + 4, totalSize - 4, 1, 0);

		packet->data.Resize(uncompressedSize);
		packet->data.WriteBuf(uncompressed, uncompressedSize);
	}

	packet->data.Reset();

	m_incomingPackets.AddHead(packet);
	m_incomingbufs[FRAG_NORMAL_STREAM] = nullptr;
}
int Disp_GridIndex( CCoreDispInfo *pDispInfo )
{
	// quick hash the center into the grid and put the whole terrain in that grid
	Vector mins, maxs;
	pDispInfo->GetNode(0)->GetBoundingBox( mins, maxs );
	Vector center;
	center = 0.5 * (mins + maxs);
	// make sure it's positive
	center += Vector(MAX_COORD_INTEGER,MAX_COORD_INTEGER,MAX_COORD_INTEGER);
	int gridX = center.x / DISP_GRID_SIZEX;
	int gridY = center.y / DISP_GRID_SIZEY;
	int gridZ = center.z / DISP_GRID_SIZEZ;

	gridX &= 0xFF;
	gridY &= 0xFF;
	gridZ &= 0xFF;
	return MAKEID( gridX, gridY, gridZ, 0 );
}
Example #4
0
/* <66786> ../engine/net_chan.c:1723 */
qboolean Netchan_CopyNormalFragments(netchan_t *chan)
{
	fragbuf_t *p, *n;

	if (!chan->incomingready[FRAG_NORMAL_STREAM])
		return FALSE;

	if (!chan->incomingbufs[FRAG_NORMAL_STREAM])
	{
		Con_Printf("Netchan_CopyNormalFragments:  Called with no fragments readied\n");
		chan->incomingready[FRAG_NORMAL_STREAM] = FALSE;
		return FALSE;
	}

	p = chan->incomingbufs[FRAG_NORMAL_STREAM];

	SZ_Clear(&net_message);
	MSG_BeginReading();

	while (p)
	{
		n = p->next;

		SZ_Write(&net_message, p->frag_message.data, p->frag_message.cursize);

		Mem_Free(p);
		p = n;
	}

	if (*(uint32 *)net_message.data == MAKEID('B', 'Z', '2', '\0'))
	{
		char uncompressed[65536];
		unsigned int uncompressedSize = 65536;
		BZ2_bzBuffToBuffDecompress(uncompressed, &uncompressedSize, (char*)net_message.data + 4, net_message.cursize - 4, 1, 0);
		Q_memcpy(net_message.data, uncompressed, uncompressedSize);
		net_message.cursize = uncompressedSize;
	}

	chan->incomingbufs[FRAG_NORMAL_STREAM] = NULL;
	chan->incomingready[FRAG_NORMAL_STREAM] = false;

	return TRUE;
}
Example #5
0
	}

#define writevar(var,sz)	\
	if(memfile_write(&var,1,sz,file) != sz) {	\
		log_printf("state_save:  error writing " #var "\n");	\
		return(1);	\
	}

typedef struct blockfunc_s {
	u32 type;
	u32 size;
	void (*func)(int,u8*);
} blockfunc_t;

static blockfunc_t blockinfo[16];
static u32 ident = MAKEID('N','S','T','\0');
static u32 version = 0x0100;

int state_init()
{
	memset(blockinfo,0,sizeof(blockfunc_t) * 16);
	return(0);
}

void state_kill()
{
}

void state_register(u32 type,void (*func)(int,u8*))
{
	int i;
Example #6
0
qboolean Netchan_CopyNormalFragments(netchan_t *chan)
{
	fragbuf_t *p, *n;

	if (!chan->incomingready[FRAG_NORMAL_STREAM])
		return FALSE;

	if (!chan->incomingbufs[FRAG_NORMAL_STREAM])
	{
		Con_Printf("%s:  Called with no fragments readied\n", __func__);
		chan->incomingready[FRAG_NORMAL_STREAM] = FALSE;
		return FALSE;
	}

	p = chan->incomingbufs[FRAG_NORMAL_STREAM];

	SZ_Clear(&net_message);
	MSG_BeginReading();

#ifdef REHLDS_FIXES
	bool overflowed = false;
#endif // REHLDS_FIXES

	while (p)
	{
		n = p->next;

#ifdef REHLDS_FIXES
		if (net_message.cursize + p->frag_message.cursize <= net_message.maxsize)
			SZ_Write(&net_message, p->frag_message.data, p->frag_message.cursize);
		else
			overflowed = true;
#else // REHLDS_FIXES
		SZ_Write(&net_message, p->frag_message.data, p->frag_message.cursize);
#endif // REHLDS_FIXES

		Mem_Free(p);
		p = n;
	}

#ifdef REHLDS_FIXES
	if (overflowed)
	{
		if (chan->player_slot == 0)
		{
			Con_Printf("%s: Incoming overflowed\n", __func__);
		}
		else
		{
			Con_Printf("%s: Incoming overflowed from %s\n", __func__, g_psvs.clients[chan->player_slot - 1].name);
		}

		SZ_Clear(&net_message);

		chan->incomingbufs[FRAG_NORMAL_STREAM] = nullptr;
		chan->incomingready[FRAG_NORMAL_STREAM] = FALSE;

		return FALSE;
	}
#endif // REHLDS_FIXES

	if (*(uint32 *)net_message.data == MAKEID('B', 'Z', '2', '\0'))
	{
		char uncompressed[65536];
		unsigned int uncompressedSize = 65536;
		BZ2_bzBuffToBuffDecompress(uncompressed, &uncompressedSize, (char*)net_message.data + 4, net_message.cursize - 4, 1, 0);
		Q_memcpy(net_message.data, uncompressed, uncompressedSize);
		net_message.cursize = uncompressedSize;
	}

	chan->incomingbufs[FRAG_NORMAL_STREAM] = nullptr;
	chan->incomingready[FRAG_NORMAL_STREAM] = FALSE;

	return TRUE;
}
Example #7
0
void Netchan_CreateFragments_(qboolean server, netchan_t *chan, sizebuf_t *msg)
{
	fragbuf_t *buf;
	int chunksize;
	int send;
	int remaining;
	int pos;
	int bufferid = 1;
	fragbufwaiting_t *wait, *p;

	if (msg->cursize == 0)
	{
		return;
	}

	// Compress if not done already
	if (*(uint32 *)msg->data != MAKEID('B', 'Z', '2', '\0'))
	{
		unsigned char compressed[65536];
		char hdr[4] = "BZ2";
		unsigned int compressedSize = msg->cursize - sizeof(hdr);	// we should fit in same data buffer minus 4 bytes for a header
		if (!BZ2_bzBuffToBuffCompress((char *)compressed, &compressedSize, (char *)msg->data, msg->cursize, 9, 0, 30))
		{
			Con_DPrintf("Compressing split packet (%d -> %d bytes)\n", msg->cursize, compressedSize);
			Q_memcpy(msg->data, hdr, sizeof(hdr));
			Q_memcpy(msg->data + sizeof(hdr), compressed, compressedSize);
			msg->cursize = compressedSize + sizeof(hdr);
		}
	}

	chunksize = chan->pfnNetchan_Blocksize(chan->connection_status);

	wait = (fragbufwaiting_t *)Mem_ZeroMalloc(sizeof(fragbufwaiting_t));

	remaining = msg->cursize;
	pos = 0;
	while (remaining > 0)
	{
		send = min(remaining, chunksize);
		remaining -= send;

		buf = Netchan_AllocFragbuf();
		if (!buf)
		{
			return;
		}

		buf->bufferid = bufferid++;

		// Copy in data
		SZ_Clear(&buf->frag_message);
		SZ_Write(&buf->frag_message, &msg->data[pos], send);
		pos += send;

		Netchan_AddFragbufToTail(wait, buf);
	}

	// Now add waiting list item to the end of buffer queue
	if (!chan->waitlist[FRAG_NORMAL_STREAM])
	{
		chan->waitlist[FRAG_NORMAL_STREAM] = wait;
	}
	else
	{
		p = chan->waitlist[FRAG_NORMAL_STREAM];
		while (p->next)
		{
			p = p->next;
		}
		p->next = wait;
	}
}