2013-05-31 62 views
2

我试图第一次使用AudioClient接口,没有运气。 到目前为止,我管理使用成功MMDeviceEnumerator和MMDevice接口获取默认的AudioClient接口:(这里不包括结果校验码)WASAPI AudioClient.GetMixFormat()返回AUDCLNT_E_NOT_INITIALIZED

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。 我的问题是,当我试图让混合WAVEFORMAT:

AudioClient.GetMixFormat(pwfx) 

这将返回该AUDCLNT_E_NOT_INITIALIZED代码0x88890001。 - >当然没有初始化,因为我只想先得到它喜欢的波形格式。

查找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-project驱动的Sound Blaster Live 5.1(DSound和经典的Windows MM音效没问题,但有100ms可怕的长延迟,这就是我要使用的唯一原因WASAPI在WIN7)

预先感谢您。

+1

我忘了告诉一件重要的事情:我用MFPACK https://code.google.com/ p/mfpack-media-foundation/source/browse/trunk/MFPACK/CoreAudio/WASAPI?r = 131库。它有一些错误:在IAudioClient接口中,它包含按字母顺序排列的方法,而不是按照Microsoft设计的顺序。我纠正这一点后,一切正常。 – user2440253

+0

'GetMixFormat'被设计为在'Initialize'调用之前工作。问题可能与硬件驱动程序或您在系统中安装的特定挂钩有关。 –

+0

也出现此错误。似乎与Delphi(或可能是MFPack)有关,因为它在(MS)C++中工作正常。 –

回答

1

我居然发现了错误。的IAudioClient的定义在MFPack不正确,接口函数顺序错误。(我想在某一天以某种方式推这个,如果我找到它的时间,移动到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;