/*========================================================================== * * 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; }