www.pudn.com > DIAL.rar > WAVEPLAY.CPP


#include  
#include  
#include  
#include  
#include "WavePlay.h" 
//--------------------------------------------------------------------------- 
//play wave by WavePlay 
//--------------------------------------------------------------------------- 
HWAVEOUT WavePlay(DWORD nID, LPSTR lpFileName ,LPLINEINFO pLineData)	 
{  
	WAVEFORMATEX *lpWaveFormat = NULL; 
	WAVEHDR *lpWaveHdr = NULL; 
	HMMIO hmmioH;       
	HWAVEOUT hWaveOut = NULL; 
	MMCKINFO mmParent, mmSubchunk; 
	DWORD dwFmtSize, dwDataSize, dwFlags; 
	HPSTR lpWaveData = NULL; 
	MMRESULT mmrc; 
	HPSTR lpWaveDataLock; 
	 
	// Open wave file  
    hmmioH = mmioOpen(lpFileName, NULL, MMIO_READ);  
    if(!hmmioH) 
    {    
		printf("\n###Line %d Input WAVE file open failed",pLineData->nLineID); 
        return NULL; 
    }                  
     
    // Locate a RIFF?  chunk with a WAVE?   Form type  
    mmParent.fccType = mmioFOURCC('W', 'A', 'V', 'E'); 
    if (mmioDescend(hmmioH, (LPMMCKINFO) &mmParent, NULL, MMIO_FINDRIFF)) 
	{  
		mmioClose(hmmioH, 0); 
        printf("\n###Line %d Corrupted WAVE file(no WAVE form type)",pLineData->nLineID); 
		return NULL; 
	} 
 
	// Find the format chunk  
    mmSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' '); 
    if (mmioDescend(hmmioH, &mmSubchunk, &mmParent, MMIO_FINDCHUNK)) 
    { 
        mmioClose(hmmioH, 0); 
        printf("\n###Line %d Corrupted WAVE file(no fmt chunk)",pLineData->nLineID); 
        return NULL; 
    } 
	 
    // Get the size of the format chunk, allocate memory for it  
    dwFmtSize = mmSubchunk.cksize; 
    lpWaveFormat = (WAVEFORMATEX *) malloc(dwFmtSize); 
    if (!lpWaveFormat) 
    { 
        printf("\n###Line %d Memory alloc for waveformat failed",pLineData->nLineID); 
        mmioClose(hmmioH, 0); 
        return NULL; 
    } 
 
	ZeroMemory((PVOID)lpWaveFormat, dwFmtSize); 
 
    // Read the format chunk  
    if (mmioRead(hmmioH, (HPSTR) lpWaveFormat, dwFmtSize) != (LONG) dwFmtSize) 
    { 
        printf("\n###Line %d Read fmt chunk failed",pLineData->nLineID); 
        mmioClose(hmmioH, 0); 
		goto PlayFailed; 
    } 
     
    // Ascend out of the format subchunk  
    mmioAscend(hmmioH, &mmSubchunk, 0); 
     
    // Find the data subchunk  
    mmSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a'); 
    if (mmioDescend(hmmioH, &mmSubchunk, &mmParent, MMIO_FINDCHUNK)) 
    { 
        printf("\n###Line %d Could not find data subchunk",pLineData->nLineID); 
        mmioClose(hmmioH, 0); 
		goto PlayFailed; 
    } 
     
    // Get the size of the data subchunk  
    dwDataSize = mmSubchunk.cksize; 
    if (dwDataSize == 0L) 
    { 
        printf("###Line %d No data to play",pLineData->nLineID); 
        mmioClose(hmmioH, 0); 
		goto PlayFailed; 
    } 
         
    // Allocate and lock memory for the waveform data.  
	lpWaveData = (HPSTR) LocalReAlloc(pLineData->lpWaveDataAlloc, dwDataSize, 0); 
    if (!lpWaveData) 
    { 
        printf("\n###Line %d Memory alloc for data to play failed",pLineData->nLineID); 
        mmioClose(hmmioH, 0); 
		goto PlayFailed; 
    } 
 
	 // Read the waveform data subchunk  
	pLineData->lpWaveDataAlloc = lpWaveData; 
	lpWaveDataLock = (HPSTR) LocalLock(lpWaveData); 
    if(mmioRead(hmmioH, (HPSTR) lpWaveDataLock, dwDataSize) != (LONG) dwDataSize) 
    { 
        printf("\n###Line %d Data read failed",pLineData->nLineID); 
        mmioClose(hmmioH, 0); 
		goto PlayFailed; 
    } 
 
    // We read done with the file, close it  
    mmioClose(hmmioH, 0); 
 
    // Allocate a waveform data header  
    lpWaveHdr = (WAVEHDR *) malloc((DWORD)sizeof(WAVEHDR)); 
    if (!lpWaveHdr) 
    { 
        printf("\n###Line %d Memory alloc for WAVE header failed",pLineData->nLineID); 
		goto PlayFailed; 
    } 
 
	// Set up WAVEHDR structure and prepare it to be written to wave device  
    lpWaveHdr->lpData = lpWaveDataLock; 
    lpWaveHdr->dwBufferLength = dwDataSize; 
    lpWaveHdr->dwFlags = 0L; 
    lpWaveHdr->dwLoops = 0L; 
    lpWaveHdr->dwUser  = (DWORD) nID; 
 
    /* make sure wave device can play our format */ 
	dwFlags = WAVE_FORMAT_QUERY | WAVE_MAPPED; 
    if (mmrc = waveOutOpen((LPHWAVEOUT)NULL, nID, lpWaveFormat,  
                    0L, 0L, dwFlags)) 
	{ 
		printf("\n###Line %d First waveOutOpen failed error# %x",pLineData->nLineID, mmrc); 
		goto PlayFailed; 
    } 
	 
	dwFlags = CALLBACK_FUNCTION | WAVE_MAPPED;	  //NO CALLBACK 
    //open the wave device corresponding to the line  
	if (mmrc = waveOutOpen (&hWaveOut, nID, lpWaveFormat,  
                             (DWORD)WavePlayCallBack, (DWORD)pLineData, dwFlags)) 
 
	{                                            
		printf("\n###Line %d opening wave device error #%x",pLineData->nLineID, mmrc); 
		goto PlayFailed; 
	} 
 
    //prepare the message header for playing  
    if (waveOutPrepareHeader (hWaveOut, lpWaveHdr, sizeof(WAVEHDR))) 
	{ 
		printf("\n###Line %d error preparing message header",pLineData->nLineID); 
		goto PlayFailed; 
    } 
 
    // Set the volume before playing 
    waveOutSetVolume(hWaveOut, 0x8888);	  //volume 0x0000 ~ 0xffff 
 
    // play the message right from the data segment;  set the play message flag  
    if (waveOutWrite (hWaveOut, lpWaveHdr, sizeof (WAVEHDR))) 
	{ 
		printf("\n###Line %d error writing wave message",pLineData->nLineID); 
        goto PlayFailed; 
    } 
 
	printf("\nLine %d play %s...",pLineData->nLineID,lpFileName); 
	pLineData->lpWaveHdr = lpWaveHdr; 
 
    free( lpWaveFormat ); 
    lpWaveFormat = NULL; 
 
    return hWaveOut; 
 
	PlayFailed:             
 
    if(lpWaveFormat) free( lpWaveFormat ); 
	if(lpWaveDataLock) LocalUnlock(lpWaveData); 
    if(lpWaveHdr) free(lpWaveHdr); 
	if(hWaveOut) waveOutClose(hWaveOut); 
    return NULL; 
} 
 
 
void CALLBACK WavePlayCallBack( HWAVEOUT hwo, UINT uMsg, DWORD dwInstance,	 
									DWORD dwParam1,	DWORD dwParam2) 
{    
	LPLINEINFO pLineData = (LPLINEINFO)dwInstance; 
 
	if ( uMsg == WOM_DONE )	  //0x3BD 
	{	 
		if (pLineData->dwCallState == TAPI_PLAYGREET)	  //check playing? 
			lineSetAppSpecific(pLineData->hCall, TAPI_SETAPP_ENDPLAYGREET); 
	}	 
}