windows-nt/Source/XPSP1/NT/net/tapi/skywalker/rcamsp/rcaaddr.cpp
2020-09-26 16:20:57 +08:00

310 lines
7.8 KiB
C++

/*++
Copyright (c) 1998-1999 Microsoft Corporation
Module Name:
waveaddr.cpp
Abstract:
This module contains implementation of CRCAMSP.
Author:
Zoltan Szilagyi (zoltans) September 7, 1998
--*/
#include "stdafx.h"
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
CRCAMSP::CRCAMSP()
{
LOG((MSP_TRACE, "CRCAMSP::CRCAMSP entered."));
m_fUseMulaw = DecideEncodingType();
LOG((MSP_TRACE, "CRCAMSP::CRCAMSP exited."));
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
CRCAMSP::~CRCAMSP()
{
LOG((MSP_TRACE, "CRCAMSP::~CRCAMSP entered."));
LOG((MSP_TRACE, "CRCAMSP::~CRCAMSP exited."));
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
ULONG CRCAMSP::MSPAddressAddRef(void)
{
return MSPAddRefHelper(this);
}
ULONG CRCAMSP::MSPAddressRelease(void)
{
return MSPReleaseHelper(this);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP CRCAMSP::CreateMSPCall(
IN MSP_HANDLE htCall,
IN DWORD dwReserved,
IN DWORD dwMediaType,
IN IUnknown * pOuterUnknown,
OUT IUnknown ** ppMSPCall
)
{
LOG((MSP_TRACE, "CRCAMSP::CreateMSPCall - enter"));
CRCAMSPCall * pCRCAMSPCall;
HRESULT hr = CreateMSPCallHelper<CRCAMSPCall>(this,
htCall,
dwReserved,
dwMediaType,
pOuterUnknown,
ppMSPCall,
&pCRCAMSPCall);
//
// pCRCAMSPCall is not addrefed; no need to release.
//
if ( FAILED(hr) )
{
LOG((MSP_ERROR, "CRCAMSP::CreateMSPCall - template helper returned"
"0x%08x", hr));
return hr;
}
LOG((MSP_TRACE, "CRCAMSP::CreateMSPCall - exit S_OK"));
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP CRCAMSP::ShutdownMSPCall (
IN IUnknown * pMSPCall
)
{
LOG((MSP_TRACE, "CRCAMSP::ShutdownMSPCall - enter"));
CRCAMSPCall * pCRCAMSPCall;
HRESULT hr = ShutdownMSPCallHelper<CRCAMSPCall>(pMSPCall,
&pCRCAMSPCall);
//
// pCRCAMSPCall is not addrefed; no need to release.
//
if ( FAILED(hr) )
{
LOG((MSP_ERROR, "CRCAMSP::ShutdownMSPCall - template helper returned"
"0x%08x", hr));
return hr;
}
LOG((MSP_TRACE, "CRCAMSP::ShutdownMSPCall - exit S_OK"));
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// CreateTerminal: overriden to set specific format on creation of MST.
//
STDMETHODIMP CRCAMSP::CreateTerminal (
IN BSTR pTerminalClass,
IN long lMediaType,
IN TERMINAL_DIRECTION Direction,
OUT ITTerminal ** ppTerminal
)
{
LOG((MSP_TRACE, "CRCAMSP::CreateTerminal - enter"));
//
// Call the base class method to create the terminal.
//
HRESULT hr = CMSPAddress::CreateTerminal ( pTerminalClass,
lMediaType,
Direction,
ppTerminal );
if ( FAILED(hr) )
{
LOG((MSP_ERROR, "CRCAMSP::CreateTerminal - "
"base class method failed - exit 0x%08x", hr));
return hr;
}
//
// Get the IID for the terminal class from the BSTR representation that
// was passed in.
//
IID iidTerminalClass;
hr = CLSIDFromString(pTerminalClass, &iidTerminalClass);
if ( FAILED(hr) )
{
LOG((MSP_ERROR, "CRCAMSP::CreateTerminal - "
"cannot convert CLSID string - returning E_INVALIDARG"));
(*ppTerminal)->Release();
*ppTerminal = NULL;
return E_INVALIDARG;
}
//
// If this is not an audio MST, then do nothing.
//
if ( ( iidTerminalClass != CLSID_MediaStreamTerminal ) ||
( lMediaType != TAPIMEDIATYPE_AUDIO ) )
{
LOG((MSP_TRACE, "CRCAMSP::CreateTerminal - "
"this is not an MST - exit S_OK"));
return S_OK;
}
//
// This is an audio MST. Set the audio format on the MST.
//
LOG((MSP_TRACE, "CRCAMSP::CreateTerminal - this is an audio MST"));
hr = ::SetAudioFormat(*ppTerminal,
BITS_PER_SAMPLE_AT_TERMINAL,
SAMPLE_RATE_AT_TERMINAL);
if ( FAILED(hr) )
{
LOG((MSP_ERROR, "CRCAMSP::CreateTerminal - "
"failed to set audio format on audio MST - exit 0x%08x", hr));
(*ppTerminal)->Release();
*ppTerminal = NULL;
return hr;
}
LOG((MSP_TRACE, "CRCAMSP::CreateTerminal - "
"successfully set audio format on audio MST - exit S_OK"));
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Mandatory CMSPAddress override. This indicates the media types that
// we support.
//
DWORD CRCAMSP::GetCallMediaTypes(void)
{
return (DWORD) TAPIMEDIATYPE_AUDIO;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// DecideEncodingType
//
// Private helper function. We use this to determine whether to use Mulaw on
// the wire, based on the location info in the tapi dialing rules.
//
// Return values: TRUE == Mulaw, FALSE = Alaw
//
BOOL CRCAMSP::DecideEncodingType(void)
{
LOG((MSP_TRACE, "CRCAMSP::DecideEncodingType - enter"));
//
// Find out where we are.
//
char szCountryCode[8];
char szCityCode[8];
long lResult;
lResult = tapiGetLocationInfoA(
szCountryCode,
szCityCode
);
//
// If the user has no location set up, or if there is some other
// error, we assume Mulaw. Otherwise, we use Mulaw for country code
// 1 (USA, Canada, Caribbean) and Alaw for everywhere else.
//
if ( lResult != NOERROR )
{
LOG((MSP_WARN, "CRCAMSP::DecideEncodingType - "
"tapiGetLocationInfoA returned %d - assuming Mulaw", lResult));
return TRUE;
}
else if ( ! strcmp( "1", szCountryCode) )
{
LOG((MSP_TRACE, "CRCAMSP::DecideEncodingType - "
"country code %s == 1 - using Mulaw", szCountryCode));
return TRUE;
}
else
{
LOG((MSP_TRACE, "CRCAMSP::DecideEncodingType - "
"country code %s != 1 - using Alaw", szCountryCode));
return FALSE;
}
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// UseMulaw
//
// Private helper function. We use this to determine whether to use Mulaw on
// the wire, based on the info saved in the address constructor from
// DecideEncodingType.
//
// Return values: TRUE == Mulaw, FALSE = Alaw
//
BOOL CRCAMSP::UseMulaw( void )
{
return m_fUseMulaw;
}
// eof