问题标签 [waveout]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
286 浏览

c++ - waveOut 合成器性能不佳

我对声音合成做了一些研究,并设法编写了一个非常简单的合成器。我使用了 microsoft waveOut API。我写了一个界面来简化整个过程。我现在可以初始化(单声道)音频流并调用 setSample。因此,对于每秒 44100 个样本的采样率,setSample 需要每秒至少调用 44100 次。

这在我的(四核)笔记本电脑上运行良好,但在我父母的旧双核 vista 上,它非常糟糕。这很奇怪:FL Studio 在我父母的机器上运行得非常顺利,即使我在更复杂的合成器上使用多种效果,而我的代码相当基本。

我不知道是什么导致了这种行为。我的代码远未优化,但非常简单,以至于我几乎无法想象单独优化是问题所在(除非我正在做的事情确实会减慢合成速度)。

可能有问题的代码段:

我认为从浮点值到离散样本的转换可能很麻烦。我用它来处理多个样本大小。

我还听说 waveOut 可能是软件模拟的(这可以解释很多),但我不确定是否(或何时,如在什么版本的 Windows 或在什么情况下)是这种情况以及性能有多大这会有所不同。

我希望有一个人可以帮助我。

编辑:源代码可以在这里找到,可执行在这里

0 投票
1 回答
316 浏览

c++ - 在 C++ 中在 Windows 中播放样本缓冲区的最常见方法是什么?

我正在开发一个跨平台的音频编辑器 (C++),它具有特定于平台的AudioDevice类实现。此类从内存缓冲区播放声音。主要操作系统是 Linux,但有时我也会关注 windows 端口。

当前的 Windows 实现使用waveOutOpen(), waveOutPrepareHeader(),waveOutWrite()接口,我认为它已被弃用(我不知道究竟为什么)。但最重要的是,这个界面仍然在 Windows 7 中得到支持和工作,我看不出微软会杀死它的理由。

无论如何,我应该转移到另一个更好的界面吗?

0 投票
2 回答
1711 浏览

c++ - waveOutWrite 缓冲区永远不会返回给应用程序

我对 Microsoft 的 WaveOut API 有疑问:

编辑1:添加到示例项目的链接:编辑2:删除链接,它不代表问题

播放一些音频后,当我想终止给定的播放流时,我调用该函数:

然而,即使在调用了 waveOutClose() 之后,有时库仍然会访问之前由 waveOutWrite() 传递给它的内存,从而导致无效的内存访问。

然后,我尝试确保在释放缓冲区之前将所有缓冲区标记为已完成:

但是,这种情况永远不会发生 - 缓冲区永远不会变空。wavehdr_.dwFlags == 18 将剩余 4-5 个块(我相信这意味着这些块仍被标记为正在播放)

我该如何解决这个问题?

@ Martin Schlott(“你能提供将缓冲区写入waveOutWrite的循环吗?”)它不是一个循环,而是我有一个函数,每当我通过网络接收到音频数据包时都会调用它:

0 投票
1 回答
3504 浏览

c++ - C++ Winapi WaveOutSetVolume()

我想用这个功能改变主音量

如何为主卷创建处理程序?

如何将音量(例如 75)传递给函数?

像这样尝试:如何以编程方式更改主音量?不适合我!

0 投票
3 回答
1320 浏览

c++ - 在 C++ 中将回调函数转换为 DWORD_PTR

实际上是c ++的新手。我写了这段代码,但说不能从“waveOutProc”转换为“DWORD_PTR”。你能告诉我如何解决吗?

谢谢

///////////////////////////////////////// ////////////////////////////

0 投票
1 回答
1586 浏览

c# - InvalidParameter 调用 waveOutOpen MmException

此代码适用于32 位 Windows XP,但在64 位 Windows 7上会引发异常。(在任何 CPU 配置上)

有什么帮助吗?

0 投票
1 回答
679 浏览

c++ - 单独更改左右声道音量 waveOutSetVolume C++

实际上,我想将音频设备的左声道和右声道的音量控制提供给用户,用户为每个声道使用不同的数字。我使用了“waveOutSetVolume()”。它有 2 个参数。第一个是句柄,第二个是十六进制或 DWORD 数字。

我有 2 个数字。每个通道一个,然后将它们转换为字符串。现在我如何将它们转换为“0x”格式的十六进制?一般来说,如何分别改变每个通道的音量?

///////////////////////////////////////

0 投票
1 回答
1334 浏览

winapi - 为什么 windows Vista/更新版本的 waveOutOpen() 说默认输出设备不能播放 44100hz 单声道 8 位 PCM,而 waveOutGetDevCaps() 说可以?

我正在尝试使用 winmm ( waveOutXxxx()) 打开一个 44100hz 8 位单声道 PCM 流,而无需软件自动转换(我希望完全控制输出波,而无需进行此类转换可能导致的过滤)。

这在 Windows XP 和 wine 中运行良好。但是在 Windows Vista 和更新版本(尝试过 Vista、7 和 8.1)上,我得到了

所以让我们这样做:

现在输出是

...但是等等,WAVE_FORMAT_4M08被列为支持!

是什么赋予了?谢谢。

0 投票
2 回答
2291 浏览

delphi - Delphi - Get Wave amplitude

I need to make Delphi library / component that takes the currently playing sound ( it does not play my apps , just the general sound of what goes on loud-speakers ) returns me the data ( the amplitude of the left and right channels ) . Currently I have it processed by scanning from the microphone. He was looking for and I tried different VU meters that are on the net ( Torry ... ) , but they are not compatible with Win7 and higher. Anyone know of a solution? Thanks

0 投票
1 回答
4405 浏览

c++ - 您如何获得 Windows 音频播放的当前采样率?

我正在使用 Windows waveOut API(又名 MME 或多媒体扩展)mmsystem.h。某些程序会更改音频播放采样率(例如,从 44.1kHz 到 48kHz),这对我的程序检测当前播放采样率非常有用,因此它可以警告用户 Windows 将重新采样程序的输出。

根据此文档http://msdn.microsoft.com/en-us/library/aa909811.aspx,waveOutGetPlaybackRate返回设备当前正在执行的重采样百分比(例如,设备以 44.1 播放,程序以 44.1 播放音频所以它会返回 1.0)。我很好奇是否有办法获得设备的绝对采样率,而不是相对的。在 Windows Vista/7/8 中,您可以通过以下方式手动找到此值:控制面板 > 声音 > 播放,右键单击默认播放设备并选择属性,然后选择高级选项卡。所以我试图通过查询操作系统来获取这里的“默认格式”值。

有问题的程序是用 Pascal 编写的,但是,我通常使用 C/C++ 引用。