PlaySound() mmslib 不播放现有声音
Posted
技术标签:
【中文标题】PlaySound() mmslib 不播放现有声音【英文标题】:PlaySound() mmslib does not play existing sound 【发布时间】:2011-07-26 00:21:20 【问题描述】:编辑:已解决。只是 .wav 文件不被 Windows 接受。我提取了一个 Windows 自己的文件并将其重命名为我以前的文件,它可以正常播放。
我不知道为什么这不能播放现有文件。 Windows 提示出现问题,但我不知道是什么。
我之前添加了一个检查以确保它存在。我也试过绝对路径。
string wavPath = "c:\\frog.wav";
struct stat stFileInfo;
bool blnReturn = (stat(wavPath.c_str(), &stFileInfo) == 0); //this returns true
FILE* fp = fopen(wavPath.c_str(), "r");
if (fp)
fclose(fp); //this triggers
PlaySound(wavPath.c_str(), NULL, SND_FILENAME | SND_ASYNC); //m_hinstance
//C:\\Users\\Wollan\\My Code\\A\\Debug\\frog.wav
//TEXT("frog.wav")
//TEXT(wavPath.c_str())
//(LPCSTR)"frog.wav¨
文件在 WMP 中可以正常播放。
【问题讨论】:
查看PlaySound
的返回值。检查环境的错误状态。通过调试器运行代码。进行一些调试。
不要使用相对路径。使用绝对路径,确保将相同的路径传递给 stat() 和 PlaySound()。
当然也尝试过具有相同值的相对路径。 “C:\\frog.wav”。文件存在但无法播放,只有 Windows 错误提示音。
@Wollan:"C:\\Users\\Wollan\\My Code\\A\\Debug\\frog.wav"
还是 "C:\\frog.wav"
?选择一个。
不起作用。文件存在检查是,但它没有播放。
【参考方案1】:
以下代码完美运行:
PlaySound(L"C:\\Windows\\Media\\Cityscape\\Windows Balloon.wav", 0, SND_FILENAME );
添加SND_ASYNC
播放失败。
【讨论】:
巴里克?仍然是 Windows 将其投射到(LPCSTR)。仅使用 L 我得到:-无法将参数 1 从 'const wchar_t [12]' 转换为 'LPCSTR'- 我现在要查看其他 wav 文件,似乎现在应该已经播放了。 Unicode 或 ANSI 字符串不是问题。只需传递文件名而不使用SND_ASYNC
,看看它是否可以播放。
我第一次在那里做了,没用。无论如何,问题一直是一个坏文件(参见 OP)。【参考方案2】:
The documentation 说:
pszSound 参数是一个文件名。如果找不到文件, 该函数播放默认声音,除非 SND_NODEFAULT 标志为 设置。
还有:
PlaySound 在以下目录中搜索声音文件: 当前目录; Windows 目录;视窗系统 目录; PATH 环境变量中列出的目录;和 在网络中映射的目录列表。如果函数不能 找到指定的声音并且未指定 SND_NODEFAULT 标志, PlaySound 使用默认的系统事件声音。
没有为此结果指定其他情况。
因此,您听到提示音表示未找到文件,尽管您做出相反的保证。
我会仔细检查stat
调用的结果;我什至在文档中都找不到stat
;它似乎不是 Windows 的一部分。
【讨论】:
【参考方案3】:PlaySound(L"C:\Windows\Media\Cityscape\Windows Balloon.wav", 0, SND_FILENAME ); 添加 SND_ASYNC 无法播放。 这个答案是对的! 这是因为 ASYNC 模式在函数返回后播放音乐。 您的代码可能在音乐播放之前已经退出。 使用 int x, cin>>x,在 PlaySound 函数之后,你会发现效果很好。
【讨论】:
以上是关于PlaySound() mmslib 不播放现有声音的主要内容,如果未能解决你的问题,请参考以下文章