| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1232 人关注过本帖
标题:MFC播放声音控制细节问题
取消只看楼主 加入收藏
鸿蒙之灵
Rank: 4
来 自:异次元裂缝
等 级:贵宾
威 望:11
帖 子:126
专家分:244
注 册:2016-8-22
结帖率:66.67%
收藏
 问题点数:0 回复次数:1 
MFC播放声音控制细节问题
现有音频文件wav格式一个,该文件播放时长为1分钟20秒;

情景:当条件满足时自动触发该音频自动播放,一次播放完成后若没有人工置条件使其关闭则自动启动第二次播放,依次类推直到人工关闭该次播放;

问题:现阶段该音频文件能够播放,也能够人工操作使其停止播放,但是有一个问题,我的程序运行周期为一秒,用当前逻辑是每一个周期都会切断正在播放的,重新开始播放,导致声音一直在播放第一秒内容,代码如下:

程序代码:

    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);    //停止该音频播放
    }  

搜索更多相关主题的帖子: 文件 str 音频 声音 播放 
2020-11-18 15:02
鸿蒙之灵
Rank: 4
来 自:异次元裂缝
等 级:贵宾
威 望:11
帖 子:126
专家分:244
注 册:2016-8-22
收藏
得分:0 
已解决,将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编辑过]


对待编程,要像对待情人一样
2020-11-18 15:24
快速回复:MFC播放声音控制细节问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.362421 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved