Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*==========================================================================
* * Copyright (C) 1999 Microsoft Corporation. All Rights Reserved. * * File: dpvxmisc.cpp * Content: Useful misc utility functions lib for sample apps * * History: * Date By Reason * ==== == ====== * 10/07/99 rodtoll Created It * 10/15/99 rodtoll Plugged memory leaks * 01/24/2000 pnewson Prefix detected bug fix * 01/28/2000 rodtoll Prefix detected bug fix * 03/03/2000 rodtoll Updated to handle alternative gamevoice build. * 06/28/2000 rodtoll Prefix Bug #38033 * 08/31/2000 rodtoll Prefix Bug #171842 * ***************************************************************************/
#include "dpvxlibpch.h"
HRESULT DPVDX_GetCompressionName( GUID guidCT, LPTSTR lpstrName, LPDWORD lpdwNameLength ) { BOOL fCoCalled = FALSE; LPDIRECTPLAYVOICECLIENT lpdpvClient = NULL; LPBYTE lpBuffer = NULL; DWORD dwSize = 0; DWORD dwNumElements = 0; LPDVCOMPRESSIONINFO lpdvCompressionInfo; LPSTR lpszName; HRESULT hr; DWORD dwIndex;
if( lpdwNameLength == NULL ) return DVERR_INVALIDPARAM;
hr = CoCreateInstance( DPVOICE_CLSID_DPVOICE, NULL, CLSCTX_INPROC_SERVER, IID_IDirectPlayVoiceClient, (void **) &lpdpvClient );
if( hr == 0x800401f0 ) { fCoCalled = TRUE;
hr = CoInitialize(NULL);
if( FAILED( hr ) ) { goto ERROR_CLEANUP; }
hr = CoCreateInstance( DPVOICE_CLSID_DPVOICE, NULL, CLSCTX_INPROC_SERVER, IID_IDirectPlayVoiceClient, (void **) &lpdpvClient ); }
if( FAILED( hr ) ) { goto ERROR_CLEANUP; }
hr = lpdpvClient->GetCompressionTypes( lpBuffer, &dwSize, &dwNumElements, 0 );
if( hr != DVERR_BUFFERTOOSMALL ) { goto ERROR_CLEANUP; }
lpBuffer = new BYTE[dwSize];
if( lpBuffer == NULL ) { hr = DVERR_OUTOFMEMORY; goto ERROR_CLEANUP; }
hr = lpdpvClient->GetCompressionTypes( lpBuffer, &dwSize, &dwNumElements, 0 );
if( FAILED( hr ) ) { goto ERROR_CLEANUP; }
lpdvCompressionInfo = (LPDVCOMPRESSIONINFO) lpBuffer;
for( dwIndex = 0; dwIndex < dwNumElements; dwIndex++ ) { if( lpdvCompressionInfo[dwIndex].guidType == guidCT ) { if (lpdvCompressionInfo[dwIndex].lpszName == NULL) { hr = DVERR_GENERIC; goto ERROR_CLEANUP; } #ifdef _UNICODE
if( wcslen( lpdvCompressionInfo[dwIndex].lpszName )+1 > *lpdwNameLength ) { *lpdwNameLength = wcslen( lpdvCompressionInfo[dwIndex].lpszName )+1; goto ERROR_CLEANUP; } else { wcscpy( lpstrName, lpdvCompressionInfo[dwIndex].lpszName ); goto ERROR_CLEANUP; } #else
hr = DPVDX_AllocAndConvertToANSI( &lpszName, lpdvCompressionInfo[dwIndex].lpszName );
if( FAILED( hr ) ) return hr;
if( lpszName == NULL ) { if( lpdwNameLength > 0 ) { _tcscpy( lpszName, _T("") ); hr = DV_OK; } else { hr = DVERR_BUFFERTOOSMALL; }
*lpdwNameLength = 1; } else if( *lpdwNameLength < (_tcsclen( lpszName )+1) || lpstrName == NULL ) { *lpdwNameLength = _tcsclen( lpszName ) + 1; hr = DVERR_BUFFERTOOSMALL; delete [] lpszName; goto ERROR_CLEANUP; } else { _tcscpy( lpstrName, lpszName ); delete [] lpszName; goto ERROR_CLEANUP; } #endif
} }
delete [] lpBuffer;
hr = DVERR_COMPRESSIONNOTSUPPORTED;
ERROR_CLEANUP:
if( lpBuffer != NULL ) delete [] lpBuffer;
if( lpdpvClient != NULL ) lpdpvClient->Release();
if( fCoCalled ) CoUninitialize();
return hr; }
|