您的位置:首页 > 其它

使用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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: