问题标签 [wasapi]

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 回答
1341 浏览

c++ - 为什么我不能使用 IAudioEndpointVolume::SetMasterVolumeLevelScalar 设置 USB/Firewire 音频接口的主音量

我正在尝试修复一个围绕 portmixer 的 Audacity 错误。输出/输入级别可使用 mac 版本的 portmixer 设置,但并非总是在 windows 中。我正在调试 portmixer 的窗口代码,试图让它在那里工作。

使用 IAudioEndpointVolume::SetMasterVolumeLevelScalar 设置主音量对于板载声音效果很好,但使用专业的外部 USB 或 RME Fireface 400 等火线接口,输出音量不会改变,尽管它反映在该设备的 Window 声音控制面板中,以及在系统混音器中。

此外,在我们的程序之外,更改系统混音器的主滑块(在任务栏中)没有任何效果 - 声卡输出相同(完整)级别,无论系统说它处于什么级别。更改输出级别的唯一方法是使用硬件开发人员随卡提供的定制应用程序。

IAudioEndpointVolume::QueryHardwareSupport 函数返回 ENDPOINT_HARDWARE_SUPPORT_VOLUME 所以它应该能够做到这一点。

许多设备上的输入和输出都存在这种行为。

这可能是Window的错误吗?

可以通过模拟(缩放)输出来解决此问题,但这不是首选,因为它在功能上并不相同 - 最好让音频接口进行缩放(特别是如果它涉及前置放大器,则用于输入)。

0 投票
1 回答
4101 浏览

winapi - 渲染音频流(WASAPI / WINAPI)

我目前正在阅读 MSDN 的文档以将流渲染到音频渲染器.. 或者换句话说,从麦克风播放我捕获的数据。

http://msdn.microsoft.com/en-us/library/dd316756%28v=vs.85%29.aspx

这个例子提供了例子。

我现在的问题是我无法真正理解项目流程。我目前有一个不同的类来存储我从捕获过程中获得的以下参数。当程序从麦克风捕获流式音频数据时,这些参数将不断重写。

我的问题是, loadData() 函数究竟是如何工作的。是否假设从捕获过程中获取我正在编写的参数?程序如何将数据发送到音频渲染器,并在我的扬声器中播放。

0 投票
1 回答
3383 浏览

windows - Windows Vista/7:如何对输出音频混合进行采样?

如何访问当前波形输出样本流?

在 social.microsoft.com 上 2006 年 12 月的一个问题中(如何在 Vista 中从“Wave”或“Stereo Mix”录制?)yjslash 问:

在 Windows XP 或更早版本上,我可以将音频流捕获到扬声器。换句话说,DirectSoundCapture能够从选定的源行进行捕获。如果选择“Wave Out Mix”或“Stereo Mix”或类似的东西作为录制源线,DirectSoundCapture 能够将音频流录制到扬声器。

Larry Osterman (MSFT)(音频团队开发人员和StackOverflow 用户)对此做出了回应:

您在 XP 中为此使用了哪些 API?他们应该继续在 Vista 上工作。

WASAPI有一个特殊的 Loopback 模式,它允许客户端捕获混合后的音频流,这也可能会有所帮助

Stackoverflow 上的一个问题(How do I read system audio output in windows xp and windows 7?)还提到WASAPI能够对输出混合进行采样,并且从 Windows Vista 开始就可以使用。

2007 年 1 月的一篇 Windows 团队博客文章提到了对音频输出进行采样的能力(用于回声消除;以及 HDCP 将对其产生什么影响):

回声消除对优质内容的效果会较差吗?

我们相信 Windows Vista 为应用程序提供了对成功构建高质量回声消除功能的足够信息的访问。

使用什么 API 对音频输出进行采样?Vista 为应用程序提供了哪些访问权限来访问当前的音频输出流?WASAPI 的哪些功能以及如何使用它们允许对当前音频输出进行采样/捕获?

也可以看看

0 投票
1 回答
2302 浏览

windows - 在 Windows Vista/7 中支持回声消除的 API

2007 年,在 Windows Vista 中包含 DRM 的热潮中,创建了一个Windows Vista 团队博客来回应很多担忧。其中一个问题是针对 VoIP 软件在 Windows Vista 上运行时执行回声消除的能力。

这就是尼克·怀特在常见问题解答中所说的:

回声消除对优质内容的效果会较差吗?

我们相信 Windows Vista 为应用程序提供了对成功构建高质量回声消除功能的足够信息的访问。

Windows Vista 提供哪些信息以允许应用程序构建高质量的回声消除功能?

注意:阅读该声明后,我的印象是 Windows Vista 提供了足够的信息以允许应用程序成功构建高质量的回声消除功能。据推测,Windows 提供此信息的方式是通过 API。

回声消除的工作原理是对播放输出进行采样,然后从录制的麦克风输入中“减去”。

不幸的是,正如 MSDN 所指出的,不能总是对播放输出进行采样:

Windows Vista 提供数字版权管理 (DRM)。内容提供商依靠 DRM 保护其专有音乐或其他内容免遭未经授权的复制和其他非法使用。WASAPI 不允许环回记录包含受 DRM 保护的内容的数字流。同样,受信任的音频驱动程序不允许环回设备捕获包含受保护内容的数字流。Windows Vista 仅允许受信任的驱动程序播放受保护的内容。有关受信任的驱动程序和 DRM 的详细信息,请参阅 Windows DDK 文档。

大概这意味着使用WASAPI 中的环回模式不是提供回声消除服务的预期方法。

允许实现高质量回声消除的预期 API什么?

注意:这与我问的另一个问题有关,但又分开:如何对输出音频混合进行采样?. 这个问题是专门寻找 Window Vista 团队响应的扩展,即回声消除在 Windows 中是可能的。这个问题正在寻找API;它可以是如何使用它的单独问题。

谷歌搜索答案,我得到的印象是(在执行回声消除时)允许应用程序对受 DRM 保护的内容进行采样,但内容将被降级(即“足够的信息”)。这会使任何回声消除变得更糟,但仍有可能。

或者 Windows 团队是否暗示“在大多数情况下已经足够了,但在用户听歌或播放电影时却不行”——实际上不可能成功构建高质量的回声消除功能?


更新:应该注意我不是在寻找回声消除 API,而是在寻找一个 API 来对播放输出进行采样——这是实现回声消除所需要的。当然,除非 Windows Vista 提供回声消除 API(这是他们继续保护高级内容的方式)。但我也没有看到回声消除 API。

0 投票
2 回答
3815 浏览

c++ - SndVol 如何能够改变给定音频会话的音量?

我正在编写自己的 API 来执行 SndVol 系统实用程序的一些功能。我希望这个 API 的一部分能够设置给定音频会话的音量级别。

SndVol 在“设备”面板上显示一个滑块,用户可以使用它来更改音频设备的主音量级别,以及一个用于更改会话音量级别的每个音频会话(在“应用程序”面板上)的滑块:

SndVol 音量混合器的屏幕截图

如果我拖动其中一个音频会话的滑块手柄,则 SndVol 能够更改音频会话的音量。它是如何做到的?

我认为使用 Windows Vista 的Core Audio API是可能的,但我遇到了一个问题,虽然我能够使用 迭代设备的音频会话IAudioSessionEnumerator,但IAudioSessionEnumerator只能让我访问IAudioSessionControl对象,但我需要IAudioClient对象来获取ISimpleAudioVolume对象我可以用来设置音频会话音量。是否可以获取与IAudioClient对象关联的IAudioSessionControl对象?

0 投票
2 回答
7337 浏览

c++ - 在 Windows 7 上捕获单个应用程序的音频

有没有办法捕获仅由单个应用程序而不是整个系统输出的音频?使用WASAPI我可以捕获整个系统的音频,但我希望只从一个应用程序中捕获音频(会有很多应用程序,所有应用程序都同时播放音频。)

0 投票
2 回答
691 浏览

c++ - 如何测试音频会话的相等性

我正在尝试使用 Windows 音频会话 API 在当前音频会话的枚举中定位默认音频会话。目前,我IAudioSessionControl在角色中引用了音频渲染端点的默认会话eConsole以及IAudioSessionEnumerator枚举此默认端点的音频会话的对象,但我需要能够比较IAudioSessionControl我拥有的对象是否相等返回的IAudioSessionControl对象IAudioSessionEnumerator::GetSession

我希望我可以通过比较IAudioSessionControl指针是否相等来测试是否相等。当我IAudioSessionControl使用IAudioClient::GetService. 不幸的是,返回的这个指针IAudioClient::GetService没有出现在IAudioSessionEnumerator. 此外,即使使用相同的音频会话 GUID ( ) 和值,通过路由多次获取默认音频会话IAudioSessionManager::GetAudioSessionControl也不会产生相同的指针。IAudioSessionControlGUID_NULLCrossProcessSession

如何在给定两个IAudioSessionControl指针的情况下测试音频会话的相等性?是否可以获得给定IAudioSessionControl对象的音频会话 GUID 和进程标识符?

0 投票
1 回答
1518 浏览

c++ - 以编程方式设置应用程序的播放设备

有谁知道是否可以在 Windows 7 上以编程方式设置音频播放设备?(我已经看过很多关于此的帖子,但没有“好”的答案)。我真的不想更改默认播放设备。例如,如果我有 2 个声卡并希望默认为声卡 1,我希望我的应用程序能够使用声卡 2。提前致谢

0 投票
1 回答
3048 浏览

windows - WASAPI:IAudioClient->Initialize 成功,即使 IAudioClient->IsFormatSupported 以相同格式失败

我试图找出特定音频设备在独占模式下支持哪些输出格式。为此,我正在使用 IAudioClient->IsFormatSupported(),根据文档,它应该可以用于此目的。不幸的是,它为我尝试传递的几乎所有格式返回 AUDCLNT_E_UNSUPPORTED_FORMAT,但默认的 2 通道 44​​.1khz 音频除外。

如果我真的尝试初始化音频客户端,那么有些格式会成功,但在 IsFormatSupported() 中失败了。

仅仅尝试初始化每种格式不是一个选项,因为这可能会导致停止来自其他应用程序的音频。

有没有其他人看到过这种行为或知道是否有另一种方法可以找到特定音频设备支持的格式?

0 投票
1 回答
3632 浏览

windows - 如何在 Windows 7 中控制麦克风增强?

我正在尝试使用 C/C++ 应用程序中的 MIXER API 控制 Windows 7 中的麦克风增强(电平/(取消)静音),但我没有获得相同的控件。可以使用 WASAPI 完成吗?有人可以建议任何其他 API 来控制 Windows 7 中的麦克风增强吗?

这是我到目前为止写的...