// reads a wav file, sends packetized buffers to the server, int UDPsend(UDPinfo *UI, TCPinfo *TI) { WSABUF filecontents; DWORD bytetoSend; DWORD flags = 0; FILE *fp; int byteSent = 0; int bufpos = 0; int numpackets; memset((void *)&UI->WH, 0, sizeof(wavheader)); fp = wavOpen(&UI->WH); filecontents.buf = (char *) malloc (BUFSIZE); filecontents.buf = UI->WH.soundBuffer; filecontents.len = BUFSIZE; numpackets = (UI->WH.dataSize / BUFSIZE); bytetoSend = (numpackets * SOUND_DATA_SIZE)+(numpackets * 44);// do math for this ...soundbuffer/512 then add header to each of those TCPcontrolsend(TI, UI, UI->WH.size); while(bytetoSend > byteSent) { filecontents.buf = packetize(&UI->WH, &bufpos); byteSent += sendto(UI->sd, filecontents.buf, BUFSIZE, flags, (struct sockaddr *)&UI->server, UI->server_len); } return 0; }
void UDPread(UDPinfo *UI, int filesize) { WSABUF UDPread; int bytesRecv = 0; DWORD flags = 0; int err; WAVEHDR* waveBlocks; FILE *fp; WAVEFORMATEX wfx; wavheader WH; HWAVEOUT hWaveOut; char data[BUFSIZE]; int i = 0; UDPread.buf = (char *) malloc (BUFSIZE); UDPread.len = BUFSIZE; waveBlocks = allocateBlocks(BLOCK_SIZE, BLOCK_COUNT); waveFreeBlockCount = BLOCK_COUNT; waveCurrentBlock = 0; InitializeCriticalSection(&waveCriticalSection); fp = wavOpen(&WH); wfx.nSamplesPerSec = WH.sampleRate; wfx.wBitsPerSample = 16; wfx.nChannels = 2; wfx.cbSize = 0; wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nBlockAlign = (wfx.wBitsPerSample * wfx.nChannels) >> 3; wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec; if((err = waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx,(DWORD_PTR)waveOutProc, (DWORD_PTR)&waveFreeBlockCount, CALLBACK_FUNCTION)) != MMSYSERR_NOERROR) { fprintf(stdout, "unable to open wave mapper device"); fprintf(stdout, "%d", err); ExitProcess(1); } while(bytesRecv < filesize) { if(recvfrom(UI->sd, UDPread.buf, BUFSIZE, flags,NULL,NULL) == SOCKET_ERROR) { err = WSAGetLastError(); if(err != ERROR_IO_PENDING) { // error during read } } memcpy(data,UDPread.buf, BUFSIZE); writeAudio(hWaveOut, data, BUFSIZE, waveBlocks, waveCriticalSection); bytesRecv += BUFSIZE; } /* * unprepare any blocks that are still prepared */ for(i = 0; i < waveFreeBlockCount; i++) { if(waveBlocks[i].dwFlags & WHDR_PREPARED) { waveOutUnprepareHeader(hWaveOut, &waveBlocks[i], sizeof(WAVEHDR)); } } DeleteCriticalSection(&waveCriticalSection); freeBlocks(waveBlocks); waveOutClose(hWaveOut); }