如何停止播放的Wave文件 [英] how to stop a playing wave file

查看:72
本文介绍了如何停止播放的Wave文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我可以播放.wav文件,但是当我们要使用waveOutReset()停止该文件时,应用程序将挂起或崩溃.
我正在尝试通过以下代码进行操作:

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:

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);
} 



请帮帮我.

谢谢和问候,
rammohan



Please help me.

Thanks and regards,
rammohan

推荐答案

请尝试以下方法:
mmioClose(hmmio, 0);


http://msdn.microsoft.com/zh-CN /library/windows/desktop/dd757316(v=vs.85).aspx [


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

Good luck!


这篇关于如何停止播放的Wave文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆