问题标签 [xaudio2]

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 投票
1 回答
274 浏览

c++ - 如何使用 XAudio2 在给定时间获取频率值?

我已经.wav使用 XAudio2 (Windows 8.1) 将音频加载到缓冲区中,要播放它我只需要使用:

我想知道,如何使用 XAudio2 在给定时间获取频率值?

0 投票
1 回答
754 浏览

c++ - 流和循环 MS ADPCM (WAVE_FORMAT_ADPCM)

我正在尝试使用 XAudio2 流式传输 MS ADPCM 文件(在 C++ 中,但这个问题似乎与语言无关)。

该文件使用 ADPCMEncode.exe 进行编码,这给出了一个带有 WAVE_FORMAT_ADPCM 格式标记的 WAV 文件。

像任何流一样,我创建了一个 IXAudio2SourceVoice(从文件开头使用完整的 ADPCMWAVEFORMAT),并在它请求时为其提供块对齐缓冲区。数据似乎可以正常播放,直到循环播放。

循环读取器如您所料:如果发生短读取,则将偏移量返回到开头并执行另一次读取以填满缓冲区的其余部分。PCM 很好,但 MS ADPCM 有时声音会停止。它似乎停止要求更多缓冲区,因此用完并停止。

错误发生的时间各不相同。有时它会在数据循环时立即发生,有时在循环数次后发生。显然,我需要通过 XAUDIO2_BUFFER 传递一些额外的信息,但我找不到任何文档告诉我什么。

谁能指出我正确的方向?

0 投票
1 回答
319 浏览

xaudio2 - Microsoft XAudio2Sound3D 示例代码'不会将子混音发送到母带语音

我正在研究 Microsoft XAudio2 的 X3Daudio 示例代码,并且对将源语音与子混音和母带语音并行发送感到困惑。

//最后第二个参数nullptr->没有指向子混合语音的sendlist指针,我的理解是,这个子混合语音没有输出。

源声音会将声音发送到主声音和子混合声音。子混音会在声音上添加混响效果。但是我看不到子混音声音在哪里发送后处理和混响效果,使声音能够通过母带声音输出到扬声器。

如果您在创建时未指定发送列表,则子混音默认将其声音数据发送到主语音。为什么在这个示例中,我们还需要同时将源语音发送到母带语音?演示输出声音始终带有混响效果。我没有看到示例可执行文件中有禁用混响效果的选项。

我感到很困惑。

0 投票
1 回答
136 浏览

audio - WinRT - 将音频渲染到不同的设备

我正在开发一个 WinRT 项目,在该项目中我同时播放多个视频文件。我在机器上连接了 3 个音频设备,它们将专门用于渲染正在播放的视频文件中的音频。可以同时播放的最大视频数为 3。因此,每个音频设备都将用于从其相应的视频文件中渲染音频。即音频设备 1 将播放视频 1,依此类推。这就是我的要求。

到目前为止,我遇到了两种方法。首先,我们使用杜比或任何其他 API 将音频通道化到相应的设备。即左声道渲染到设备 1,中间/中心渲染到设备 2,右声道渲染到设备 3。我已经尝试过适用于 Windows 10 的Dolby Audio 示例应用程序。他们已经在嵌入式视频中完成了通道,而不是在代码中。我找不到Windows 10 Dolby API的文档。那么对于这种方法,我可以将音频以通道的形式呈现给特定的音频设备吗?而且我不想以任何方式合并音频。

其次,我们使用 3 个声卡,并在每个声卡上附加一个音频设备。我们通过提供设备 ID 来选择我们想要播放音频的设备。我已经通过使用我想要的设备 ID 调用 createMasteringVoice() 方法来尝试使用XAudio2使用这种方法。这适用于单个音频文件,但是,我想渲染正在播放的多个视频的音频。

这两种方法都没有解决核心需求。因此,考虑到这种情况,满足要求的最佳方法是什么?

0 投票
1 回答
570 浏览

winapi - 如何初始化未注册的 COM DLL?

最近,我们的一些客户从他们的 C:/Windows/System32 目录中丢失了他们的 XAudio2_7.dll,现在他们听不到任何音频。通常重新安装 DirectX 或注册 dll 就足以解决此问题,但我们正在寻找不需要管理员权限的解决方案。这适用于 Windows 7。应用程序是用 CPP 编写的,其中一些是 32 位的,其余​​的是 64 位的。

在 exe 的同一目录中有 XAudio2_7.dll 的本地副本,但除非该 dll 已注册,否则不会加载,因为它是 COM dll。为当前用户注册(使用“Regsvr32.exe /n /i:user XAudio2_7.dll”)不起作用,因为 dll 没有实现所需的接口“DllInstall”。

我尝试过的一种方法是静态链接 XAudio 的 .lib,而不是使用动态链接。Microsoft 不会随 DirectX SDK 分发 XAudio2_7.lib。“没有任何版本的 DirectX SDK 包含 xaudio2.lib 导入库。DirectX SDK 版本使用 COM 来创建新的 XAudio2 对象。” msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.xaudio2.xaudio2create%28v=vs.85%29.aspx

当然,这表明即使我创建了一个静态 XAudio 库,也可能无法使用它,因为它听起来像是依赖于其他库中定义的外部对象。如果我的假设不正确,它仍然值得测试。

按照此链接中提到的步骤:adrianhenke.wordpress.com/2008/12/05/create-lib-file-from-dll/

我没有用这种方法走得很远。除了过时的文章之外,还有一些问题。博客中的 MS 链接提到这是针对 32 位 dll 的。即使对于 32 位 dll,dumpbin 也不起作用,因为它只导出接口函数。转储文件 C:\XAudioTest\32Bit\XAudio2_7.dll

后来,我从另一篇 MSDN 文章中找到了这句话。“COM 标准要求 COM DLL 导出 DllCanUnloadNow、DllGetClassObject、DllRegisterServer 和 DllUnregisterServer。通常它们不会导出任何其他内容。这意味着您无法使用 dumpbin.exe 获取 COM 对象或方法信息。” msdn.microsoft.com/en-us/library/aa446532.aspx

我还尝试过使用声称它能够从 COM dll 创建 .lib 的第三方程序。www.binary-soft.com/dll2lib/dll2lib.htm

虽然这确实生成了一个 32 位的 .lib 文件,但使用 lib 文件进行编译会生成未解析的外部符号。此实用程序确实带有处理未解析符号的方法,但在符号查找器或高级转换选项中输入任何内容都会崩溃。查看最新的发行说明 (3.00),我发现他们添加了对 Vista 的支持,但没有提及 Windows 7。这也不适用于 64 位 dll。

我尝试过另一种方法是更改​​初始化序列以使用此链接中描述的未注册 COM DLL: 使用 DLL 中的 COM Object without register 初始化代码类似于以下内容:

传递的所有 WinAPI 函数调用不包括 XAudio2Create 函数。我不确定为什么 XAudio2Create 不使用从工厂创建的对象,而且我不知道我需要做什么才能让它使用该对象。我仍在调查我能在这里做什么,但调试封闭源代码库很困难。

在我了解 COM DLL 之前,我尝试过的一种方法是使用 DLL 重定向来强制应用程序使用特定的 DLL。使用此处描述的过程: 使用清单 XAudio2Create的DLL 重定向仍然失败。我没有强有力的策略来确定清单有什么问题。我也没有找到关于 dll 重定向清单的最新文档。从这听起来是这主要用于加载特定的 DLL 版本。我不认为 DLL 重定向是我需要的方法,因为在 exe 的同一目录中已经有 XAudio2_7 的本地副本,这意味着它应该优先于系统目录中的 XAudio2_7,根据:msdn.microsoft.com /en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx

注意:我删除了一些地址的超链接,因为我没有足够的信誉点来发布超过 2 个链接。

0 投票
0 回答
174 浏览

c# - SharpDX.ni.DLL 中发生 System.OutOfMemoryException

我正在尝试创建一个同时播放多种声音的 Windows Phone 应用程序。为此,我正在使用 SharpDX 库。

在播放一些声音后,它会在 line buffer = new AudioBuffer 处引发 System.OutOfMemoryException 异常。如何解决此问题并释放内存?

0 投票
1 回答
1267 浏览

c++ - C++ - 将 DirectSound 或 XAudio2 与 EAX 一起使用

是否有在 C++ 中将 EAX 与 DirectSound 或 XAudio2 一起使用的示例/教程/资源?我找不到任何东西,我的游戏引擎真的需要它。

0 投票
1 回答
605 浏览

windows - 如何从 XAudio2 源语音中检索当前样本播放位置?

我有一个IXAudio2SourceVoice正在播放的提交XAUDIO2_BUFFER。如何从这些样本中检索当前播放缓冲区中的播放位置?

谢谢你的帮助!

0 投票
1 回答
5353 浏览

c++ - 如何设置 XAudio2 dll 版本

我的 MSVC 2015 C++ 应用程序项目使用xaudio2.lib. 所以 .cvxproj 包含一行

查看构建的 .exe ,我可以找到一行XAudio2_8.dll.

所以似乎编译器(或链接器)决定只使用 2_8 版本。

这导致我的应用程序无法在 Windows 7 机器上运行的问题,因为XAudio2.dll那里只安装了较低版本的,并且找不到XAudio2_8.dll.

那么如何修复/修改我的项目,以便生成的 .exe 可以在 Windows 7 上运行?例如,我如何指定使用XAudio2_7.dll

0 投票
1 回答
579 浏览

c++ - 为什么在 DirectX 版本的 XAudio2 中调用 OnCriticalError?

我的游戏应用程序使用 XAudio2.lib 并针对 Windows 8 和 Windows 10。代码如下:

一切都很好。我可以拔下耳机,然后再插回去,没有问题。IXAudio2EngineCallback::OnCriticalError(HRESULT error)从来没有被叫过。

在我们决定支持 Windows 7 之前一切都很好。我了解到在这种情况下我必须使用 DirectX 版本的 XAudio2。所以我_WIN32_WINNT=0x0601在预处理器定义中设置,XAudio2.lib从依赖项中删除并将代码更改为

它现在启动,播放声音,但是当我拔下耳机时,它会调用IXAudio2EngineCallback::OnCriticalError这意味着我必须重新启动音频引擎并重新创建所有音频内容。

我不想有这样的痛苦,所以我在阅读MSDN,我看到:

如果您为 IXAudio2::CreateMasteringVoice 指定 NULL 或 szDeviceId 参数,则系统使用虚拟音频客户端来表示音频端点。在这种情况下,如果底层 WASAPI 渲染设备不可用,系统会自动选择新的音频渲染设备进行渲染,音频处理继续进行,并且不会引发 OnCriticalError。

这是什么意思?什么是

如果指定 NULL 或 szDeviceId 参数?

谁能解释我如何打电话CreateMasteringVoice来避免OnCriticalError