![]() |
#2
鸿蒙之灵2020-11-18 15:24
已解决,将PlaySound()函数参数列表改为如下即可解决,不需单独添加if条件:
PlaySound(str, NULL, SND_NOSTOP | SND_FILENAME | SND_ASYNC | SND_LOOP); 另如需播放多个不同音频,可使用线程播放: ![]() CEvent PlayDLBegin; CEvent PlayDLEnd; CEvent PlayDLPause; CEvent PlayDLResume; extern UINT PlayDLSound(LPVOID pParam); UINT PlayDLSound(LPVOID pParam) { LPCTSTR lpres = (LPCTSTR)pParam; static BOOL isReEntry = TRUE; if (!isReEntry) return 0; isReEntry = FALSE; ::WaitForSingleObject(PlayDLBegin.m_hObject, INFINITE); HINSTANCE h = AfxGetInstanceHandle(); HRSRC hr = FindResource(h, lpres, "WAVE"); HGLOBAL hg = LoadResource(h, hr); LPSTR lp = (LPSTR)LockResource(hg); BOOL KeepRunning = TRUE; BOOL Playing = TRUE; isReEntry = FALSE; while (KeepRunning) { int Pause = ::WaitForSingleObject(PlayDLPause.m_hObject, 0); if (Pause == WAIT_OBJECT_0) Playing = FALSE; int start = ::WaitForSingleObject(PlayDLResume.m_hObject, 0); if (start == WAIT_OBJECT_0) Playing = TRUE; for (int j = 0; j<2; j++) { if (Playing) sndPlaySound(lp, SND_MEMORY | SND_SYNC); Sleep(1000); } KeepRunning = false; } isReEntry = TRUE; FreeResource(hg); return 0; } AfxBeginThread(PlayDLSound, (LPVOID)str, THREAD_PRIORITY_NORMAL); PlayDLBegin.SetEvent(); PlayDLEnd.SetEvent(); PlayDLPause.SetEvent(); PlayDLResume.SetEvent(); [此贴子已经被作者于2020-11-18 15:25编辑过] |
情景:当条件满足时自动触发该音频自动播放,一次播放完成后若没有人工置条件使其关闭则自动启动第二次播放,依次类推直到人工关闭该次播放;
问题:现阶段该音频文件能够播放,也能够人工操作使其停止播放,但是有一个问题,我的程序运行周期为一秒,用当前逻辑是每一个周期都会切断正在播放的,重新开始播放,导致声音一直在播放第一秒内容,代码如下:

CString str = "";
if (SQddlFlag == TRUE) //判断当前需要播放音频
{
if() //我的设想是此时如果判断该音频文件正在播放过程中,本次播放未完时,就不在执行以下语句块
{
str.Format("%s\\wave\\DL.wav", GetRoot()); //GetRoot()为该音频文件所在文件根目录动态定位
PlaySound(str, NULL, SND_FILENAME | SND_ASYNC | SND_LOOP | SND_NOWAIT);
}
}
else
{
PlaySound(NULL, NULL, SND_FILENAME); //停止该音频播放
}