我在播放wav文件时遇到问题,该文件首先被读入BYTE数组并对其进行修改以降低其音量。我为实现此目的而编写的摘录来自各种Web来源。

但是,当我通过Visual Studio 2013社区运行程序时,效果很好。

但是,当进入以Release x64模式生成的可执行文件时,它给出了运行时错误,而且我听不到任何声音(也无法使用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);
}

最佳答案

由于ppFileBytes + 48,因此您不可以在p或更高版本中取消引用dwFileSize - 48
或者,换一种说法,pFileBytes指向dwFileSize字节的第一个字节,但是p指向dwFileSize - 48字节的第一个字节。

调整循环边界。

10-06 09:00