问题标签 [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 投票
2 回答
85 浏览

winapi - 在 waveOutOpen 抛出后释放 pwfx

根据 Microsoft文档:“您可以在将这个 [pwfx] 结构传递给 waveOutOpen 后立即释放它。”

但是这段代码似乎不同意:

带有代码和调用堆栈的屏幕图片

0 投票
1 回答
601 浏览

c# - 如何从音频播放设备获取通道数?

游戏 Titanfall 2 显示了播放设备的音频配置。 https://i.imgur.com/e9NHel6.png

我能做些什么来通过 C# 中的代码获取这些信息吗?

更新和更正(UTC 时间 2019 年 9 月 29 日下午 3:12 左右):上面的链接图片显示了免费游戏 Apex Legends 的音频选项。Titanfall 2 音频设置的链接是http://i.imgur.com/6OSSysd.gif。对于这两款游戏,Windows 音频配置都会显示信息,用户无法在游戏中更改此选项。

有些人可能会在https://satsun.org/audio/上找到有用的信息。

0 投票
0 回答
877 浏览

c++ - C++ - 从缓冲区异步播放音频

我来自 .net 背景,对 C++ 开发相当陌生。

我有一个这样的缓冲区:

如何从声卡播放此缓冲区?

注意:这个缓冲区是循环填充的,在每个循环中,我都想播放缓冲区。

我的研究表明这个命令解决了我的问题,但是通过执行这个命令,不会播放任何声音......

另一种解决方案是:

但是还不会播放任何声音...

0 投票
1 回答
43 浏览

audio - Windows 波形函数 - 8 和 16 以外的位深度的 WAVEOUTCAPS

WAVEOUTCAPS 结构的Microsoft 文档列出了音频设备可以支持的多种格式:

在此处输入图像描述

我没有看到此处列出的任何 24 位变量,尽管通过我确认我的声卡能够通过调用打开 24 位输出WaveOutOpen(并通过该输出播放 24 位音频文件)。

我猜微软在某处为 18/20/24/32/48/64 位输出定义了额外的变量,但我找不到它们。我尝试在网上搜索,但没有任何结果,我尝试使用 Visual Studio 在我当前的名称空间中搜索以“WAVE_FORMAT_”开头的变量,但没有找到任何额外定义的格式。

WaveOutGetDevCap()是否可以使用该功能或​​任何类似功能在 Windows 上检查 4/18/20/24/32/48/64 位输出可用性?如果是这样,怎么做?

0 投票
1 回答
299 浏览

c++ - 将 WAVEFORMATEXTENSIBLE 与 WAVE_FORMAT_IEEE_FLOAT 一起使用,waveOutOpen 返回 WAVERR_BADFORMAT

我一直在使用WAVEFORMATEXWaveOut 在 Windows 中以 44.1KHz 到 192KHz 的速率播放音频WAVE_FORMAT_IEEE_FLOAT。该程序用 C++ 编写并在 MinGW 中编译。这一切正常:

https://github.com/Raptor007/AutoDJ/blob/60f4debca2103e669a5d1b822b04c73cdcdaf05b/AutoDJ.cpp#L2412-L2435

现在我正在尝试扩展到四声道多声道输出,这似乎需要WAVEFORMATEXTENSIBLE. 的超集WAVEFORMATEX。以下是应用了这些更改的相关代码:

如果我设置Format.nChannels = 2; dwChannelMask = 0x3;为立体声,则waveOutOpen使用 IEEE-float 格式的第一次尝试失败并返回代码WAVERR_BADFORMAT,但使用 PCM 格式的第二次尝试成功。

如果我尝试Format.nChannels = 4; dwChannelMask = 0x33;四声道,IEEE-float 和 PCMwaveOutOpen尝试都会失败,并显示WAVERR_BADFORMAT.

但是,如果我设置Format.cbSize = 0;,那么任何一种格式的 2 个通道都可以正常工作,这是有道理的,因为这基本上是我之前一直在做的事情WAVEFORMATEX。但这不适用于 4 个通道。

我在这里做错了什么? 我的最终目标是 IEEE 浮点格式的四声道或 5.1 环绕声输出。我特别困惑为什么我什至无法使用立体声 IEEE-float 输出,WAVEFORMATEXTENSIBLE但它与WAVEFORMATEX.

0 投票
0 回答
10 浏览

naudio - NAudio:为什么我在耳机中的音量使用 SampleChannel 会降低

我制作了一个用户控件来播放带有滑块的 MP3,这样当我使用两个或更多用户控件时,我可以播放 MP3 并使用滑块来降低每个 MP3 的音量。使用 WaveOut() 本身的音量控制有效,但随后所有 UserControls 的音量上下波动。所以我找到了我应该使用 SampleChannel 并在那里设置音量的地方:BINGO。但是现在,当我用耳机听的时候,把电脑上的耳机音量设置为100%,音量比不使用SampleChannel要低很多....奇怪

0 投票
0 回答
38 浏览

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

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

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

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

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

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

主文件

格式

waveOutOpen

分配

写作

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

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

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

0 投票
0 回答
43 浏览

c++ - 任何使用过 WaveOut API CPP 的人请解释一下我的代码有什么问题?

我多年来一直在为此苦苦挣扎,我开始真的厌倦了,
无论我尝试或研究什么,无论我如何设置内存,我都无法输出不断断续续的声音,几块, 更多块, 大块, 小块, 不同的循环, 不同的回调等等, 似乎没有任何工作, 我总是听到断断续续的声音,

如果有人知道他们在做什么, 我会非常感激查看我的代码并解释我哪里出错了,最细微的细节都会得到最大程度的赞赏。

即使您可以推荐某人或某处联系/发布,请通知我!

0 投票
0 回答
94 浏览

c++ - 移植 WaveOut API 的有效方法(使用 OpenAL?)

在过去的几年里,我使用了自己使用 WaveOutOpen API 编写的音频引擎。现在我想将它移植到 Linux / MacOS。我考虑过使用 OpenAL。

在不更改太多代码的情况下将其移植到 Linux 的有效方法是什么?

我正在混合来自 WAV 文件的音频数据并应用效果,例如 3D 位置、循环、频率变化和回声。

从我所见,OpenAL 看起来很相似,但我对音频 API 没有非常广泛的看法。

有音频编程经验的人可以为我指明正确的方向吗?

0 投票
0 回答
123 浏览

c++ - 当用户在 Windows 上切换播放设备时,如何继续播放 waveOutWrite() 音频?

当用户在 Windows 上切换他们的播放设备时,我的音频播放就会waveOutWrite()停止。有没有办法让它在其他设备上继续?

WAVE_MAPPERwaveOutOpen().

这是我要求的 WaveOutOpen() 代码:


更新:

打开声卡后,一直调用回调函数,我之前调用WaveOutCallback()过,uMsg参数设置为MM_WOM_DONE。这工作正常。但是,一旦我将声音设备切换到蓝牙扬声器,它就会停止播放音频并停止调用此回调函数。

蓝牙扬声器正在使用其他应用程序工作。

更新 2

我已经阅读了waveOutWrite()发送WOM_DONEwaveOutProc过程的内容,该过程在我的代码中被调用WaveOutCallback()(如上所示)。

在我看来,一旦我切换设备,WOM_DONE就不再为最后一个输出缓冲区调用。实际上,在最后WOM_DONE一条消息之后,回调不再打印消息。

更新 3

我可能需要将我的waveOutWrite()呼叫移到 之外waveOutProc(),如以下参考中所述?

应用程序不应从回调函数内部调用任何系统定义的函数,除了EnterCriticalSection, LeaveCriticalSection, midiOutLongMsg, midiOutShortMsg, OutputDebugString, PostMessage, PostThreadMessage, SetEvent, timeGetSystemTime, timeGetTime, timeKillEvent, 和timeSetEvent. 调用其他波函数会导致死锁。

https://docs.microsoft.com/en-us/previous-versions/dd743869(v=vs.85)