📄 common.cpp
字号:
/*****************************************************************************
* common.cpp - Common code used by all the sb16 miniports.
*****************************************************************************
* Copyright (c) 1997-2000 Microsoft Corporation. All rights reserved.
*
* Implmentation of the common code object. This class deals with interrupts
* for the device, and is a collection of common code used by all the
* miniports.
*/
#include "common.h"
#define STR_MODULENAME "sb16Adapter: "
/*****************************************************************************
* CAdapterCommon
*****************************************************************************
* Adapter common object.
*/
class CAdapterCommon
: public IAdapterCommon,
public IAdapterPowerManagement,
public CUnknown
{
private:
PINTERRUPTSYNC m_pInterruptSync;
PUCHAR m_pWaveBase;
PWAVEMINIPORTSB16 m_WaveMiniportSB16;
#ifdef EVENT_SUPPORT
PTOPOMINIPORTSB16 m_TopoMiniportSB16; // Topology miniport of SB16.
#endif
PDEVICE_OBJECT m_pDeviceObject;
DEVICE_POWER_STATE m_PowerState;
BYTE MixerSettings[DSP_MIX_MAXREGS];
void AcknowledgeIRQ
( void
);
public:
DECLARE_STD_UNKNOWN();
DEFINE_STD_CONSTRUCTOR(CAdapterCommon);
~CAdapterCommon();
/*****************************************************************************
* IAdapterCommon methods
*/
STDMETHODIMP_(NTSTATUS) Init
(
IN PRESOURCELIST ResourceList,
IN PDEVICE_OBJECT DeviceObject
);
STDMETHODIMP_(PINTERRUPTSYNC) GetInterruptSync
( void
);
STDMETHODIMP_(void) SetWaveMiniport (IN PWAVEMINIPORTSB16 Miniport)
{
m_WaveMiniportSB16 = Miniport;
}
STDMETHODIMP_(BYTE) ReadController
( void
);
STDMETHODIMP_(BOOLEAN) WriteController
(
IN BYTE Value
);
STDMETHODIMP_(NTSTATUS) ResetController
( void
);
STDMETHODIMP_(void) MixerRegWrite
(
IN BYTE Index,
IN BYTE Value
);
STDMETHODIMP_(BYTE) MixerRegRead
(
IN BYTE Index
);
STDMETHODIMP_(void) MixerReset
( void
);
STDMETHODIMP RestoreMixerSettingsFromRegistry
( void
);
STDMETHODIMP SaveMixerSettingsToRegistry
( void
);
#ifdef EVENT_SUPPORT
//
// The topology miniport needs to tell us the pointer to the Event-interface.
//
STDMETHODIMP_(void) SetTopologyMiniport (IN PTOPOMINIPORTSB16 Miniport)
{
m_TopoMiniportSB16 = Miniport;
};
#endif
/*************************************************************************
* IAdapterPowerManagement implementation
*
* This macro is from PORTCLS.H. It lists all the interface's functions.
*/
IMP_IAdapterPowerManagement;
friend
NTSTATUS
InterruptServiceRoutine
(
IN PINTERRUPTSYNC InterruptSync,
IN PVOID DynamicContext
);
};
static
MIXERSETTING DefaultMixerSettings[] =
{
{ L"LeftMasterVol", DSP_MIX_MASTERVOLIDX_L, 0xD8 },
{ L"RightMasterVol", DSP_MIX_MASTERVOLIDX_R, 0xD8 },
{ L"LeftWaveVol", DSP_MIX_VOICEVOLIDX_L, 0xD8 },
{ L"RightWaveVol", DSP_MIX_VOICEVOLIDX_R, 0xD8 },
{ L"LeftMidiVol", DSP_MIX_FMVOLIDX_L, 0xD8 },
{ L"RightMidiVol", DSP_MIX_FMVOLIDX_R, 0xD8 },
{ L"LeftCDVol", DSP_MIX_CDVOLIDX_L, 0xD8 },
{ L"RightCDVol", DSP_MIX_CDVOLIDX_R, 0xD8 },
{ L"LeftLineInVol", DSP_MIX_LINEVOLIDX_L, 0xD8 },
{ L"RightLineInVol", DSP_MIX_LINEVOLIDX_R, 0xD8 },
{ L"MicVol", DSP_MIX_MICVOLIDX, 0xD8 },
{ L"PcSpkrVol", DSP_MIX_SPKRVOLIDX, 0x00 },
{ L"OutputMixer", DSP_MIX_OUTMIXIDX, 0x1E },
{ L"LeftInputMixer", DSP_MIX_ADCMIXIDX_L, 0x55 },
{ L"RightInputMixer", DSP_MIX_ADCMIXIDX_R, 0x2B },
{ L"LeftInputGain", DSP_MIX_INGAINIDX_L, 0x00 },
{ L"RightInputGain", DSP_MIX_INGAINIDX_R, 0x00 },
{ L"LeftOutputGain", DSP_MIX_OUTGAINIDX_L, 0x80 },
{ L"RightOutputGain", DSP_MIX_OUTGAINIDX_R, 0x80 },
{ L"MicAGC", DSP_MIX_AGCIDX, 0x01 },
{ L"LeftTreble", DSP_MIX_TREBLEIDX_L, 0x80 },
{ L"RightTreble", DSP_MIX_TREBLEIDX_R, 0x80 },
{ L"LeftBass", DSP_MIX_BASSIDX_L, 0x80 },
{ L"RightBass", DSP_MIX_BASSIDX_R, 0x80 },
};
#pragma code_seg("PAGE")
/*****************************************************************************
* NewAdapterCommon()
*****************************************************************************
* Create a new adapter common object.
*/
NTSTATUS
NewAdapterCommon
(
OUT PUNKNOWN * Unknown,
IN REFCLSID,
IN PUNKNOWN UnknownOuter OPTIONAL,
IN POOL_TYPE PoolType
)
{
PAGED_CODE();
ASSERT(Unknown);
STD_CREATE_BODY_
(
CAdapterCommon,
Unknown,
UnknownOuter,
PoolType,
PADAPTERCOMMON
);
}
/*****************************************************************************
* CAdapterCommon::Init()
*****************************************************************************
* Initialize an adapter common object.
*/
NTSTATUS
CAdapterCommon::
Init
(
IN PRESOURCELIST ResourceList,
IN PDEVICE_OBJECT DeviceObject
)
{
PAGED_CODE();
ASSERT(ResourceList);
ASSERT(DeviceObject);
//
// Make sure we have the resources we expect
//
if ((ResourceList->NumberOfPorts() < 1) ||
(ResourceList->NumberOfInterrupts() != 1))
{
_DbgPrintF (DEBUGLVL_TERSE, ("unknown configuration; check your code!"));
// Bail out.
return STATUS_INSUFFICIENT_RESOURCES;
}
m_pDeviceObject = DeviceObject;
m_WaveMiniportSB16 = NULL;
#ifdef EVENT_SUPPORT
m_TopoMiniportSB16 = NULL;
#endif
//
// Get the base address for the wave device.
//
ASSERT(ResourceList->FindTranslatedPort(0));
m_pWaveBase = (PUCHAR)(ResourceList->FindTranslatedPort(0)->u.Port.Start.QuadPart);
//
// Set initial device power state
//
m_PowerState = PowerDeviceD0;
//
// Reset the hardware.
//
NTSTATUS ntStatus = ResetController();
if(NT_SUCCESS(ntStatus))
{
_DbgPrintF(DEBUGLVL_VERBOSE,("ResetController Succeeded"));
AcknowledgeIRQ();
//
// Hook up the interrupt.
//
ntStatus = PcNewInterruptSync( // See portcls.h
&m_pInterruptSync, // Save object ptr
NULL, // OuterUnknown(optional).
ResourceList, // He gets IRQ from ResourceList.
0, // Resource Index
InterruptSyncModeNormal // Run ISRs once until we get SUCCESS
);
if (NT_SUCCESS(ntStatus) && m_pInterruptSync)
{ // run this ISR first
ntStatus = m_pInterruptSync->RegisterServiceRoutine(InterruptServiceRoutine,PVOID(this),FALSE);
if (NT_SUCCESS(ntStatus))
{
ntStatus = m_pInterruptSync->Connect();
}
// if we could not connect or register the ISR, release the object.
if (!NT_SUCCESS (ntStatus))
{
m_pInterruptSync->Release();
m_pInterruptSync = NULL;
}
}
} else
{
_DbgPrintF(DEBUGLVL_TERSE,("ResetController Failure"));
}
return ntStatus;
}
/*****************************************************************************
* CAdapterCommon::~CAdapterCommon()
*****************************************************************************
* Destructor.
*/
CAdapterCommon::
~CAdapterCommon
( void
)
{
PAGED_CODE();
_DbgPrintF(DEBUGLVL_VERBOSE,("[CAdapterCommon::~CAdapterCommon]"));
if (m_pInterruptSync)
{
m_pInterruptSync->Disconnect();
m_pInterruptSync->Release();
m_pInterruptSync = NULL;
}
}
/*****************************************************************************
* CAdapterCommon::NonDelegatingQueryInterface()
*****************************************************************************
* Obtains an interface.
*/
STDMETHODIMP
CAdapterCommon::
NonDelegatingQueryInterface
(
REFIID Interface,
PVOID * Object
)
{
PAGED_CODE();
ASSERT(Object);
if (IsEqualGUIDAligned(Interface,IID_IUnknown))
{
*Object = PVOID(PUNKNOWN(PADAPTERCOMMON(this)));
}
else
if (IsEqualGUIDAligned(Interface,IID_IAdapterCommon))
{
*Object = PVOID(PADAPTERCOMMON(this));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -