c++ - 使用 SND_MEMORY 在 PlaySound 中播放受控的音量级别

标签 c++ audio wav volume playsound

我在播放 wav 文件时遇到问题,该文件首先读入 BYTE 数组并修改它以降低其音量级别。我为实现它而制作的片段取自各种网络资源。

但是,当我通过 Visual Studio 2013 Community 运行该程序时,它运行良好。

但是当进入以 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,因此您不能在 dwFileSize - 48 处取消引用 p或超越。
或者,换句话说,pFileBytes 指向第一个 dwFileSize 个字节,但是 p 指向第一个 dwFileSize - 48 字节。

调整循环边界。

关于c++ - 使用 SND_MEMORY 在 PlaySound 中播放受控的音量级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48162086/

相关文章:

linux - 在 Red Hat 上的 Firefox 中播放 wav 文件

c# - 在 C# 中将 DirectSound CaptureBuffer 的内容写入 WAV 文件

java - 输出的 wav 文件大小比原始文件大几倍

c# - 在第一个 wav 结束之前在 NAudio 中加入两个 wav 文件

c++ - 在 C++ 中组织平台特定代码的推荐方法是什么?

iphone - 您如何循环播放iPhone的声音?

android - Android 中的 Unity3D 音频延迟

c++ - 解密不适用于已保存的图像,但适用于图像的像素操作矩阵

c++ - 字符串 argv[] 重定义错误 C++

c++ - g++ 关于声明多维双数组的警告