// 非同步播放,找不到檔案時播放系統預設聲音
sndPlaySound(_T("C:\\Sound\\music.wav"), SND_ASYNC);
// 非同步播放,找不到檔案時靜默(不播放預設聲音)
PlaySound(_T("C:\\Sound\\music.wav"), NULL, SND_ASYNC | SND_NODEFAULT);
參數說明:SND_ASYNC 非同步、SND_NODEFAULT 不用預設聲音、SND_LOOP 循環播放。
資源檢視 → 右鍵「匯入」→ 選取 .wav 檔 → 類型輸入 WAVE → 資源 ID 如 IDR_WAVE1。
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), AfxGetResourceHandle(),
SND_ASYNC | SND_RESOURCE | SND_NODEFAULT | SND_LOOP);
HMODULE hMod = AfxGetResourceHandle();
HRSRC hRes = FindResource(hMod, MAKEINTRESOURCE(IDR_WAVE1), _T("WAVE"));
HGLOBAL hGlob = LoadResource(hMod, hRes);
LPCTSTR pData = (LPCTSTR)LockResource(hGlob);
sndPlaySound(pData, SND_MEMORY | SND_ASYNC);
FreeResource(hGlob);
適用於需混音、特效、串流等進階場景。核心流程:
mmioOpen 開啟 RIFF/WAVE 檔fmt 區塊取得 WAVEFORMATEX 格式data 區塊讀取原始 PCM 資料waveOutOpen 開啟輸出裝置waveOutPrepareHeader/waveOutWrite 送出緩衝區waveOutReset/waveOutClose 釋放WAVEFORMATEX:採樣率、位深、聲道數等格式描述WAVEHDR:緩衝區指標、長度、旗標MMCKINFO:RIFF 區塊資訊HMMIO hmmio = mmioOpen(szFile, NULL, MMIO_READ | MMIO_ALLOCBUF);
// ... 尋找 fmt chunk -> 讀取 WAVEFORMATEX ...
// ... 尋找 data chunk -> 讀取波形資料到 lpData ...
HWAVEOUT hWaveOut;
waveOutOpen(&hWaveOut, WAVE_MAPPER, lpFormat, 0, 0, CALLBACK_NULL);
WAVEHDR hdr = { (LPSTR)lpData, dwDataSize, 0, 0, 0, 0, 0, 0 };
waveOutPrepareHeader(hWaveOut, &hdr, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, &hdr, sizeof(WAVEHDR));
// 等待播放完成(可用事件或輪詢 WHDR_DONE)
waveOutUnprepareHeader(hWaveOut, &hdr, sizeof(WAVEHDR));
waveOutClose(hWaveOut);
#include <mmsystem.h>winmm.lib(專案屬性 → 連結器 → 輸入 → 附加相依性)| 場景 | 推薦方法 |
|---|---|
| 簡單提示音、按鍵音 | 方法一 |
| 隨程式發布、無外部檔案 | 方法二 |
| 音訊編輯、視覺化、多聲道混音 | 方法三 |