- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我第一次尝试使用 AudioClient 界面,但运气不好。到目前为止,我设法使用成功的 MMDeviceEnumerator 和 MMDevice 接口(interface)获得了默认的 AudioClient 接口(interface):
CoCreateInstance(
CLSID_MMDeviceEnumerator, nil,
CLSCTX_ALL, IID_IMMDeviceEnumerator,
MMEnumerator);
MMEnumerator.GetDefaultAudioEndpoint(eRender,eConsole,MMDevice);
MMDevice.Activate(IID_IAudioClient, CLSCTX_ALL, nil, AudioClient);
(此处未包含结果检查代码)。这 3 次调用都没有返回任何错误,并且我在 AudioClient 变量中有一个非零接口(interface) ptr。我的问题是当我尝试在以下位置获取混合波形时:
AudioClient.GetMixFormat(pwfx)
这将返回代码 0x88890001,即 AUDCLNT_E_NOT_INITIALIZED。 -> 当然没有初始化,因为我只想先得到它喜欢的波形。
查了msdn说AudioClient.GetMixFormat可以在AudioClient.Initialization之前调用。此外,AUDCLNT_E_NOT_INITIALIZED 不在可能的返回值列表中。所以我对我做错了什么感到困惑。 GetMixFormat() 文档 -> http://msdn.microsoft.com/en-us/library/windows/desktop/dd370872(v=vs.85).aspx
另一件奇怪的事情是,当我调用 AudioClient.GetStreamLatency() 时,它会返回 S_OK 并带有大约 1000 毫秒的准随机值。但文档指出“此方法需要事先初始化 IAudioClient 接口(interface)。所有对此方法的调用都将失败并显示错误 AUDCLNT_E_NOT_INITIALIZED,直到客户端通过成功调用来初始化音频流”。因此我认为我有一个可用的 AudioClient 接口(interface),我只是不明白为什么它不像文档中所说的那样工作。
(我正在使用 win7 64 位,Sound Blaster Live 5.1 和 kx-project 驱动程序(DSound 和经典的 windows MM 声音工作正常,但有 100 毫秒的可怕长延迟,这是我要使用 WASAPI 的唯一原因在 win7)
提前谢谢你。
最佳答案
我真的找到了这个错误。 MFPack中IAudioClient
定义不正确,接口(interface)函数顺序错误。 (我想有一天以某种方式插入它,如果我找到时间,转移到 git 等。)这是 IAudioClient 中方法的正确顺序:
IAudioClient = interface(IUnknown)
['{1CB9AD4C-DBFA-4c32-B178-C2F568A703B2}']
function Initialize(ShareMode: AUDCLNT_SHAREMODE; StreamFlags: Dword; hnsBufferDuration: REFERENCE_TIME; hnsPeriodicity: REFERENCE_TIME; pFormat: PWaveFormatEx; AudioSessionGuid: LPCGUID): HResult; stdcall;
function GetBufferSize(out pNumBufferFrames: UINT32): HResult; stdcall;
function GetStreamLatency(out phnsLatency: REFERENCE_TIME): HResult; stdcall;
function GetCurrentPadding(out pNumPaddingFrames: UINT32): HResult; stdcall;
function IsFormatSupported(ShareMode: AUDCLNT_SHAREMODE; pFormat: PWaveFormatEx; out ppClosestMatch: PWaveFormatEx): HResult; stdcall;
function GetMixFormat(out ppDeviceFormat: PWaveFormatEx): HResult; stdcall;
function GetDevicePeriod(out phnsDefaultDevicePeriod: REFERENCE_TIME; phnsMinimumDevicePeriod: REFERENCE_TIME): HResult; stdcall;
function Start(): HResult; stdcall;
function Stop(): HResult; stdcall;
function Reset(): HResult; stdcall;
function SetEventHandle(const eventHandle: HANDLE): HResult; stdcall;
function GetService(const riid: TGUID; out ppv: Pointer): HResult; stdcall;
//The GetService method supports the following service interfaces: IAudioCaptureClient, IAudioClock, IAudioRenderClient,
//IAudioSessionControl, IAudioStreamVolume, IChannelAudioVolume, IMFTrustedOutput, ISimpleAudioVolume.
//Since Windows 7 the new interface indentifier IID_IMFTrustedOutput has been added, but is not implemented here.
end;
函数ReleaseBuffer也有错误,这是正确的参数:
IAudioRenderClient = interface(IUnknown)
['{F294ACFC-3146-4483-A7BF-ADDCA7C260E2}']
function GetBuffer(const NumFramesRequested: UINT; out ppData: PByte): HResult; stdcall;
function ReleaseBuffer(const NumFramesWritten: UINT32; const dwFlags: DWord): HResult; stdcall;
end;
关于WASAPI AudioClient.GetMixFormat() 返回 AUDCLNT_E_NOT_INITIALIZED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16857089/
我在 wp8 中使用 WASAPI。每次返回不同大小的缓冲区时,我都在共享模式下使用 Getbuffer 方法。我在 8000Hz/16bit 中捕获,有时是 Getbuffer 返回包含 80 个样
我正在为需要能够在各种设备上录制和播放的程序开发音频代码,其中一些是高端设备,具有各种不同的 wav 和 AIFF 格式。我希望能够使用 WASAPI 库,但我遇到了一些主要问题。目前最大的问题是,据
我正在尝试使用 WASAPI 通过输出设备打开独占流。我在选择可接受的格式时遇到问题,因为似乎没有关于给定设备接受哪些格式的提示。 在我的例子中,IAudioClient::GetMixFormat(
如何使用 WASAPI(或类似的东西)将音频连续采样到(线程安全)环形缓冲区中,以便消费者线程可以在设定的时间间隔内从该缓冲区读取? 目前我们有一个.sample()在设定的采样间隔后返回大量样本的方
按照排他模式流中的示例,我使用Windows核心音频功能(主要是WASAPI)来呈现排他流。 这将创建两个交替播放并交替填充的缓冲区。有一个与缓冲区完成有关的事件会唤醒线程,以便它可以重新填充刚刚完成
我们有一个使用 waveXXX() 的应用程序和 mixerXXX()处理与某些乐器之间的音频 I/O 的功能(想想:示波器或电子设备而不是乐器,这并不重要)。终于到了停止在 Windows XP 上
我想分析我的默认播放设备并检测节拍。我一直在使用 BASS WASAPI 来获取所选设备的 FFT 数据: int ret = BassWasapi.BASS_WASAPI_GetData(_fft,
我正在阅读文档,例如 Capturing a stream或 Loopback recording ,但我找不到关于如何使用 Windows WASAPI 从 Loopback 音频设备(有时称为“您
我目前正在阅读MSDN的文档,以将流渲染到音频渲染器。 换句话说,就是从麦克风播放我捕获的数据。 http://msdn.microsoft.com/en-us/library/dd316756%28
我用 wasapi用于环回捕获。之后的所有数据都保存到wav文件。 当它开始捕获时,它一直在传递数据,直到我停止捕获过程,即使没有应用程序使用音频设备,因此没有人产生音乐。结果,我写入文件不是有值(v
我正在尝试使用 Windows 核心音频 API 从麦克风捕获音频 相关的代码行是 const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEn
我正在使用 NAudio 并尝试使用 WasapiLoopbackCapture 记录在我的电脑上播放的内容。我遇到的问题是我需要将记录的数据作为 PCM 16 位 44100khz 单声道。为此,我
我正在尝试编写一个与 Windows Core Audio 和 WASAPI 接口(interface)的程序。我在使用以下几行时遇到困难。 CComHeapPtr name; hr = pAudio
我有一个 DSP 软件,可以在共享环回模式下使用 WASAPI api 捕获播放的音频。 hr = _pAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED
当我在其中一个扬声器上打开独占模式音频流时,会发出奇怪的嗡嗡声。这种嗡嗡声不会在我的其他设备上的相同条件下发生,也不会在一般的独占推送模式或共享模式下发生。 问题似乎是 WASAPI 将周期设置为比我
是否有可能排除音频数据被 IAudioClient 环回模式(AUDCLNT_STREAMFLAGS_LOOPBACK)捕获,或者呈现一个不包含在环回捕获的音频数据。 独占模式 (AUDCLNT_SH
我尝试在独占模式下使用 Windows Audio Session API (WASAPI) 播放简单的正弦波形,但无论我做什么,都会遇到声音故障。我一直在使用 MSDN Exclusive-Mode
我第一次尝试使用 AudioClient 界面,但运气不好。到目前为止,我设法使用成功的 MMDeviceEnumerator 和 MMDevice 接口(interface)获得了默认的 Audio
我正在启动一个最低要求为 Windows 7 的项目。我将使用 NAudio 作为我的音频接口(interface)。我不确定我应该使用什么:DirectSound 还是 WASAPI?我将执行以下操
sample code of WASAPI capture on MSDN , 循环直到 GetNextPacketSize 返回 0。 我只是想了解什么时候会发生这种情况: 如果麦克风上注册了静音,
我是一名优秀的程序员,十分优秀!