#include <windows.h>
#include <fstream>
#include <iostream>
using namespace std;
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
static int GetFileLen(char* name);
//功能:播放wav音频文件
int PlayWave(char* filename, WAVEFORMATEX fmt)
{
DWORD wavesize = GetFileLen(filename);
if ( -1 == wavesize )
{
return -1;
}
FILE* fp = fopen(filename, "rb");
if ( NULL == fp )
{
return -1;
}
char* lpwavedata = NULL;
lpwavedata = new char[wavesize];
fread(lpwavedata, 1, wavesize, fp);
fclose(fp);
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
MMRESULT hr = MMSYSERR_NOERROR;
HWAVEOUT hWave;
hr = waveOutOpen(&hWave, WAVE_MAPPER, (LPWAVEFORMATEX)&fmt, (DWORD)hEvent, 0, CALLBACK_EVENT);
if ( MMSYSERR_NOERROR != hr )
{
printf("waveOutOpen error:[%d]\n", hr);
getchar();
return -1;
}
WAVEHDR whdr;
memset(&whdr, 0, sizeof(WAVEHDR));
whdr.lpData = lpwavedata;
whdr.dwBufferLength = wavesize;
hr = waveOutPrepareHeader(hWave, &whdr, sizeof(WAVEHDR));
if ( MMSYSERR_NOERROR != hr )
{
printf("waveOutPrepareHeader error:[%d]\n", hr);
getchar();
return -1;
}
//设置输出音量
hr = waveOutSetVolume(hWave, 0xFFFF); // 0xFFFF为最大有效值
if ( MMSYSERR_NOERROR != hr )
{
printf("waveOutSetVolume error:[%d]\n", hr);
getchar();
return -1;
}
//输出音频
hr = waveOutWrite(hWave, &whdr, sizeof(WAVEHDR));
if ( MMSYSERR_NOERROR != hr )
{
printf("waveOutWrite error:[%d]\n", hr);
getchar();
return -1;
}
printf("正在播放音乐...\n");
//等待播放完成
ResetEvent(hEvent);
WaitForSingleObject(hEvent, INFINITE);
printf("播放结束\n");
//收尾工作
waveOutUnprepareHeader(hWave, &whdr, sizeof(WAVEHDR));
waveOutClose(hWave);
CloseHandle(hEvent);
delete[] lpwavedata;
lpwavedata = NULL;
return 0;
}
//功能:获取文件长度(单位:字节)
static int GetFileLen(char* name)
{
int beg_pos = 0;
int end_pos = 0;
ifstream file(name);
if ( !file.is_open() )
{
return -1;
}
beg_pos = file.tellg();
file.seekg(0, ios::end);
end_pos = file.tellg();
file.close();
return (end_pos - beg_pos);
}
//主函数
int main(void)
{
char szWavFile[] = ".\\demo.wav";
//todo:从wav文件中提取以下信息
WAVEFORMATEX fmt;
fmt.wFormatTag = WAVE_FORMAT_PCM;
fmt.nChannels = 2;
fmt.nSamplesPerSec = 44100;
fmt.nAvgBytesPerSec = 176400;
fmt.nBlockAlign = 4;
fmt.wBitsPerSample = 16;
fmt.cbSize = 0;
PlayWave(szWavFile, fmt);
return 0;
}
附上wav文件格式: