gpt4 book ai didi

WASAPI AudioClient.GetMixFormat() 返回 AUDCLNT_E_NOT_INITIALIZED

转载 作者:行者123 更新时间:2023-12-05 04:18:17 26 4
gpt4 key购买 nike

我第一次尝试使用 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)

提前谢谢你。

最佳答案

我真的找到了这个错误。 MFPackIAudioClient定义不正确,接口(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com