首页 > 解决方案 > C++ WaveOut API 模糊测试声音

问题描述

我以前从未使用过 WaveOut API,但我非常坚定地这样做;我有一个程序可以成功打开一个带有程序的设备并从 RAM 写入声卡数据。我遇到的问题是以正确的方式成功地用信息填充 RAM。为了做到这一点,我一直在查看来自多个不同地方的源代码并对其进行分析:

https://github.com/OneLoneCoder/synth
https://gist.github.com/seungin/4779216eada24a5077ca1c5e857239ce
https://github.com/HackerPoet/FractalSoundExplorer/blob/main/WinAudio.h

无需查看以上内容(仅包括我的来源)。
程序运行的步骤列表:

  1. 打开 Wave Out 设备
  2. 分配 RAM 用于写入和读取
  3. 写入声卡:
    1)。如有必要,取消准备标题,
    2)。准备标题,
    3)。填充 RAM,
    4)。写作。

我遇到这个问题的地方正是结果。每次写入时声音都会“模糊”,它仍然会播放声音,除了以一种非常奇怪的方式;振幅关闭,频率,我发现这个方程“sin(440 * 2.0 * 3.14159 * Time)”用于产生中间'A'音符。除了在结果中它的音量非常低,我必须将它乘以“1000”才能听到任何合适的音量以及输出中的“440hz”听起来不正确的事实。我尝试输入一个实心整数:'1000' 低音量模糊测试仍然发生。

再次
我真的不知道我在做什么太多;我大部分时间都在分析代码并将零碎的部分放在一起。在声波方面我不是专家,我最好的猜测是它可能是滞后的,但我相信事实并非如此:我在 RAM 中使用单个缓冲区/块运行程序并禁用了我所有的调试代码,并且问题仍然适用。

感谢大家提供的任何帮助!请耐心等待,如果您需要,我将在下面链接我的一些源代码,请询问。

主文件


DOUBLE M_Sound(DOUBLE Time)
{
    DOUBLE D_Output = sin(440 * 2.0 * 3.14159 * Time);
    return D_Output * 1000;
}

INT main()
{
    SOUND<INT16> Sound(512, 5, 44100);
    Sound.Set(&Sound);
    Sound.Function(M_Sound);
    Sound.Open();
    while (1)
    {

    }
    return 0;
}

格式

        S_Format.wFormatTag         = WAVE_FORMAT_PCM;
        S_Format.cbSize             = 0;
        S_Format.nChannels          = 1;
        S_Format.nSamplesPerSec     = D_SampleRate;    // 44100
        S_Format.wBitsPerSample     = sizeof(Buffer) * 8;         
        S_Format.nBlockAlign        = (S_Format.wBitsPerSample / 8) * S_Format.nChannels;
        S_Format.nAvgBytesPerSec    = D_SampleRate;    // 44100

waveOutOpen

waveOutOpen(&H_Waveout, WAVE_MAPPER, &S_Format, (DWORD_PTR)Procedure, NULL, CALLBACK_FUNCTION)

分配

    for (UINT Index = 0; Index < U_BufferCount; Index++)
    {
        H_WaveHeaders[Index].dwBufferLength = U_BufferSize * sizeof(Buffer);
        H_WaveHeaders[Index].lpData         = (LPSTR)(P_BufferMemory + (Index * U_BufferSize));
        H_WaveHeaders[Index].dwFlags        = 0;
    }

写作

    for (UINT Index = 0; Index < U_BufferSize; Index++)
    {
        P_BufferMemory[(U_BufferCurrent * U_BufferSize) + Index] = (Buffer)M_Function(U_Time);
    }
    waveOutWrite(H_Waveout, &H_WaveHeaders[U_BufferCurrent], sizeof(WAVEHDR)

Function 'M_Function' // 这是填充块时调用的函数;

DOUBLE M_Sound(DOUBLE Time)
{
    DOUBLE D_Output = sin(440 * 2.0 * 3.14159 * Time);
    return D_Output * 1000;
}

声音的链接(对不起,它是视频格式)

https://cdn.discordapp.com/attachments/629290713976406031/899972389482418176/2021-10-19_20-47-16.mp4

标签: c++audiowinmmwaveout

解决方案


推荐阅读