使用windows API播放声音文件(wav、mp3)等

来源:互联网 发布:国外用什么网络 编辑:程序博客网 时间:2024/04/28 05:34

软件:

     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.WAV",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;
}

0 0