2013-05-31 3 views
2

Я пытаюсь использовать интерфейс AudioClient в первый раз, не повезло. До сих пор мне удалось получить интерфейс по умолчанию AudioClient используя успешно интерфейсы MMDeviceEnumerator и MMDevice: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-х вызов не возвратил никаких ошибок, и у меня есть нетривиальный интерфейс ptr в переменной AudioClient. Моя проблема в том, когда я пытаюсь получить смесительный waveformat:

AudioClient.GetMixFormat(pwfx) 

Это возвращает код 0x88890001, который AUDCLNT_E_NOT_INITIALIZED. -> Конечно, не инициализирован, так как я только хотел получить тот волновой сигнал, который ему нравится в первую очередь.

В поисках msdn говорится, что AudioClient.GetMixFormat можно вызвать до AudioClient. Инициализация. Кроме того, AUDCLNT_E_NOT_INITIALIZED не входит в список возможных возвращаемых значений. Поэтому я смущен тем, что я сделал неправильно. GetMixFormat() doc ->http://msdn.microsoft.com/en-us/library/windows/desktop/dd370872(v=vs.85).aspx

Еще одна странность в том, что когда я вызываю AudioClient.GetStreamLatency(), он возвращается с S_OK и с квази-случайным значением около 1000 мс. Но в документации указывается, что «этот метод требует предварительной инициализации интерфейса IAudioClient. Все вызовы этого метода будут сбой с ошибкой AUDCLNT_E_NOT_INITIALIZED, пока клиент не инициализирует аудиопоток, успешно вызвав«. Поэтому я думаю, что у меня есть рабочий интерфейс AudioClient, я просто не понимаю, почему он не работает, как говорит документация.

(Я использую win7 64bit, Sound Blaster Live 5.1 с драйвером kx-проекта (звук DSound и классический звук в Windows работает нормально, но с 100-миллиметровой ужасной длительной задержкой это единственная причина, по которой я собираюсь использовать 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; 
Смежные вопросы