使用 SND_MEMORY 在 PlaySound 中播放受控的音量级别
Play manipulated volume levels in PlaySound with SND_MEMORY
我在播放 wav 文件时遇到问题,该文件首先读入 BYTE 数组并修改它以降低其音量级别。我为实现它而制作的片段取自各种网络资源。
然而,当我通过 Visual Studio 2013 社区 运行 程序时,它运行良好。
但是当进入以 Release x64 模式生成的可执行文件时,它给出了一个 运行time 错误并且我听不到任何声音(也无法使用 try-catch 捕获)。
我希望我的可执行文件能够工作,但只有当我注释掉该行时它才能工作 --> p[i] = (__int8)((float)p[i] * fVolume); <-- ,这实际上是在做操纵音量的工作。
我无法理解为什么 exe 不工作,Visual Studio 可以轻松地 运行 它在 Release x64 模式下。
正在处理的 WAV 文件:https://drive.google.com/file/d/1i3DACTJxRCQQqRKBK_XL4msuw5p__kXg/view?usp=sharing
我正在使用的函数调用:PlaySound_Volume("right_10.wav", 0.235);
感谢您的关注!
void PlaySound_Volume(string fname, float fVolume = 1, bool async = false){
DWORD dwFileSize;
BYTE* pFileBytes;
ifstream f(fname, ios::binary);
f.seekg(0, ios::end);
int lim = f.tellg();
dwFileSize = lim;
pFileBytes = new BYTE[lim];
f.seekg(0, ios::beg);
f.read((char *)pFileBytes, lim);
f.close();
BYTE* pDataOffset = (pFileBytes + 40);
__int8 * p = (__int8 *)(pDataOffset + 8);
for (int i = 80 / sizeof(*p); i < dwFileSize / sizeof(*p); i++){
// COMMENT FOLLOWING LINE
p[i] = (__int8)((float)p[i] * fVolume);
}
if (async)
PlaySound((LPCSTR)pFileBytes, NULL, SND_MEMORY | SND_ASYNC);
else
PlaySound((LPCSTR)pFileBytes, NULL, SND_MEMORY);
}
由于 p
是 pFileBytes + 48
,您不能在 dwFileSize - 48
或以后取消引用 p
。
或者,换句话说,pFileBytes
指向第一个 dwFileSize
字节,但 p
指向第一个 dwFileSize - 48
字节。
调整循环边界。
我在播放 wav 文件时遇到问题,该文件首先读入 BYTE 数组并修改它以降低其音量级别。我为实现它而制作的片段取自各种网络资源。
然而,当我通过 Visual Studio 2013 社区 运行 程序时,它运行良好。
但是当进入以 Release x64 模式生成的可执行文件时,它给出了一个 运行time 错误并且我听不到任何声音(也无法使用 try-catch 捕获)。
我希望我的可执行文件能够工作,但只有当我注释掉该行时它才能工作 --> p[i] = (__int8)((float)p[i] * fVolume); <-- ,这实际上是在做操纵音量的工作。
我无法理解为什么 exe 不工作,Visual Studio 可以轻松地 运行 它在 Release x64 模式下。
正在处理的 WAV 文件:https://drive.google.com/file/d/1i3DACTJxRCQQqRKBK_XL4msuw5p__kXg/view?usp=sharing 我正在使用的函数调用:PlaySound_Volume("right_10.wav", 0.235);
感谢您的关注!
void PlaySound_Volume(string fname, float fVolume = 1, bool async = false){
DWORD dwFileSize;
BYTE* pFileBytes;
ifstream f(fname, ios::binary);
f.seekg(0, ios::end);
int lim = f.tellg();
dwFileSize = lim;
pFileBytes = new BYTE[lim];
f.seekg(0, ios::beg);
f.read((char *)pFileBytes, lim);
f.close();
BYTE* pDataOffset = (pFileBytes + 40);
__int8 * p = (__int8 *)(pDataOffset + 8);
for (int i = 80 / sizeof(*p); i < dwFileSize / sizeof(*p); i++){
// COMMENT FOLLOWING LINE
p[i] = (__int8)((float)p[i] * fVolume);
}
if (async)
PlaySound((LPCSTR)pFileBytes, NULL, SND_MEMORY | SND_ASYNC);
else
PlaySound((LPCSTR)pFileBytes, NULL, SND_MEMORY);
}
由于 p
是 pFileBytes + 48
,您不能在 dwFileSize - 48
或以后取消引用 p
。
或者,换句话说,pFileBytes
指向第一个 dwFileSize
字节,但 p
指向第一个 dwFileSize - 48
字节。
调整循环边界。