使用windows API播放声音文件(wav、mp3)等
2015-05-31 20:02
771 查看
软件:
vs2010
工程:
控制台程序(空工程)
代码如下:
/*
mciSendCommand播放音乐,调用简单,功能强大,但是它只能同时播放一个
文件,而有的项目中需要同时播放几个文件,实现混音效果,这时就要使用
DirectSound或者其它库或技术了!
*/
#include <Windows.h>
#include <MMSystem.h>
#include <map>
#include <iostream>
using namespace std;
#pragma comment(lib, "WINMM.LIB")
void PlayBeep()
{
Beep(3000,500);
}
void PlaySysMusic()
{
MessageBeep(MB_OK);
Sleep(800);
MessageBeep(MB_ICONWARNING);
Sleep(800);
MessageBeep(MB_ICONSTOP);
Sleep(800);
MessageBeep(MB_ICONERROR);
Sleep(800);
MessageBeep(MB_ICONEXCLAMATION);
}
void PlayWavMusic()
{
PlaySound("GAME_WIN.W***",NULL/*AfxGetInstanceHandle()*/, SND_FILENAME|SND_ASYNC);
}
void PlayMp3Music_1()
{
mciSendString("open bg.mp3" , NULL, 0, 0);
mciSendString("play bg.mp3", NULL, 0, 0);
}
void PlayMp3Music_2()
{
MCI_OPEN_PARMS MciOpen;
MCI_PLAY_PARMS MciPlay;
MciOpen.lpstrElementName="ten minutes.mp3";
MciOpen.lpstrDeviceType=NULL;
mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&MciOpen);
UINT wDeviceID=MciOpen.wDeviceID;
mciSendCommand(wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)& MciPlay);
}
#define TIMER_MUSIC_STATE 100
MCI_OPEN_PARMS gMciOpen;
MCI_PLAY_PARMS gMciPlay;
MCI_STATUS_PARMS gStatus;
map<UINT_PTR,int> mapTimer;
void CheckMusicState()
{
//播放文件长度
gStatus.dwItem = MCI_STATUS_LENGTH;
mciSendCommand (gMciOpen.wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM,(DWORD)(LPVOID) &gStatus);
DWORD dwLen=gStatus.dwReturn;
//当前播放长度
gStatus.dwItem = MCI_STATUS_POSITION;
mciSendCommand (gMciOpen.wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM,(DWORD)(LPVOID) &gStatus);
DWORD dwCurLen=gStatus.dwReturn;
cout<<"文件长度: "<<dwLen<<",当前播放位置: "<<dwCurLen<<endl;
//循环播放
if(dwLen==dwCurLen)
{
mciSendCommand (gMciOpen.wDeviceID,MCI_SEEK,MCI_SEEK_TO_START, NULL);
mciSendCommand(gMciOpen.wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)& gMciPlay);
}
}
void CALLBACK TimerProc(HWND, UINT message, UINT_PTR idTimer, DWORD dwTime)
{
if(WM_TIMER==message)
{
switch(mapTimer[idTimer])
{
case TIMER_MUSIC_STATE:
CheckMusicState();
break;
default:
break;
}
}
}
void PlayMp3Music_3()
{
gMciOpen.lpstrElementName="ten minutes.mp3";
gMciOpen.lpstrDeviceType=NULL;
mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&gMciOpen);
mciSendCommand(gMciOpen.wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)& gMciPlay);
UINT_PTR timer=SetTimer(NULL,TIMER_MUSIC_STATE,1000,TimerProc);
mapTimer.insert(make_pair<UINT_PTR,int>(timer,TIMER_MUSIC_STATE));
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(msg.message==WM_TIMER)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
int main()
{
//播放蜂鸣器
//PlayBeep();
//播放系统声音(wav格式)
//PlaySysMusic();
//播放自己的wav格式的声音
//PlayWavMusic();
//播放MP3(当然wav也能播放)
//PlayMp3Music_1();
//播放MP3
//PlayMp3Music_2();
//播放MP3(循环播放、当前进度)
PlayMp3Music_3();
system("pause");
return 0;
}
vs2010
工程:
控制台程序(空工程)
代码如下:
/*
mciSendCommand播放音乐,调用简单,功能强大,但是它只能同时播放一个
文件,而有的项目中需要同时播放几个文件,实现混音效果,这时就要使用
DirectSound或者其它库或技术了!
*/
#include <Windows.h>
#include <MMSystem.h>
#include <map>
#include <iostream>
using namespace std;
#pragma comment(lib, "WINMM.LIB")
void PlayBeep()
{
Beep(3000,500);
}
void PlaySysMusic()
{
MessageBeep(MB_OK);
Sleep(800);
MessageBeep(MB_ICONWARNING);
Sleep(800);
MessageBeep(MB_ICONSTOP);
Sleep(800);
MessageBeep(MB_ICONERROR);
Sleep(800);
MessageBeep(MB_ICONEXCLAMATION);
}
void PlayWavMusic()
{
PlaySound("GAME_WIN.W***",NULL/*AfxGetInstanceHandle()*/, SND_FILENAME|SND_ASYNC);
}
void PlayMp3Music_1()
{
mciSendString("open bg.mp3" , NULL, 0, 0);
mciSendString("play bg.mp3", NULL, 0, 0);
}
void PlayMp3Music_2()
{
MCI_OPEN_PARMS MciOpen;
MCI_PLAY_PARMS MciPlay;
MciOpen.lpstrElementName="ten minutes.mp3";
MciOpen.lpstrDeviceType=NULL;
mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&MciOpen);
UINT wDeviceID=MciOpen.wDeviceID;
mciSendCommand(wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)& MciPlay);
}
#define TIMER_MUSIC_STATE 100
MCI_OPEN_PARMS gMciOpen;
MCI_PLAY_PARMS gMciPlay;
MCI_STATUS_PARMS gStatus;
map<UINT_PTR,int> mapTimer;
void CheckMusicState()
{
//播放文件长度
gStatus.dwItem = MCI_STATUS_LENGTH;
mciSendCommand (gMciOpen.wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM,(DWORD)(LPVOID) &gStatus);
DWORD dwLen=gStatus.dwReturn;
//当前播放长度
gStatus.dwItem = MCI_STATUS_POSITION;
mciSendCommand (gMciOpen.wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM,(DWORD)(LPVOID) &gStatus);
DWORD dwCurLen=gStatus.dwReturn;
cout<<"文件长度: "<<dwLen<<",当前播放位置: "<<dwCurLen<<endl;
//循环播放
if(dwLen==dwCurLen)
{
mciSendCommand (gMciOpen.wDeviceID,MCI_SEEK,MCI_SEEK_TO_START, NULL);
mciSendCommand(gMciOpen.wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)& gMciPlay);
}
}
void CALLBACK TimerProc(HWND, UINT message, UINT_PTR idTimer, DWORD dwTime)
{
if(WM_TIMER==message)
{
switch(mapTimer[idTimer])
{
case TIMER_MUSIC_STATE:
CheckMusicState();
break;
default:
break;
}
}
}
void PlayMp3Music_3()
{
gMciOpen.lpstrElementName="ten minutes.mp3";
gMciOpen.lpstrDeviceType=NULL;
mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&gMciOpen);
mciSendCommand(gMciOpen.wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)& gMciPlay);
UINT_PTR timer=SetTimer(NULL,TIMER_MUSIC_STATE,1000,TimerProc);
mapTimer.insert(make_pair<UINT_PTR,int>(timer,TIMER_MUSIC_STATE));
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(msg.message==WM_TIMER)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
int main()
{
//播放蜂鸣器
//PlayBeep();
//播放系统声音(wav格式)
//PlaySysMusic();
//播放自己的wav格式的声音
//PlayWavMusic();
//播放MP3(当然wav也能播放)
//PlayMp3Music_1();
//播放MP3
//PlayMp3Music_2();
//播放MP3(循环播放、当前进度)
PlayMp3Music_3();
system("pause");
return 0;
}
相关文章推荐
- 荷塘月色
- 2015Astar百度之星初赛 1001 超级赛亚ACMer
- 【操作系统总结】动态分区分配算法
- android 源码编译
- 理解Load Average做好压力测试
- 批量处理图片,同一格式
- URAL 1183.Brackets Sequence ( DP+记录路径)
- 为了情怀,各行各业引发离职潮,亮点看财务人的!!
- 黑马程序员_正则表达式总结
- Learning R笔记(一)
- Android自定义ProgressDialog
- 一个简单的Android音乐播放器
- C++之友元是什么东东
- mysql修改密码
- 提高第39课时,实践1,项目1-学生人数没个准
- Perl文件及目录操作
- C++成员函数指针详细使用指南
- 确定比赛名次
- maven 引入本地jar包
- 由表及里,对象逐层响应【冒泡】——JS总结