⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playwav.cpp

📁 用EVC编写的添加背景音乐程序,其中还有线程的创建和终止,很好的学习示例
💻 CPP
字号:
// PlayWav.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "WaveFile.h"

MMRESULT PlayWave(LPCTSTR szWaveFile);

#define MYFILE TEXT("Banana.wav")
#define MAX_ERRMSG 256

int WINAPI WinMain(	HINSTANCE hInstance,
					HINSTANCE hPrevInstance,
					LPTSTR    lpCmdLine,
					int       nCmdShow)
{
	TCHAR szWavFile[MAX_PATH];
	TCHAR szErrMsg[MAX_ERRMSG];
	MMRESULT mmres;

	SHGetSpecialFolderPath(NULL, szWavFile, CSIDL_PERSONAL, FALSE);
	_tcscat(szWavFile, TEXT("\\"));
	_tcscat(szWavFile, MYFILE);
	
	while (true)
	{
		mmres = PlayWave(szWavFile);
		if (mmres != MMSYSERR_NOERROR) {
			waveOutGetErrorText(mmres, (LPTSTR) szErrMsg, 256);
			MessageBox(NULL, szErrMsg, TEXT("WaveOut Error"), MB_OK);
		}
	}
	return 0;
}

MMRESULT PlayWave(LPCTSTR szWavFile)
{

	HWAVEOUT hwo;
	WAVEHDR whdr;
	MMRESULT mmres;
	CWaveFile waveFile;
	HANDLE hDoneEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("DONE_EVENT"));
	UINT devId;
	DWORD dwOldVolume;

	// Open wave file
	if (!waveFile.Open(szWavFile)) {
		TCHAR szErrMsg[MAX_ERRMSG];
		_stprintf(szErrMsg,
			TEXT("Unable to open file: %s\n\n")
			TEXT("Did you put %s in the \\My Documents directory?"),
			szWavFile, MYFILE);
		MessageBox(NULL, szErrMsg, TEXT("File I/O Error"), MB_OK);
		return MMSYSERR_NOERROR;
	}

	// Open audio device
	for (devId = 0; devId < waveOutGetNumDevs(); devId++) {
		mmres = waveOutOpen(&hwo, devId, waveFile.GetWaveFormat(), (DWORD)hDoneEvent,
			0, CALLBACK_EVENT);
		if (mmres == MMSYSERR_NOERROR) {
			break;
		}
	}
	if (mmres != MMSYSERR_NOERROR) {
		return mmres;
	}

	// Set volume
	mmres = waveOutGetVolume(hwo, &dwOldVolume);
	if (mmres != MMSYSERR_NOERROR) {
		return mmres;
	}

	waveOutSetVolume(hwo, 0xFFFFFFFF);
	if (mmres != MMSYSERR_NOERROR) {
		return mmres;
	}

	// Initialize wave header
	ZeroMemory(&whdr, sizeof(WAVEHDR));
	whdr.lpData = new char[waveFile.GetLength()];
	whdr.dwBufferLength = waveFile.GetLength();
	whdr.dwUser = 0;
	whdr.dwFlags = 0;
	whdr.dwLoops = 0;
	whdr.dwBytesRecorded = 0;
	whdr.lpNext = 0;
	whdr.reserved = 0;

	// Play buffer
	waveFile.Read(whdr.lpData, whdr.dwBufferLength);

	mmres = waveOutPrepareHeader(hwo, &whdr, sizeof(WAVEHDR));	
	if (mmres != MMSYSERR_NOERROR) {
		return mmres;
	}

	mmres = waveOutWrite(hwo, &whdr, sizeof(WAVEHDR));	
	if (mmres != MMSYSERR_NOERROR) {
		return mmres;
	}

	// Wait for audio to finish playing
	while (!(whdr.dwFlags & WHDR_DONE)) {
		WaitForSingleObject(hDoneEvent, INFINITE);
	}

	// Clean up
	mmres = waveOutUnprepareHeader(hwo, &whdr, sizeof(WAVEHDR));	
	if (mmres != MMSYSERR_NOERROR) {
		return mmres;
	}

	waveOutSetVolume(hwo, dwOldVolume);
	if (mmres != MMSYSERR_NOERROR) {
		return mmres;
	}

	mmres = waveOutClose(hwo);
	if (mmres != MMSYSERR_NOERROR) {
		return mmres;
	}

	delete [] whdr.lpData;
	waveFile.Close();

	return MMSYSERR_NOERROR;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -