windows-nt/Source/XPSP1/NT/multimedia/directx/dplay/dvoice/dxvoice/dvsetup.cpp
2020-09-26 16:20:57 +08:00

169 lines
4.1 KiB
C++

/*==========================================================================
*
* Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
*
* File: dvsetup.c
* Content: Implements functions for the DirectXVoiceSetup interface
*
* History:
* Date By Reason
* ==== == ======
* 09/02/99 pnewson Created It
* 10/25/99 rodtoll Bug #114098 - Calling AddRef/Release from seperate threads
* on multiproc can cause improper results
* 11/04/99 pnewson Bug #115297 - removed unused members of Setup interface
* - added HWND to check audio setup
* 11/17/99 rodtoll Bug #116153 - Setup QueryInterface crashes with NULL pointer
* 11/30/99 pnewson Bug #117449 - Parameter validation
* 05/03/2000 rodtoll Bug #33640 - CheckAudioSetup takes GUID * instead of const GUID *
* 08/23/2000 rodtoll DllCanUnloadNow always returning TRUE!
* 10/05/2000 rodtoll Bug #46541 - DPVOICE: A/V linking to dpvoice.lib could cause application to fail init and crash
*
***************************************************************************/
#include "dxvoicepch.h"
#undef DPF_SUBCOMP
#define DPF_SUBCOMP DN_SUBCOMP_VOICE
// defined in unk.cpp
extern LPVOID dvtInterface[];
#undef DPF_MODNAME
#define DPF_MODNAME "DVT_ValidDirectXVoiceSetupObject"
// DV_ValidDirectXVoiceSetupObject
//
// Checks to ensure the specified pointer points to a valid directvoice setup
// object.
BOOL DVT_ValidDirectXVoiceSetupObject( LPDIRECTVOICESETUPOBJECT lpdvt )
{
if (lpdvt == NULL)
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Invalid Setup object pointer");
return FALSE;
}
if (!DNVALID_READPTR(lpdvt, sizeof(LPDIRECTVOICESETUPOBJECT)))
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Invalid Setup object pointer");
return FALSE;
}
if( lpdvt->lpVtbl != dvtInterface )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Invalid setup vtable" );
return FALSE;
}
if ( lpdvt->lpDVSetup == NULL )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Inavlid CDirectVoiceSetup pointer");
return FALSE;
}
if (!DNVALID_READPTR(lpdvt->lpDVSetup, sizeof(CDirectVoiceSetup)))
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Inavlid CDirectVoiceSetup pointer");
return FALSE;
}
return TRUE;
}
#undef DPF_MODNAME
#define DPF_MODNAME "DVT_AddRef"
STDAPI DVT_AddRef(LPDIRECTVOICESETUPOBJECT lpDVT)
{
LONG rc;
DNEnterCriticalSection( &lpDVT->csCountLock );
rc = ++lpDVT->lIntRefCnt;
DNLeaveCriticalSection( &lpDVT->csCountLock );
return rc;
}
#undef DPF_MODNAME
#define DPF_MODNAME "DVT_Release"
STDAPI DVT_Release(LPDIRECTVOICESETUPOBJECT lpDV )
{
HRESULT hr=S_OK;
LONG rc;
DNEnterCriticalSection( &lpDV->csCountLock );
if (lpDV->lIntRefCnt == 0)
{
DNLeaveCriticalSection( &lpDV->csCountLock );
return 0;
}
// dec the interface count
rc = --lpDV->lIntRefCnt;
if (0 == rc)
{
DNLeaveCriticalSection( &lpDV->csCountLock );
delete lpDV->lpDVSetup;
DNDeleteCriticalSection( &lpDV->csCountLock );
DNFree(lpDV);
DecrementObjectCount();
}
else
{
DNLeaveCriticalSection( &lpDV->csCountLock );
}
return rc;
}
#undef DPF_MODNAME
#define DPF_MODNAME "DVT_QueryInterface"
STDMETHODIMP DVT_QueryInterface(LPDIRECTVOICESETUPOBJECT lpDVT, REFIID riid, LPVOID * ppvObj)
{
HRESULT hr = S_OK;
if( ppvObj == NULL ||
!DNVALID_WRITEPTR( ppvObj, sizeof( LPVOID ) ) )
{
return DVERR_INVALIDPOINTER;
}
*ppvObj=NULL;
if( IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_IDirectPlayVoiceTest ) )
{
*ppvObj = lpDVT;
DVT_AddRef(lpDVT);
}
else
{
hr = E_NOINTERFACE;
}
return hr;
}//DVT_QueryInterface
#undef DPF_MODNAME
#define DPF_MODNAME "DVT_CheckAudioSetup"
STDMETHODIMP DVT_CheckAudioSetup(LPDIRECTVOICESETUPOBJECT This, const GUID * lpguidRenderDevice, const GUID * lpguidCaptureDevice, HWND hwndParent, DWORD dwFlags)
{
DPFX(DPFPREP, DVF_ENTRYLEVEL, "Enter");
if( !DVT_ValidDirectXVoiceSetupObject( This ) )
return DVERR_INVALIDOBJECT;
HRESULT hr;
hr = This->lpDVSetup->CheckAudioSetup( lpguidRenderDevice, lpguidCaptureDevice, hwndParent, dwFlags );
DPFX(DPFPREP, DVF_ENTRYLEVEL, "Exit");
return hr;
}