mciSendCommand 音频播放

mciSendCommand 音频播放

MCI(Media Control Interface,媒体控制接口)向Windows程序提供了在高层次上控制媒体设备接口的能力。程序不必关心具体设备,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。

 	//打开音频文件
 	bool OpenSoundFile(const QString & strFilePath)
    {
        musicClose();
		//打开
        MCI_OPEN_PARMS mciopenparms;
        WCHAR wsz[64];
        swprintf(wsz, L"%S", strFilePath.toStdString().c_str());
        LPCWSTR m_szFilename = wsz;
        //(LPCWSTR)strFilePath.toStdString().c_str();//播放路径,文件为mid格式
        mciopenparms.lpstrElementName = m_szFilename;
        //文件类型
        mciopenparms.lpstrDeviceType = NULL;
        //向MCI设备发送命令消息MCI_DEVTYPE_WAVEFORM_AUDIO
        MCIERROR ret = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT,
            (DWORD)(LPVOID)&mciopenparms);

        if (ret != 0)
        {
            printError(ret);
            return false;
        }

        MCI_SET_PARMS mciSet;
        //设置时间单位为毫秒  
        mciSet.dwTimeFormat = MCI_FORMAT_MILLISECONDS; 
        ret = mciSendCommand(m_wIDDevioce, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID)&mciSet);
        if (ret != 0)
        {
            printError(ret);
            return false;
        }

        m_wIDDevioce = mciopenparms.wDeviceID;

        return true;
    }

	//播放
    bool MCIPlay()
    {
        if (m_wIDDevioce < 0)
        {
            return false;
        }
        //播放
        MCI_PLAY_PARMS mciplayparms;

        mciplayparms.dwCallback = (DWORD)m_hwnd;
        mciplayparms.dwFrom = 0;
        MCIERROR ret = mciSendCommand(m_wIDDevioce, MCI_PLAY, MCI_FROM | MCI_NOTIFY, (DWORD)(LPVOID)& mciplayparms);
        if (ret != 0)
        {
            printError(ret);
            return false;
        }

        return true;
    }

	//暂停和继续播放的切换
    bool changeSoundStatus(bool bPause)
    {
        if (m_wIDDevioce < 0)
        {
            return false;
        }

        if (bPause)
        {
        	//暂停
            MCIERROR ret = mciSendCommand(m_wIDDevioce, MCI_PAUSE, 0, NULL);
            if (0 != ret) 
            {
                printError(ret);
                return false;
            }
        }
        else
        {
            MCI_PLAY_PARMS mciplayparms;
            mciplayparms.dwCallback = (DWORD)m_hwnd;
            //继续播放
            MCIERROR ret = mciSendCommand(m_wIDDevioce, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)& mciplayparms);
            if (0 != ret) 
            {
                printError(ret);
                return false;
            }
        }
        return true;
    }

	//音频长度
    DWORD getMusicLength()
    {
        if (m_wIDDevioce < 0)
        {
            return false;
        }
        MCI_STATUS_PARMS mciStatus;
        mciStatus.dwItem = MCI_STATUS_LENGTH;
        DWORD staReturn = mciSendCommand(m_wIDDevioce, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatus);
        //音频总时间
        DWORD music_alltime = mciStatus.dwReturn / 1000; 
        return music_alltime;
    }

	//获取音频当前播放的时间
    DWORD getMusicPos()
    {
        if (m_wIDDevioce < 0)
        {
            return false;
        }
        MCI_STATUS_PARMS mciStatus;
        mciStatus.dwItem = MCI_STATUS_POSITION;
        DWORD sta1Return = mciSendCommand(m_wIDDevioce, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatus);
        //当前播放时间
        DWORD music_timeing = mciStatus.dwReturn / 1000; 
        if (sta1Return != 0)
        {
            printError(sta1Return);
            return 0;
        }
        return music_timeing;
    }

	//指定从多少时间开始播放
    bool setMusicPos(DWORD dwPos)
    {
        if (m_wIDDevioce < 0)
        {
            return false;
        }
        MCI_PLAY_PARMS PlayParms;
        // 指定从什么地方(时间)播放
        PlayParms.dwFrom = dwPos * 1000; 
        DWORD ret1 = mciSendCommand(m_wIDDevioce, MCI_PLAY, MCI_FROM , (DWORD)(LPVOID)&PlayParms);
        if (0 != ret1)
        {
            printError(ret1);
            return false;
        }
        return true;
    }

	//关闭音频播放
    bool CPlayWnd::musicClose()
    {
        if (m_wIDDevioce < 0)
        {
            return false;
        }

        DWORD retclose = mciSendCommand(m_wIDDevioce, MCI_CLOSE, NULL, NULL);
        if (0 != retclose) 
        {
            printError(retclose);
            return false;
        }
        return true;
    }

	//改变音量大小
    DWORD setVolume(DWORD dwVol)
    {
        if (m_wIDDevioce < 0)
        {
            return false;
        }
        MCI_DGV_SETAUDIO_PARMS mciSetAudioPara;
        mciSetAudioPara.dwCallback = NULL;
        mciSetAudioPara.dwItem = MCI_DGV_SETAUDIO_VOLUME;
        //音量大小 (0--1000)
        mciSetAudioPara.dwValue = dwVol; 
        DWORD dwReturn = mciSendCommand(m_wIDDevioce, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE | MCI_DGV_SETAUDIO_ITEM, (DWORD)(LPVOID)&mciSetAudioPara);

        return dwReturn;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值