Warning: file_get_contents(https://whois.pconline.com.cn/jsLabel.jsp?ip=127.0.0.1) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable in D:\wwwroot\huidong\wwwroot\function.inc.php on line 884
可以操作音乐播放的MusicMCI类 - huidong

huidong

首页 | 会员登录 | 关于争取 2022 寒假做出汇东网 Ver3.0.0 !
搜索文章


源码来自:https://github.com/XuSong-0205/music_player

MusicMCI.cpp    (https://github.com/XuSong-0205/music_player/blob/gui/MusicMCI.cpp) 和

MusicMCI.h        (https://github.com/XuSong-0205/music_player/blob/gui/MusicMCI.h)


由于他两个文件内容不多,我把它合成一个 .h 了,如下:


MusicMCI.h

#pragma once

/************************************************************************
 * 作者 : 悠远的苍穹
 * QQ   : 2237505658
 * 邮箱 : 2237505658@qq.com
 * 最后修改  : 2020-8-17
 * 编译环境  : Visual Studio 2019
 ************************************************************************/

#ifdef _DEBUG
#include <iostream>
#endif

#include <fstream>
#include <string>
#include <vector>
#include <array>
#include <ctime>
#include <cmath>
#include <io.h>
#include <conio.h>
#include <graphics.h>
#include <windows.h>
#include <mmsystem.h>
#include <Digitalv.h>
#pragma comment(lib, "winmm.lib")

using std::wstring;
using std::vector;
using std::array;

class MusicMCI
{
private:
    // 设备 ID
    MCIDEVICEID nDeviceID;

public:

    MusicMCI()noexcept
    {
        nDeviceID = -1;
    }

    ~MusicMCI()
    {
        if (nDeviceID != -1) this->close();
    }

    // 打开文件
    // 成功返回 true,失败返回 false
    bool open(LPCWSTR strSongPath)noexcept
    {
        MCI_OPEN_PARMS mciOP;

        mciOP.lpstrDeviceType = nullptr;
        mciOP.lpstrElementName = strSongPath;
        const DWORD dwReturn = mciSendCommand(0, MCI_OPEN,
            MCI_OPEN_ELEMENT | MCI_WAIT | MCI_OPEN_SHAREABLE, (DWORD_PTR)(static_cast<LPVOID>(&mciOP)));

        if (dwReturn == 0)
        {
            nDeviceID = mciOP.wDeviceID;
            return true;
        }
        else
        {
            nDeviceID = -1;
            return false;
        }
    }

    // 播放
    // 成功返回非零值,失败返回0
    bool play()noexcept
    {
        MCI_PLAY_PARMS mciPP{};

        const DWORD dwReturn = mciSendCommand(nDeviceID, MCI_PLAY,
            MCI_NOTIFY, (DWORD_PTR)(static_cast<LPVOID>(&mciPP)));
        if (dwReturn == 0)
            return true;
        else
            return false;
    }

    // 暂停播放
    // 成功返回 true,失败返回 false
    bool pause()noexcept
    {
        MCI_GENERIC_PARMS mciGP{};

        const DWORD dwReturn = mciSendCommand(nDeviceID, MCI_PAUSE,
            MCI_NOTIFY | MCI_WAIT, (DWORD_PTR)(static_cast<LPVOID>(&mciGP)));
        if (dwReturn == 0)
            return true;
        else
            return false;
    }

    // 停止播放并使进度返回到开头
    // 成功返回 true,失败返回 false
    bool stop()noexcept
    {
        MCI_SEEK_PARMS mciSP{};

        const DWORD dwReturn = mciSendCommand(nDeviceID, MCI_SEEK,
            MCI_WAIT | MCI_NOTIFY | MCI_SEEK_TO_START, (DWORD_PTR)(static_cast<LPVOID>(&mciSP)));
        if (dwReturn == 0)
            return true;
        else
            return false;
    }

    // 关闭MCI设备
    // 成功返回 true,失败返回 false
    bool close()noexcept
    {
        MCI_GENERIC_PARMS mciGP{};

        const DWORD dwReturn = mciSendCommand(nDeviceID, MCI_CLOSE,
            MCI_NOTIFY | MCI_WAIT, (DWORD_PTR)(static_cast<LPVOID>(&mciGP)));
        if (dwReturn == 0)
        {
            nDeviceID = -1;
            return true;
        }
        else
            return false;
    }

    // 获得当前播放进度,pos 以 ms 为单位
    // 成功返回 true,失败返回 false
    bool getCurrentTime(DWORD& pos)noexcept
    {
        MCI_STATUS_PARMS mciSP{};

        mciSP.dwItem = MCI_STATUS_POSITION;
        const DWORD dwReturn = mciSendCommand(nDeviceID, MCI_STATUS,
            MCI_STATUS_ITEM, (DWORD_PTR)(static_cast<LPVOID>(&mciSP)));
        if (dwReturn == 0)
        {
            pos = static_cast<DWORD>(mciSP.dwReturn);
            return true;
        }
        else
        {
            pos = 0;
            return false;
        }
    }

    // 获取音乐总时长,time 以ms 为单位
    // 成功返回 true,失败返回 false
    bool getTotalTime(DWORD& time)noexcept
    {
        MCI_STATUS_PARMS mciSP{};

        mciSP.dwItem = MCI_STATUS_LENGTH;
        const DWORD dwReturn = mciSendCommand(nDeviceID, MCI_STATUS,
            MCI_WAIT | MCI_STATUS_ITEM, (DWORD_PTR)(static_cast<LPVOID>(&mciSP)));    // 关键,取得长度
        if (dwReturn == 0)
        {
            time = static_cast<DWORD>(mciSP.dwReturn);
            return true;
        }
        else
        {
            time = 0;
            return false;
        }
    }

    // 设置音量大小,音量值范围在 0 到 1000
    // 成功返回 true,失败返回 false
    bool setVolume(size_t nVolumeValue)noexcept
    {
        if (nVolumeValue > 1000)
        {
            nVolumeValue = 1000;
        }
        else if (nVolumeValue < 0)
        {
            nVolumeValue = 0;
        }

        MCI_DGV_SETAUDIO_PARMS mciDSP;
        mciDSP.dwItem = MCI_DGV_SETAUDIO_VOLUME;
        mciDSP.dwValue = static_cast<DWORD>(nVolumeValue);
        const DWORD dwReturn = mciSendCommand(nDeviceID, MCI_SETAUDIO,
            MCI_DGV_SETAUDIO_VALUE | MCI_DGV_SETAUDIO_ITEM, (DWORD_PTR)(static_cast<LPVOID>(&mciDSP)));
        if (dwReturn == 0)
            return true;
        else
            return false;
    }

    // 设置播放起始位置
    // 成功返回 true,失败返回 false
    bool setStartTime(size_t start_time) noexcept
    {
        DWORD end_time = 0;
        this->getTotalTime(end_time);

        if (start_time > end_time)
            return false;

        MCI_PLAY_PARMS mciPlay{};
        mciPlay.dwFrom = static_cast<DWORD>(start_time);
        mciPlay.dwTo = static_cast<DWORD>(end_time);
        const DWORD dwReturn = mciSendCommand(nDeviceID, MCI_PLAY,
            MCI_TO | MCI_FROM, (DWORD_PTR)(static_cast<LPVOID>(&mciPlay)));

        if (dwReturn == 0)
            return true;
        else
            return false;
    }
};




返回首页


Copyright (C) 2018-2024 huidong