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);
}
}