#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <mmsystem.h>
#include <iostream>
#include <iomanip>
#include <vector>
#include <fstream>
class MP3
{
public:
MCI_OPEN_PARMS mciOpen; // 一个结构体,用来存储打开音频文件后的一些信息
MCIERROR open(const *pFilename)
{ UINT wDeviceID; // 音频文件标识,打开音频文件后需要保存这个标识,以便可以进行其他操作,UINT是unsigned int
mciOpen.lpstrDeviceType = NULL; // 指示打开的文件是哪一种类型,NULL表示由打开的文件自动判断
mciOpen.lpstrElementName = pFilename; // 即将播放的音频文件
return mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD_PTR)&mciOpen); // 打开音频文件
}
void play()
{
printf("开始播放...\n");
MCI_PLAY_PARMS mciPlay; // 一个结构体,用来存放播放音频时的信息
mciSendCommand(mciOpen.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD_PTR)&mciPlay); // 播放音频文件
// 获取音频总时间
MCI_STATUS_PARMS mciStatus; // 一个结构体,用来存放播放时的参数信息
mciStatus.dwItem = MCI_STATUS_LENGTH; // 获取音频总时间的参数标志
mciSendCommand(mciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD_PTR)(LPVOID)&mciStatus); // 获取参数
DWORD music_alltime = mciStatus.dwReturn / 1000; //音乐总时间
// 循环显示播放时间
while (1)
{
// 获取音频播放的当前时间
//MCI_STATUS_PARMS mciStatus;
mciStatus.dwItem = MCI_STATUS_POSITION; // 获取音频当前时间的参数标志
mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD_PTR)(LPVOID)&mciStatus); // 获取参数
DWORD music_timeing = mciStatus.dwReturn / 1000; //音乐当前播放时间
// 显示
printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); // 用20个回退键清除同一行的显示
printf("Time:%ld:%02ld-%ld:%02ld", music_timeing / 60, music_timeing % 60, music_alltime / 60, music_alltime % 60); // 显示当前时间和总时间
if (music_timeing >= music_alltime )|| kbhit())// 当当前时间达到总时间或有键按下即退出循环
{
while (kbhit()) getch(); // 清除按键信息
break; // 退出循环
}
Sleep(50); // 延迟50毫秒,让CPU休息一下
}
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0); // 关闭音频文件
}
};
class MyFile()
{
private:
vector<string>mylist;
public:
void find(const char *path,const char *name)
{
char szFind[MAX_PATH],szFile[MAX_PATH];
WIN32_FIND_DATA fd;
sprintf(szFind,"%s\\%s",path,name);
HANDLE hFind=FindFirstFile(szFind,&fd);
if(INVALID_HANDLE_VALUE!=hFind)
{ int num=0;
while(1)
{ printf("\n%s\\%s\n",path,fd.cFileName);
num++;
if(!FindNextFile(hFind,&fd))
break;
}
FindClose(hFind);
}
}
void display()
{
int i=1;
for(vector<string>::iterator it=mylist.begin();it!=mylist.end();++it)
{
cout<<"("<<i++<<")"<<*it<<endl;
}
}
string get (int i)
{
return mylist[i];
}
};
int main()
{
string spath;
cout<<"请输入路径;";
getline(cin,spath);
MyFile myfile;
myfile.find(spath.c_str(),"*.mp3");
while(1)
{
int n;
myfile.display();
cout<<"请输入序号(输入0结束)";
cin>>n;
if(n==0) break;
MP3 mp3;
if(mp3.open((spath+"\\"+myfile.get(n-1)).c_str())==0)
{
cout<<"开始播放["+myfile.get(n-1)+"]..."<<endl;
mp3.play();
cout<<endl;
}
printf("\n结束\n");
return 0;
}