我第一次尝试使用AudioClient接口,没有运气。 到目前为止,我设法使用成功的MMDeviceEnumerator和MMDevice接口获取默认的AudioClient接口:
CoCreateInstance(
CLSID_MMDeviceEnumerator, nil,
CLSCTX_ALL, IID_IMMDeviceEnumerator,
MMEnumerator);
MMEnumerator.GetDefaultAudioEndpoint(eRender,eConsole,MMDevice);
MMDevice.Activate(IID_IAudioClient, CLSCTX_ALL, nil, AudioClient);
(此处不包括结果检查代码)。这3个调用都没有返回错误,我在AudioClient变量中有一个非零接口ptr。 我的问题是当我尝试获得混合波形时:
AudioClient.GetMixFormat(pwfx)
返回代码0x88890001,即AUDCLNT_E_NOT_INITIALIZED。 - >当然没有初始化,因为我只想先得到它喜欢的waveformat。
查找msdn告诉可以在AudioClient.Initialization之前调用AudioClient.GetMixFormat。此外,AUDCLNT_E_NOT_INITIALIZED不在可能的返回值列表中。所以我对自己做错了什么感到困惑。 GetMixFormat()doc - > http://msdn.microsoft.com/en-us/library/windows/desktop/dd370872(v=vs.85).aspx
另一个奇怪的事情是,当我调用AudioClient.GetStreamLatency()时,它返回S_OK并且具有大约1000ms的准随机值。但是文档声明“此方法需要事先初始化IAudioClient接口。对此方法的所有调用都将失败并返回错误AUDCLNT_E_NOT_INITIALIZED,直到客户端通过成功调用”来初始化音频流“。因此我认为我有一个工作的AudioClient接口,我只是无法理解为什么它不像文档说的那样工作。
(我正在使用win7 64bit,带有kx项目驱动程序的Sound Blaster Live 5.1(DSound和经典Windows MM声音工作正常,但是长时间延迟100毫秒,这就是我要使用WASAPI的唯一原因在win7)
提前谢谢。
答案 0 :(得分:1)
我实际上发现了这个错误。 MFPack 中IAudioClient
的定义不正确,接口功能顺序错误。 (有一天我想以某种方式推动它,如果我找到它的时间,转移到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;