MCI Audio Player

· · 个人记录

V3以后就等个几年吧 就知道会有人盗代码 Copyright 2022 hdkghc

@fanmingyu45 盗代码 已拉黑

V5

# V4
## 
```cpp

V3.1

V3

V2

更改了进度条样式

#include<string>
#include<Windows.h>
#include<iostream>
#include<time.h>
#include<conio.h>
#include<stdlib.h>
#define NormalColor 0x07
#define ErrorColor FOREGROUND_RED
#define StatusColor BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY
#define NowColor BACKGROUND_BLUE | BACKGROUND_INTENSITY
#define Color(x) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x)
#define KEY_DOWN(VK_hdkghc) ((GetAsyncKeyState(VK_hdkghc) & 0x8000) ? 1:0) 
using namespace std;
typedef  int(__stdcall* w32mci)(const char*, char*, int,  int);
typedef int(__stdcall *  w32mcierror)(int, char*, int);
class Mci
{
private:
    HINSTANCE hins;
    w32mci wmci;
    w32mcierror wmcierror;
public:
    Mci();
    ~Mci();
    char buf[256];
    bool send(string command);//error  return false
};
class AudioClip
{
private:
    Mci mci;
    string filename;
    string alias;
    int length_ms;
public:
    bool ispaused;
    AudioClip();
    ~AudioClip();
    string getmusic()
    {
        return filename;
    }
    bool load(const  string& _filename);
    bool play(int start_ms=0, int end_ms=-1);
    bool stop();
    bool pause();
    bool topause();
    bool unpause();
    int milliseconds();
};
Mci::Mci()
{
    HINSTANCE hins = LoadLibraryA("winmm.dll");
    wmci=(w32mci)GetProcAddress(hins, "mciSendStringA");
    wmcierror = (w32mcierror)GetProcAddress(hins, "mciGetErrorStringA");
}
Mci::~Mci()
{
    FreeLibrary(hins);
}
bool Mci::send(string command)
{
    int errcode = wmci(command.c_str(), buf, 254, 0);
    if (errcode)
    {
        wmcierror(errcode, buf, 254);
        return false;
    }
    return true;
}
AudioClip::AudioClip() {}
AudioClip::~AudioClip()
{
    string cmd;
    cmd = "close " + alias;
    mci.send(cmd);
}
bool AudioClip::load(const string& _filename)
{
    filename = _filename;
    for (unsigned int i = 0; i < filename.length(); i++)
    {
        if (filename[i] == '/')
            filename[i] = '\\';
    }
    alias = "mp3_";
    srand(time(NULL));
    char randstr[6];
    _itoa(rand() % 65536, randstr, 10);
    alias.append(randstr);
    string cmd;
    cmd = "open " + filename + " alias " + alias;
    if (mci.send(cmd) == false)
        return false;
    cmd = "set " + alias + " time format milliseconds";
    if (mci.send(cmd) == false)
        return false;
    cmd = "status " + alias + " length";
    if (mci.send(cmd) == false)
        return false;
    length_ms = atoi(mci.buf);
    return true;
}
bool AudioClip::play(int start_ms , int end_ms)
{
    if (end_ms == -1) end_ms = length_ms;
    string cmd;
    char start_str[16], end_str[16];
    _itoa(start_ms, start_str,10);
    _itoa(end_ms, end_str, 10);
    cmd = "play " + alias+" from ";
    cmd.append(start_str);
    cmd.append(" to ");
    cmd.append(end_str);
    return mci.send(cmd);
}
bool AudioClip::stop()
{
    string cmd;
    cmd = "stop "+alias;
    if (mci.send(cmd) == false)
        return false;
    cmd = "seek " + alias + " to start";
    if (mci.send(cmd) == false)
        return false;
    return true;
}
bool AudioClip::pause()
{
    if(this->ispaused)
    {
        this->unpause();
    }else{
        this->topause();
    }
    this->ispaused = !this->ispaused;
} 
bool AudioClip::topause()
{
    string cmd;
    cmd = "pause " + alias;
    if (mci.send(cmd) == false)
        return false;
    return true;
}
bool AudioClip::unpause()
{
    string cmd;
    cmd = "resume " + alias;
    if (mci.send(cmd) == false)
        return false;
    return true;
}
int AudioClip::milliseconds()
{
    return length_ms;
}
void out(string s)
{
    for(int i = 0; i < s.size(); i++)
    {
        putchar(s[i]);
        Sleep(20);
    }
}
void loadMusic(AudioClip &ac)
{
    SetConsoleTitleA("MCI Audio Player");
    system("cls");
    cout << "    @    \n" <<
            "   @@@   \n" <<
            "  @@@@@  \n" <<
            " @@@@@@@ \n\n" << 
            " @@@@@@@" << endl;
    cout << endl;
    out("Please drag music file here or input the filename : ");
    string s;
    cout << flush;
    getline(cin, s);
    out("loading ");
    out(s);
    out("...");
    bool bSuccess = ac.load(s);
    cout << ".";
    Sleep(100);
    cout << ".." << endl;
    Sleep(600);
    if(!bSuccess)
    {
        Color(ErrorColor);
        cout << "Error in 'AudioClip.load(\"" << s << "\")' : Bad Filename.\n\tFunction : loadMusic(AudioClip &ac)" << endl;
        Color(NormalColor);
        system("pause");
        throw;
    }
    out("Success open music file ");
    out(s);
    out(".\n");
    Sleep(1000);
}
void playMusic(AudioClip &ac)
{
    system("cls");
    cout << "Loading...\n";
    Sleep(500);
    out("Changing title...\n");
    Sleep(250);
    SetConsoleTitleA(ac.getmusic().data());
    Sleep(250);
    system("cls");
    int len = ac.milliseconds(), lm = len / 1000 / 60, ls = len / 1000 % 60;
    cout << "music : " << ac.getmusic() << endl;
    printf("000:00/%03d:%02d ", lm, ls);
    Color(0x70);
    cout << "                                                  ";
    Color(NormalColor);
    printf(" -%03d:%02d\r", lm, ls);
    clock_t musicStart = clock(), n;
    ac.play(0, -1);
    while((n = (clock() - musicStart)) <= len)
    {
        //if()
        if(KEY_DOWN(VK_ESCAPE))
            return;
        if(KEY_DOWN(VK_SPACE))
        {
        //  printf("paused...                                                                         \r");
            ac.topause();
            Sleep(1000);
            while(!KEY_DOWN(VK_SPACE));
            Sleep(1000);
            ac.unpause();
            musicStart = clock() - n;
        }
        int _m = n / 1000 / 60, _s = n / 1000 % 60;
        printf("%03d:%02d/%03d:%02d ", _m, _s, lm, ls);
        int c = (int)((double)(n) / (double)(len) * 50.0);
        Color(StatusColor);
        for(int i = 0; i < c; i++)
        {
            putchar(' ');
        }
        Color(NowColor);
        if(c != 50) putchar(' ');
        Color(0x70);
        for(int i = c + 1; i < 50; i++)
        {
            putchar(' ');
        }
        Color(NormalColor);
        int rm = 0, rs = 0;
        rs = ls - _s;
        if(rs < 0)
        {
            rs += 60;
            rm --;
        }
        rm += lm - _m;
        printf(" -%03d:%02d\r", rm, rs);
    }
    out("\nStop...\nPress any key to continue...\nPress Esc to exit...");
    int _c = getch();
    if(_c == 27) exit(0);
}
int main(int argc, char** argv)
{
    SetConsoleTitle("MCI Audio Player");
    out("MCI Audio Player\n本软件版权归hdkghc (https://www.luogu.com.cn/user/346134)所有\n\t如何使用?\n\t\t暂停: 空格\n\t\t退出: Esc\n本软件支持将文件\n  拖到图标上播放\n\nP.S. 欢迎互关!                                                                               \n");
    system("color 07");
    AudioClip ac;
    if(argc == 2)
    {
        string s = "\"";
        s.append(argv[1]);
        s.append("\"");
        ac.load(s);
        playMusic(ac);
    }
    while(!KEY_DOWN(VK_ESCAPE))
    {
        loadMusic(ac);
        playMusic(ac);
    }
}

V1

#include<string>
#include<Windows.h>
#include<iostream>
#include<time.h>
#define NormalColor 0x07
#define ErrorColor FOREGROUND_RED
#define StatusColor FOREGROUND_BLUE | FOREGROUND_INTENSITY
#define Color(x) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x)
#define KEY_DOWN(VK_hdkghc) ((GetAsyncKeyState(VK_hdkghc) & 0x8000) ? 1:0) 
using namespace std;
typedef  int(__stdcall* w32mci)(const char*, char*, int,  int);
typedef int(__stdcall *  w32mcierror)(int, char*, int);
class Mci
{
private:
    HINSTANCE hins;
    w32mci wmci;
    w32mcierror wmcierror;
public:
    Mci();
    ~Mci();
    char buf[256];
    bool send(string command);//error  return false
};
class AudioClip
{
private:
    Mci mci;
    string filename;
    string alias;
    int length_ms;
public:
    bool ispaused;
    AudioClip();
    ~AudioClip();
    string getmusic()
    {
        return filename;
    }
    bool load(const  string& _filename);
    bool play(int start_ms=0, int end_ms=-1);
    bool stop();
    bool pause();
    bool topause();
    bool unpause();
    int milliseconds();
};
Mci::Mci()
{
    HINSTANCE hins = LoadLibraryA("winmm.dll");
    wmci=(w32mci)GetProcAddress(hins, "mciSendStringA");
    wmcierror = (w32mcierror)GetProcAddress(hins, "mciGetErrorStringA");
}
Mci::~Mci()
{
    FreeLibrary(hins);
}
bool Mci::send(string command)
{
    int errcode = wmci(command.c_str(), buf, 254, 0);
    if (errcode)
    {
        wmcierror(errcode, buf, 254);
        return false;
    }
    return true;
}
AudioClip::AudioClip() {}
AudioClip::~AudioClip()
{
    string cmd;
    cmd = "close " + alias;
    mci.send(cmd);
}
bool AudioClip::load(const string& _filename)
{
    filename = _filename;
    for (unsigned int i = 0; i < filename.length(); i++)
    {
        if (filename[i] == '/')
            filename[i] = '\\';
    }
    alias = "mp3_";
    srand(time(NULL));
    char randstr[6];
    _itoa(rand() % 65536, randstr, 10);
    alias.append(randstr);
    string cmd;
    cmd = "open " + filename + " alias " + alias;
    if (mci.send(cmd) == false)
        return false;
    cmd = "set " + alias + " time format milliseconds";
    if (mci.send(cmd) == false)
        return false;
    cmd = "status " + alias + " length";
    if (mci.send(cmd) == false)
        return false;
    length_ms = atoi(mci.buf);
    return true;
}
bool AudioClip::play(int start_ms , int end_ms)
{
    if (end_ms == -1) end_ms = length_ms;
    string cmd;
    char start_str[16], end_str[16];
    _itoa(start_ms, start_str,10);
    _itoa(end_ms, end_str, 10);
    cmd = "play " + alias+" from ";
    cmd.append(start_str);
    cmd.append(" to ");
    cmd.append(end_str);
    return mci.send(cmd);
}
bool AudioClip::stop()
{
    string cmd;
    cmd = "stop "+alias;
    if (mci.send(cmd) == false)
        return false;
    cmd = "seek " + alias + " to start";
    if (mci.send(cmd) == false)
        return false;
    return true;
}
bool AudioClip::pause()
{
    if(this->ispaused)
    {
        this->unpause();
    }else{
        this->topause();
    }
    this->ispaused = !this->ispaused;
} 
bool AudioClip::topause()
{
    string cmd;
    cmd = "pause " + alias;
    if (mci.send(cmd) == false)
        return false;
    return true;
}
bool AudioClip::unpause()
{
    string cmd;
    cmd = "resume " + alias;
    if (mci.send(cmd) == false)
        return false;
    return true;
}
int AudioClip::milliseconds()
{
    return length_ms;
}
void loadMusic(AudioClip &ac)
{
    SetConsoleTitleA("MCI Audio Player");
    system("cls");
    cout << "    @    \n" <<
            "   @@@   \n" <<
            "  @@@@@  \n" <<
            " @@@@@@@ \n\n" << 
            " @@@@@@@" << endl;
    cout << endl << "Please drag music file here or input the filename : ";
    string s;
    cout << flush;
    getline(cin, s);
    cout << "loading " << s << "...";
    bool bSuccess = ac.load(s);
    cout << ".";
    Sleep(100);
    cout << ".." << endl;
    Sleep(600);
    cout << "Success open music file " << s << "." << endl;
    if(!bSuccess)
    {
        Color(ErrorColor);
        cout << "Error in 'AudioClip.load(\"" << s << "\")' : Bad Filename.\n\tFunction : loadMusic(AudioClip &ac)" << endl;
        Color(NormalColor);
        system("pause");
        throw;
    }
    Sleep(1000);
}
void playMusic(AudioClip &ac)
{
    system("cls");
    cout << "Loading...\n";
    Sleep(500);
    cout << "Changing title...\n";
    Sleep(250);
    SetConsoleTitleA(ac.getmusic().data());
    Sleep(250);
    system("cls");
    int len = ac.milliseconds(), lm = len / 1000 / 60, ls = len / 1000 % 60;
    cout << "music : " << ac.getmusic() << endl;
    printf("000:00/%03d:%02d [                                                  ] -%03d:%02d\r", lm, ls, lm, ls);
    clock_t musicStart = clock(), n;
    ac.play(0, -1);
    while((n = (clock() - musicStart)) <= len)
    {
        //if()
        if(KEY_DOWN(VK_ESCAPE))
            return;
        if(KEY_DOWN(VK_SPACE))
        {
        //  printf("paused...                                                                         \r");
            ac.topause();
            Sleep(1000);
            while(!KEY_DOWN(VK_SPACE));
            Sleep(1000);
            ac.unpause();
            musicStart = clock() - n;
        }
        int _m = n / 1000 / 60, _s = n / 1000 % 60;
        printf("%03d:%02d/%03d:%02d [", _m, _s, lm, ls);
        int c = (int)((double)(n) / (double)(len) * 50.0);
        Color(0x70);
        for(int i = 0; i < c; i++)
        {
            putchar(' ');
        }
        Color(0x07);
        for(int i = c; i < 50; i++)
        {
            putchar(' ');
        }
        int rm = 0, rs = 0;
        rs = ls - _s;
        if(rs < 0)
        {
            rs += 60;
            rm --;
        }
        rm += lm - _m;
        printf("] -%03d:%02d\r", rm, rs);
    }
}
void out(string s)
{
    for(int i = 0; i < s.size(); i++)
    {
        putchar(s[i]);
        Sleep(20);
    }
}
int main(int argc, char** argv)
{
    SetConsoleTitle("MCI Audio Player");
    out("MCI Audio Player\n本软件版权归hdkghc (https://www.luogu.com.cn/user/346134)所有\n\t如何使用?\n\t\t暂停: 空格\n\t\t退出: Esc\n本软件支持将文件\n  拖到图标上播放\n\nP.S. 欢迎互关!                                                                               \n");
    system("color 07");
    AudioClip ac;
    if(argc == 2)
    {
        string s = "\"";
        s.append(argv[1]);
        s.append("\"");
        ac.load(s);
        playMusic(ac);
    }
    while(!KEY_DOWN(VK_ESCAPE))
    {
        loadMusic(ac);
        playMusic(ac);
    }
}