Click here to Skip to main content
16,018,460 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi,

I am able to play a .wav file, but when we want to stop that file using waveOutReset() then application is hanging or crashes.
I am trying through this code as follows:
C++
CPlayWave::CPlayWave()
{
     m_PlayWaveOut=0;
}
CPlayWave::~CPlayWave()
{

}


///////////////////////////////////////////////////////////////////////////////////////////////
void CPlayWave::SetFormat()
{

}


BOOL CPlayWave::ReadWaveFile(LPSTR pszFileName)
{	
	hmmio = mmioOpen(pszFileName,0,MMIO_READ);
	if(!hmmio)
	{ 
	AfxMessageBox("unable to open the file");
	return FALSE;
	}
	//find parent chunk
	MckInfoParent.fccType = mmioFOURCC('W','A','V','E');
	mRes = mmioDescend(hmmio,&MckInfoParent,0,MMIO_FINDRIFF);
	ASSERT(mRes == MMSYSERR_NOERROR );
	if(mRes != MMSYSERR_NOERROR)
		return FALSE;
	//find child chunk
	MckInfoChild.ckid = mmioFOURCC('f','m','t',' ');
	mRes = mmioDescend(hmmio,&MckInfoChild,&MckInfoParent,MMIO_FINDCHUNK);
    ASSERT(mRes == MMSYSERR_NOERROR );
	if ( mRes != MMSYSERR_NOERROR ) 
		return FALSE;



	//READ WAVE FILE FORMAT 
	LONG lByteFormat = mmioRead(hmmio,(LPSTR)&WaveRecord,MckInfoChild.cksize);
	if(lByteFormat == 0)
		return FALSE;
	//move to parent chunk

	mRes = mmioAscend(hmmio,&MckInfoChild,0);
	ASSERT(mRes == MMSYSERR_NOERROR);
	if(mRes != MMSYSERR_NOERROR)
		return FALSE;
	//Find Data Chunk

   	MckDataInfo.ckid = mmioFOURCC ( 'd', 'a', 't', 'a' ) ;	
	mRes = mmioDescend ( hmmio, &MckDataInfo, &MckInfoParent, MMIO_FINDCHUNK ); 
	ASSERT(mRes == MMSYSERR_NOERROR ); 
	if (mRes != MMSYSERR_NOERROR ) 
		return FALSE;

	//Get Data Chunk
	 datasize = MckDataInfo.cksize;
	
	//LPSTR pWaveDataBlock;
	pWaveDataBlock = new char[datasize];
    LONG lByteRead = mmioRead(hmmio,pWaveDataBlock,datasize);
	ASSERT(lByteRead == (long)datasize);
   mmioClose(hmmio,0);
}
WAVEHDR* CPlayWave::WavePlay(bool loop)
{
   if(waveOutOpen(&m_PlayWaveOut, WAVE_MAPPER, &WaveRecord, (DWORD)waveOutProc, 0, CALLBACK_FUNCTION) != MMSYSERR_NOERROR)
	 {
		 AfxMessageBox("unable to open the device");
		 
	 }
    //prepare WaveHeader
    m_pWaveHdr = new WAVEHDR;
	ZeroMemory((void*) m_pWaveHdr, sizeof(WAVEHDR));
	m_pWaveHdr->lpData = pWaveDataBlock;
    m_pWaveHdr->dwBufferLength = datasize;
	//m_pWaveHdr->dwFlags = 0;
	m_pWaveHdr->dwUser = (DWORD)loop;
	//mRes = waveOutPrepareHeader(m_PlayWaveOut,m_pWaveHdr, sizeof( WAVEHDR));

//
     
      
	
   if(waveOutPrepareHeader(m_PlayWaveOut,m_pWaveHdr, sizeof(WAVEHDR))!=MMSYSERR_NOERROR)
	   return NULL;
	//startplayback
	if( waveOutWrite(m_PlayWaveOut,m_pWaveHdr,sizeof( WAVEHDR))!=MMSYSERR_NOERROR)
		return NULL;
	m_bPlay = TRUE;
	m_bPause = FALSE;
	
	return m_pWaveHdr;
}


void CPlayWave::waveOutProc(HWAVEOUT m_PlayWaveOut,UINT uMsg ,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
	//MMRESULT mmRes;
	switch(uMsg)
	{
	case WOM_DONE:   //playback finished
	WAVEHDR * m_pWaveHdr = (WAVEHDR*)dwParam1;
	if(m_pWaveHdr->dwUser)
      waveOutWrite(m_PlayWaveOut,m_pWaveHdr,sizeof( WAVEHDR));
	else
    {
     waveOutUnprepareHeader(m_PlayWaveOut, m_pWaveHdr, sizeof(WAVEHDR));
        delete m_pWaveHdr ;
	}
	break;
	}
}


BOOL CPlayWave::Pause()
{
	if(m_bPlay)
	{
		mRes = waveOutPause(m_PlayWaveOut);
		if(mRes!=MMSYSERR_NOERROR)
		{
			switch(mRes)
			{
			case MMSYSERR_INVALHANDLE:
				AfxMessageBox("Specified device handle is invalid.");
				break;
			case MMSYSERR_NODRIVER:
				AfxMessageBox("No device driver is present.");
				break;
			case MMSYSERR_NOMEM:
				AfxMessageBox("Unable to allocate or lock memory.");
				break;
			case MMSYSERR_INVALPARAM:
				AfxMessageBox("Invalid Parameter Passed");
				break;
			case MMSYSERR_NOTSUPPORTED:
				AfxMessageBox("Specified device is synchronous and does not support pausing.");
				break;
			default:
				AfxMessageBox("Unspecified Error");
				break;
			}
			m_bPause = FALSE;
			return FALSE;
		}		
		else
		{
			m_bPause = TRUE;
			m_bPlay = FALSE;
			return TRUE;
		}
	}
	else
	{
		if(m_bPause)
		{
			mRes = waveOutRestart(m_PlayWaveOut);
			if(mRes!=MMSYSERR_NOERROR)
			{
				switch(mRes)
				{
				case MMSYSERR_INVALHANDLE:
					AfxMessageBox("Specified device handle is invalid.");
					break;
				case MMSYSERR_NODRIVER:
					AfxMessageBox("No device driver is present.");
					break;
				case MMSYSERR_NOMEM:
					AfxMessageBox("Unable to allocate or lock memory.");
					break;
				case MMSYSERR_INVALPARAM:
					AfxMessageBox("Invalid Parameter Passed");
					break;
				case MMSYSERR_NOTSUPPORTED:
					AfxMessageBox("Specified device is synchronous and does not support pausing.");
					break;
				default:
					AfxMessageBox("Unspecified Error");
					break;
				}
				m_bPause = FALSE;
				return FALSE;
			}
			else
			{
				m_bPause = FALSE;
				m_bPlay = TRUE;
				return TRUE;
			}
		}
		else
		{
			return FALSE;
		}
	}
}


void CPlayWave::StopPlay()
{
  if(m_pWaveHdr)
	  m_pWaveHdr->dwUser= (DWORD)false;
  mRes = waveOutReset(m_PlayWaveOut);
} 


Please help me.

Thanks and regards,
rammohan
Posted
Updated 2-Apr-12 22:28pm
v2

1 solution

Try this instead:
mmioClose(hmmio, 0);

http://msdn.microsoft.com/en-us/library/windows/desktop/dd757316(v=vs.85).aspx[^]

Good luck!
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900