169 lines
4.1 KiB
C++
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;
|
|
}
|
|
|