2025-04-27 07:49:33 -04:00

240 lines
6.9 KiB
C++

/*==========================================================================;
*
* Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
*
* File: dpvautil.cpp
* Content: Source file for ACM utils
*
* History:
* Date By Reason
* =========== =========== ====================
* 10/27/99 rodtoll created
* 12/16/99 rodtoll Bug #123250 - Insert proper names/descriptions for codecs
* Codec names now based on resource entries for format and
* names are constructed using ACM names + bitrate.
* 04/21/2000 rodtoll Bug #32889 - Does not run on Win2k on non-admin account
* 06/28/2000 rodtoll Prefix Bug #38034
*
***************************************************************************/
#include "dpvacmpch.h"
#define REGISTRY_CDB_FORMAT L"Format"
#define REGISTRY_CT_FRAMESPERBUFFER L"FramesPerBuffer"
#define REGISTRY_CT_TRAILFRAMES L"TrailFrames"
#define REGISTRY_CT_TIMEOUT L"Timeout"
#define REGISTRY_CT_FRAMELENGTH L"FrameLength"
#define REGISTRY_CT_FRAMELENGTH8KHZ L"FrameLength8Khz"
#define REGISTRY_CT_FRAMELENGTH11KHZ L"FrameLength11Khz"
#define REGISTRY_CT_FRAMELENGTH22KHZ L"FrameLength22Khz"
#define REGISTRY_CT_FRAMELENGTH44KHZ L"FrameLength44Khz"
#define REGISTRY_CT_MAXBITSPERSEC L"MaxBitsPerSec"
#define REGISTRY_CT_FLAGS L"Flags"
#define REGISTRY_CT_NAME L"Name"
#define REGISTRY_CT_DESCRIPTION L"Description"
#define REGISTRY_CT_MINCONNECT L"MinConnect"
#define REGISTRY_CT_INNERQUEUESIZE L"InnerQueueSize"
#define REGISTRY_CT_MAXHIGHWATERMARK L"MaxWatermark"
#define REGISTRY_CT_MAXQUEUESIZE L"MaxQueueSize"
#define REGISTRY_CT_GUID L"GUID"
// Check to see if ACM's PCM converter is available
#undef DPF_MODNAME
#define DPF_MODNAME "IsPCMConverterAvailable"
HRESULT IsPCMConverterAvailable()
{
MMRESULT mmr;
HACMSTREAM has = NULL;
HACMDRIVERID acDriverID = NULL;
HRESULT hr;
CWaveFormat wfxOuterFormat, wfxInnerFormat;
hr = wfxOuterFormat.InitializePCM( 22050, FALSE, 8 );
if( FAILED( hr ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error building outer format PCM hr=0x%x", hr );
return hr;
}
hr = wfxInnerFormat.InitializePCM( 8000, FALSE, 16 );
if( FAILED( hr ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error building inner format PCM hr=0x%x", hr );
return hr;
}
// Attempt to open
mmr = acmStreamOpen( &has, NULL, wfxOuterFormat.GetFormat(), wfxInnerFormat.GetFormat(), NULL, 0, 0, ACM_STREAMOPENF_NONREALTIME );
if( mmr != 0 )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Compression type driver disabled or not installed. mmr=0x%x", mmr );
return DVERR_COMPRESSIONNOTSUPPORTED;
}
acmStreamClose( has, 0 );
return DV_OK;
}
#undef DPF_MODNAME
#define DPF_MODNAME "CREG_ReadCompressionInfo"
HRESULT CREG_ReadCompressionInfo( HKEY hkeyReg, const LPWSTR lpszPath, LPDVFULLCOMPRESSIONINFO lpdvfCompressionInfo )
{
CRegistry cregCT;
HRESULT hr;
DWORD dwTmp, dwTmpLength;
BOOL fRead;
CWaveFormat wfxFormat;
lpdvfCompressionInfo->lpszName = NULL;
lpdvfCompressionInfo->lpszDescription = NULL;
if( !cregCT.Open( hkeyReg, lpszPath, TRUE, FALSE ) )
{
return E_FAIL;
}
lpdvfCompressionInfo->lpwfxFormat = NULL;
hr = wfxFormat.InitializeREG( cregCT.GetHandle(), REGISTRY_CDB_FORMAT );
if( FAILED( hr ) )
{
goto READCT_FAILURE;
}
lpdvfCompressionInfo->lpwfxFormat = wfxFormat.Disconnect();
if( !cregCT.ReadDWORD( REGISTRY_CT_FRAMESPERBUFFER, lpdvfCompressionInfo->dwFramesPerBuffer ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading framesperbuffer key from registry" );
goto READCT_FAILURE;
}
if( !cregCT.ReadDWORD( REGISTRY_CT_TRAILFRAMES, lpdvfCompressionInfo->dwTrailFrames ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading trailframe key from registry" );
goto READCT_FAILURE;
}
if( !cregCT.ReadDWORD( REGISTRY_CT_TIMEOUT, lpdvfCompressionInfo->dwTimeout ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading timeout key from registry" );
goto READCT_FAILURE;
}
if( !cregCT.ReadDWORD( REGISTRY_CT_FRAMELENGTH, lpdvfCompressionInfo->dwFrameLength ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading framelength key from registry" );
goto READCT_FAILURE;
}
if( !cregCT.ReadDWORD( REGISTRY_CT_FRAMELENGTH8KHZ, lpdvfCompressionInfo->dwFrame8Khz ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading frame8 key from reg" );
goto READCT_FAILURE;
}
if( !cregCT.ReadDWORD( REGISTRY_CT_FRAMELENGTH11KHZ, lpdvfCompressionInfo->dwFrame11Khz ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading frame11 key from reg" );
goto READCT_FAILURE;
}
if( !cregCT.ReadDWORD( REGISTRY_CT_FRAMELENGTH22KHZ, lpdvfCompressionInfo->dwFrame22Khz ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading frame22 key from reg" );
goto READCT_FAILURE;
}
if( !cregCT.ReadDWORD( REGISTRY_CT_FRAMELENGTH44KHZ, lpdvfCompressionInfo->dwFrame44Khz ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading frame44 key from reg" );
goto READCT_FAILURE;
}
if( !cregCT.ReadDWORD( REGISTRY_CT_MAXBITSPERSEC, lpdvfCompressionInfo->dwMaxBitsPerSecond ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading maxbitspersec from reg" );
goto READCT_FAILURE;
}
if( !cregCT.ReadDWORD( REGISTRY_CT_FLAGS, lpdvfCompressionInfo->dwFlags ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading flags from reg" );
goto READCT_FAILURE;
}
dwTmpLength = 0;
fRead = FALSE;
lpdvfCompressionInfo->lpszDescription = NULL;
dwTmpLength = 0;
fRead = FALSE;
lpdvfCompressionInfo->lpszName = NULL;
if( !cregCT.ReadDWORD( REGISTRY_CT_MINCONNECT, dwTmp ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading minconnect from reg" );
goto READCT_FAILURE;
}
lpdvfCompressionInfo->bMinConnectType = (BYTE) dwTmp;
if( !cregCT.ReadDWORD( REGISTRY_CT_INNERQUEUESIZE, dwTmp ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading qs from reg" );
goto READCT_FAILURE;
}
lpdvfCompressionInfo->wInnerQueueSize = (WORD) dwTmp;
if( !cregCT.ReadDWORD( REGISTRY_CT_MAXHIGHWATERMARK, dwTmp ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading highmark key from reg" );
goto READCT_FAILURE;
}
lpdvfCompressionInfo->wMaxHighWaterMark = (WORD) dwTmp;
if( !cregCT.ReadDWORD( REGISTRY_CT_MAXQUEUESIZE, dwTmp ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading maxqueue key from reg" );
goto READCT_FAILURE;
}
lpdvfCompressionInfo->bMaxQueueSize = (BYTE) dwTmp;
if( !cregCT.ReadGUID( REGISTRY_CT_GUID, lpdvfCompressionInfo->guidType ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Error reading guid key from reg" );
goto READCT_FAILURE;
}
return S_OK;
READCT_FAILURE:
if( lpdvfCompressionInfo->lpszName != NULL )
{
delete [] lpdvfCompressionInfo->lpszName;
}
if( lpdvfCompressionInfo->lpszDescription != NULL )
{
delete [] lpdvfCompressionInfo->lpszDescription;
}
return E_FAIL;
}