-
---------------------
Paste the text below into sound.c:
/////////////////////////////////
sound.c
#include <stdio.h>
#include "sound.h"
LPWAVESTRUCT WaveOpen( LPSTR szFilename, HANDLE hFileIn )
{
MMCKINFO MMCkInfoParent;
MMCKINFO MMCkInfoChild;
MMIOINFO mmioinfo;
HMMIO hmmio;
HANDLE hWaveOut;
int errorCode;
DWORD bytesRead;
long lDataSize;
LPBYTE pWaveData;
LPWAVESTRUCT lpWaveStruct;
if (!szFilename) // use a handle
{
if (!hFileIn) return NULL; // if no handle specified, return an error
memset( &mmioinfo, 0, sizeof( MMIOINFO ) );
mmioinfo.dwFlags = MMIO_DENYWRITE;
mmioinfo.adwInfo[0] = (DWORD)hFileIn;
if ((hmmio = mmioOpen( NULL, &mmioinfo, MMIO_READ )) == NULL) return
NULL;
} else // use a filename
if ((hmmio = mmioOpen( szFilename, NULL, MMIO_READ )) == NULL) return
NULL;
// allocate memory for the wave struct
if ((lpWaveStruct =
(LPWAVESTRUCT)GlobalAlloc( GPTR, sizeof( WAVESTRUCT ) )) == NULL )
{
mmioClose( hmmio, 0 );
return NULL;
}
MMCkInfoParent.fccType = mmioFOURCC('W','A','V','E');
if (errorCode = mmioDescend( hmmio, &MMCkInfoParent, NULL, MMIO_FINDRIFF
))
{
GlobalFree( lpWaveStruct );
mmioClose( hmmio, 0 );
return NULL;
}
MMCkInfoChild.ckid = mmioFOURCC('f','m','t',' ');
if (errorCode = mmioDescend( hmmio, &MMCkInfoChild, &MMCkInfoParent,
MMIO_FINDCHUNK ))
{
GlobalFree( lpWaveStruct );
mmioClose( hmmio, 0 );
return NULL;
}
if ((bytesRead = mmioRead( hmmio,
(LPSTR)&(lpWaveStruct->PCMWaveFmtRecord), MMCkInfoChild.cksize )) <= 0)
{
GlobalFree( lpWaveStruct );
mmioClose( hmmio, 0 );
return NULL;
}
errorCode = waveOutOpen( &hWaveOut, WAVE_MAPPER, (WAVEFORMATEX
*)&(lpWaveStruct->PCMWaveFmtRecord),
0L, 0L, WAVE_FORMAT_QUERY );
if (errorCode)
{
GlobalFree( lpWaveStruct );
mmioClose( hmmio, 0 );
return NULL;
}
if (errorCode = mmioAscend( hmmio, &MMCkInfoChild, 0 ))
{
GlobalFree( lpWaveStruct );
mmioClose( hmmio, 0 );
return NULL;
}
MMCkInfoChild.ckid = mmioFOURCC('d','a','t','a');
if (errorCode = mmioDescend( hmmio, &MMCkInfoChild, &MMCkInfoParent,
MMIO_FINDCHUNK ))
{
GlobalFree( lpWaveStruct );
mmioClose( hmmio, 0 );
return NULL;
}
lDataSize = MMCkInfoChild.cksize;
if ((pWaveData = GlobalAlloc( GMEM_FIXED, lDataSize )) == NULL)
{
GlobalFree( lpWaveStruct );
mmioClose( hmmio, 0 );
return NULL;
}
if ( mmioRead( hmmio, (LPSTR)pWaveData, lDataSize ) != lDataSize )
{
GlobalFree( lpWaveStruct );
GlobalFree( pWaveData );
mmioClose( hmmio, 0 );
return NULL;
}
lpWaveStruct->WaveHeader.lpData = pWaveData;
lpWaveStruct->WaveHeader.dwBufferLength = lDataSize;
lpWaveStruct->WaveHeader.dwFlags = 0L;
lpWaveStruct->WaveHeader.dwLoops = 0L;
mmioClose( hmmio, 0 );
return lpWaveStruct;
Quote:
}
BOOL WavePlay( LPWAVESTRUCT lpWaveStruct )
{
HANDLE hWaveOut;
MMRESULT ReturnCode;
if (ReturnCode = waveOutOpen( &hWaveOut, WAVE_MAPPER, (WAVEFORMATEX
*)&(lpWaveStruct->PCMWaveFmtRecord),
0L, 0L, 0L ))
return FALSE;
lpWaveStruct->WaveHeader.dwFlags = 0;
if (ReturnCode = waveOutPrepareHeader( hWaveOut,
&(lpWaveStruct->WaveHeader), sizeof( WAVEHDR ) ))
return FALSE;
lpWaveStruct->WaveHeader.dwFlags = 0;
if (ReturnCode = waveOutWrite( hWaveOut, &(lpWaveStruct->WaveHeader),
sizeof( WAVEHDR ) ))
return FALSE;
while (!(lpWaveStruct->WaveHeader.dwFlags & WHDR_DONE)) {}
if (ReturnCode = waveOutUnprepareHeader( hWaveOut,
&(lpWaveStruct->WaveHeader), sizeof( WAVEHDR ) ))
return FALSE;
lpWaveStruct->WaveHeader.dwFlags = 0L;
if (ReturnCode = waveOutClose( hWaveOut ))
return FALSE;
return TRUE;
Quote:
}
// end sound.c
----------------------------------------------------------------------------
-------------------------------------------------------------------
--
---------------------------------------------
Justin Holmes
Technical Director
Visdyn Software Corporation
Web: www.visdyn.com
Tel: (416) 368-3088
Fax: (416) 368-3086
---------------------------------------------