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

c++ - AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY 有时设置,有时不设置

我尝试使用 WASAPI 为 windows phone8 制作一个简单的 VoIP 应用程序。在项目的某些运行中通过调用

几分钟后 dwFlags 反复设置为 1 (AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY) 并且返回的数据包变得越来越小,并且在此期间口吃变得越来越多,但在项目的某些运行中,一切都很好,声音完全清晰。

有人可以帮忙吗?

我知道代码在每次GetBuffer调用之间都做了很多工作,这可能是时间故障的主要问题,但我的问题是为什么有时会发生有时不会发生?

0 投票
1 回答
799 浏览

c++ - 在 windows phone 中使用 libsamplerate 重新采样音频

我正在尝试在使用 WASAPI 的 windows phone 项目中使用 libsamplerate 将捕获的 2channel/48khz/32bit 音频重新采样为 1channel/8khz/32bit。

我需要通过重新采样从 960 个原始帧中获取 160 帧。使用GetBuffer 方法捕获音频后,我将捕获的 7680 字节的 BYTE 数组发送到以下方法:

src_process 方法没有返回错误并sd->input_frames_used设置为 960 并sd->output_frames_gen设置为 159,但渲染输出只是噪声。我在实时 VoIP 应用程序中使用该代码。问题的根源可能是什么?

0 投票
2 回答
13191 浏览

c# - 获取音频混合器中可视化的单个 Windows 应用程序当前音量输出级别

我正在尝试编写一个 C# 代码,该代码从访问声音输出的每个 Windows 应用程序输出当前音频输出电平(如音量混合器的不断变化的绿色条所示)。

程序每10毫秒检查一次,输出如下:Windows Media Player: 30, Mozilla Firefox: 0, Adob​​e Flash Player: 35(如图)

我正在使用 Windows 7,并在 C# 中尝试它(因为 Java 无法实现这一点)。

我找到了获取和设置正在运行的应用程序的主音量(Windows Media Player 显示 65% 的手柄栏)的方法,有没有办法获取绿色波动级别数据?

谢谢!

混音器

0 投票
1 回答
607 浏览

c++ - Core Audio (WASAPI) 缓冲区事件计时

按照 Exclusive-Mode Streams 中的示例,我正在使用 Windows 核心音频功能(主要是 WASAPI)来呈现独占流。

这会创建两个交替播放和填充的缓冲区。有一个与缓冲区完成相关的事件会唤醒线程,以便它可以重新填充刚刚完成的缓冲区。GETPOSITION 显示当当前缓冲区位于 160 帧缓冲区的第 147 帧时线程被唤醒。这让我有 13/160 的缓冲时间来获取新的缓冲区、填充它并释放它。我有很多计算要做,时间不够。我想我可以控制处理器而不是在缓冲区被填满时休眠,但这似乎不是正确的解决方案。

此外,即使我的进程是“PRO AUDIO”并且优先级为 25,有时缓冲区完成事件会延迟更远,因此系统开始重播未填充的缓冲区。我还没有找到任何关于这个时间应该如何工作或如何控制的讨论。我预计缓冲区完成事件会在少量帧内到达下一个缓冲区。有人熟悉这个东西吗?有解决方案还是有关于在哪里寻找的线索?

0 投票
1 回答
1819 浏览

windows - 如何在 Windows 7 中更改音频输出设备的默认共享模式采样率?

我正在使用 windows 音频核心 api 进行环回捕获,但失败了: // spClient is a smart comptr Wrapped IAudioClient hr = spClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_LOOPBACK,iRequestedDuration, 0, &m_struWaveFormat, 0);

它返回 AUDCLNT_E_UNSUPPORTED_FORMAT,因为 m_struWaveFormat 是 44100,16bit 格式,但是设​​备属性页中的配置在共享模式下是 48000,24bit 格式。如果我将其更改为 44100,16 位格式,上面的代码运行良好。那么,任何人都可以告诉我如何使用音频核心 api 更改默认共享模式采样率吗?感谢和问候

0 投票
0 回答
389 浏览

c# - 注册一个 EventHandler 以便在音频混音器中显示的当前音量输出级别发生变化时生成事件

这是这个问题的延续:Getting individual windows application current volume output level as visible in audio Mixer

如何注册一个在应用程序(例如 windows 媒体播放器)的当前输出音量发生变化时被调用的 EventHandler?换句话说,如何注册一个 EventHandler,只要 AudioSessionControl 的 GetPeakValue 发生变化,它就会被调用?

对于我的应用程序,我希望每当 Windows Media Player 的 PeakValue 发生变化时,都应该调用一个函数,而不是我不断地轮询当前的 PeakValue 以识别是否有变化。

我正在使用 CSCore.CoreAudioAPI 来获取任何应用程序的当前音频值。我尝试在 CSCore 中使用 AudioSessionEvents(及其事件处理程序,如 SimpleVolumeChanged、ChannelVolumeChanged),但是我没有找到任何方法将 AudioSessionControl 对象传递给附加的处理程序。

0 投票
0 回答
445 浏览

windows - 在 Windows 上以已知输出延迟播放音频的方法

我有一个 C++ 应用程序,它接收带时间戳的音频流,并尝试播放尽可能接近指定时间戳的音频样本。为此,我需要知道从将音频样本放入输出缓冲区到实际听到音频的延迟(具有合理的准确性)。

关于音频输出延迟有很多讨论,但我发现的一切都是关于最小化延迟。这与我无关,我所需要的只是(在运行时)已知的延迟。

在 Linux 上,我以非常好的结果解决了这个问题snd_pcm_delay(),但我正在为 Windows 寻找一个不错的解决方案。

我看过以下内容:

  • 使用 OpenAL,我测量了 80 毫秒的延迟,但未计算在内。我认为这不是一个硬编码的值,我还没有找到任何 API 来读取延迟。OpenAL 有一些扩展声称支持这一点,但据我所知,它只在 Linux 上实现。
  • WasapiGetStreamLatency()听起来像是真正的交易,但这显然只是一些线程轮询间隔或其他东西,所以它也没用。我的机器上仍有 30 毫秒的未计延迟。
  • DirectSound 没有用于获取延迟的 API?但是我可以通过跟踪我的输出缓冲区来足够接近吗?

编辑回应布拉德的评论:

  • 我对 ASIO 的印象是,它主要面向专业音频应用程序和音频鉴赏家,用户可能需要安装特殊的声卡驱动程序,而我将不得不处理许可问题。不过,就功能而言,它似乎是一个不错的选择。
0 投票
1 回答
2281 浏览

c++ - WASAPI:为独占输出选择波形格式

我正在尝试使用 WASAPI 打开带有输出设备的独占流。我在选择可接受的格式时遇到了麻烦,因为似乎没有任何关于给定设备接受哪些格式的提示。

在我的情况下,IAudioClient::GetMixFormat(),否则将返回设备的一种默认格式,返回不能在独占模式下使用的格式(IAudioClient::IsFormatSupported()返回AUDCLNT_E_UNSUPPORTED_FORMAT)。我不知道从那里去哪里。波形格式参数的组合数量多得离谱——我真的必须遍历它们中的每一个直到某些东西起作用吗?

0 投票
1 回答
986 浏览

c++ - C++:将 float[] 转换为 unsigned char* 或 BYTE*

我正在开发一个项目,我需要将 PCM 16 位 2 通道声音转换为 IEEE Float 32 位 2 通道。

为此,我使用以下代码:

我已经初始化了变量 __pcm32_bytesPerFrame :

strm->pb_max_frame_count 是:

我在专用线程中有一个 while 循环,它执行以下操作:

但是,要将声音发送到 WASAPI 捕获缓冲区,我需要一个 BYTE*。如何填写我的“floatTo”参数?

有任何想法吗?

谢谢

0 投票
1 回答
1327 浏览

c++ - 在不同的波形格式之间转换 (WAVEFORMATEX)

我正在编写一个以独占模式运行流的实时音频应用程序。为了将数据正确地呈现给设备,它需要以我自己选择的格式到达。我所有的音频处理都是在发送到设备之前使用浮点样本完成的,并且设备的波形格式可能没有(也可能没有)设置为WAVE_FORMAT_IEEE_FLOAT- 例如,它可能是WAVE_FORMAT_EXTENSIBLEWAVE_FORMAT_PCM.

是否有 API 可以轻松在一种波形格式(浮点)和另一种(设备格式)之间进行转换?