#include <windows.h> #include <mmsystem.h> #pragma comment(lib, "winmm.lib") #include <fstream> #include <iostream> using namespace std; //功能:获取文件长度(单位:字节) int getFileLen(char* name) { int beg_pos,end_pos; 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); } //功能:播放wav音频文件 int playWave(char* filename) { //--------读取声音文件数据,写入到指定缓冲区-------- char* lpwavedata=NULL; DWORD wavesize = getFileLen(filename); if ( wavesize == -1 ) { cout<<"error_1"<<endl; return -1; } lpwavedata = new char[wavesize]; FILE* fp=NULL; fp = fopen(filename, "rb"); if ( fp==NULL ) { cout<<"error_2"<<endl; return -1; } fread(lpwavedata, wavesize, 1, fp); fclose(fp); //-------------------------------------------------- //--------用底层设备接口函数回放声音---------------- HWAVEOUT hWave; //PCM、通道数、采样频率、每秒数据量(字节)、采样帧大小、采样位 PCMWAVEFORMAT fmt = { {WAVE_FORMAT_PCM, 2, 44100, 2*2*44100, 4}, 16 }; HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //打开音频设备 waveOutOpen(&hWave, WAVE_MAPPER, (LPWAVEFORMATEX)&fmt, (DWORD)hEvent, 0, CALLBACK_EVENT); //准备数据 WAVEHDR whdr; memset(&whdr, 0, sizeof(WAVEHDR)); whdr.lpData = lpwavedata; whdr.dwBufferLength = wavesize; waveOutPrepareHeader(hWave, &whdr, sizeof(WAVEHDR)); //输出 waveOutWrite(hWave, &whdr, sizeof(WAVEHDR)); //等待回放完毕 WaitForSingleObject(hEvent, INFINITE); //取消准备 waveOutUnprepareHeader(hWave, &whdr, sizeof(WAVEHDR)); //关闭设备 waveOutClose(hWave); WaitForSingleObject(hEvent, INFINITE); CloseHandle(hEvent); //-------------------------------------------------- delete[] lpwavedata; return 0; } int main(void) { playWave("xxx.wav"); return 0; }