c++ - 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
无需查看以上内容(仅包括我的来源)。
程序运行的步骤列表:
- 打开 Wave Out 设备
- 分配 RAM 用于写入和读取
- 写入声卡:
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
解决方案
推荐阅读
- java - LayoutParams 上的 ClassCastException 从 LinearLayout 到 AbsListView
- python - 按 dtype 子集 pandas 数据帧
- mongodb - Mongo Express 码头工人
- android - 安卓上的 OpenCV,Mat.rows() = 0
- python - 如何在 python 中计算对数值以进行 PWM 控制的 LED 衰落?
- sql - SQL Oracle,选择删除文本并格式化日期
- automation - 如何将 weblogic 管理控制台参数复制到多个站点
- c# - C# .NET 应用程序的初始分发问题
- asp.net-core - RequiredIf 条件验证核心
- javascript - 根据文件扩展名覆盖 webpack 中捆绑的内容