C++ 实现 WAV 与 MP3 音频播放功能
在 MFC 桌面应用开发中,语音提示是提升用户体验的常见需求。最近项目中需要支持多种音频格式(WAV 和 MP3)的播放,同时要保证线程安全。这里分享一下我封装的一个 CPlayAudio 类的实现思路。
核心设计思路
为了保证单例模式下的线程安全,我们引入了互斥锁 (CMutex)。播放逻辑根据文件后缀区分处理:
- WAV 文件:直接使用 Windows API
PlaySound,简单高效。 - MP3 文件:由于
PlaySound对 MP3 支持有限,这里采用 MCI (Media Control Interface) 接口进行控制,包括打开、播放和关闭设备。
此外,为了便于调用,定义了一个宏 PLAYAUDIO,直接传入文件名即可触发播放。
文件选择功能
如果需要用户手动选择音频文件,可以使用 MFC 的文件对话框。下面这个函数演示了如何获取文件路径并转换为字符串:
void PlayAudio::GetDataPath(string path, string& lsFile) {
CFileDialog dlg(TRUE, _T("*.mp3"), NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ENABLESIZING,
_T("报警音频 (*.mp3)|*.mp3||"), NULL);
dlg.m_ofn.lpstrTitle = "选择报警音频文件";
string strpath = path;
dlg.m_ofn.lpstrInitialDir = strpath.c_str();
// 显示文件对话框,获得文件名集合
if (dlg.DoModal() != IDOK)
return;
lsFile = StringAbout::toString(dlg.GetPathName());
}
类源代码实现
头文件 PlayAudio.h
#pragma once
#include <string>
#include "afxmt.h"
using namespace std;
# PLAYAUDIO CPlayAudio::GetInstance()->OpenAudio
{
:
();
~();
:
std::string m_audiopath;
std::string m_modulepath;
num;
:
CPlayAudio *m_play;
CMutex *m_mutex;
:
;
:
;
;
;
};

