📄 drvrctxt.cpp
字号:
else {
usLeft = 31 - usLeft;
usRight = 31 - usRight;
usRegVal = (usRight << 8) | usLeft;
}
DEBUGMSG(ZONE_VOLUME, (TEXT("CDriverContext::SetVolume(%08x) => %04x\r\n"), ulVolume, usRegVal));
m_pDevice->WriteCodecRegister(AC97_PCMOUT_VOL, usRegVal);
return MMSYSERR_NOERROR;
}
//---------------------------------------------------------------------------
// Power Management Support
//---------------------------------------------------------------------------
void
CDriverContext::PowerUp (void)
{
m_pDevice->SetPowerState(0);
}
void
CDriverContext::PowerDown (void)
{
m_pDevice->SetPowerState(1);
}
// -----------------------------------------------------------------------------
// The Mixer Driver message handler
// -----------------------------------------------------------------------------
DWORD
CDriverContext::MixerMessage(PMMDRV_MESSAGE_PARAMS pParams)
{ DWORD dwRet;
DWORD dwParam1, dwParam2;
UINT uDeviceId;
HSTREAM pStream;
pStream = (HSTREAM) pParams->dwUser;
dwParam1 = pParams->dwParam1;
dwParam2 = pParams->dwParam2;
uDeviceId = pParams->uDeviceId;
if (uDeviceId != 0) {
return MMSYSERR_BADDEVICEID;
}
switch (pParams->uMsg) {
// mixer API messages:
// only
// only purpose of mixer handles at driver level is to provide a target for callbacks.
// as such, only really need one handle per device. if client application(s) open more than one
// mixer handle, the mixer API should MUX them, so driver only have has to manage a single instance.
case MXDM_GETNUMDEVS:
dwRet = 1;
break;
case MXDM_GETDEVCAPS:
dwRet = GetMixerCaps((PMIXERCAPS) dwParam1);
break;
case MXDM_OPEN:
dwRet = OpenMixerHandle((PDWORD) pParams->dwUser, (PMIXEROPENDESC) dwParam1, dwParam2);
break;
case MXDM_CLOSE:
dwRet = CloseMixerHandle(dwParam2);
break;
case MXDM_GETLINECONTROLS:
dwRet = GetMixerLineControls((PMIXERLINECONTROLS) dwParam1, dwParam2);
break;
case MXDM_GETLINEINFO:
dwRet = GetMixerLineInfo((PMIXERLINE) dwParam1, dwParam2);
break;
case MXDM_GETCONTROLDETAILS:
dwRet = GetMixerControlDetails((PMIXERCONTROLDETAILS) dwParam1, dwParam2);
break;
case MXDM_SETCONTROLDETAILS:
dwRet = SetMixerControlDetails((PMIXERCONTROLDETAILS) dwParam1, dwParam2);
break;
default:
dwRet = MMSYSERR_NOTSUPPORTED;
break;
}
return dwRet;
}
// -----------------------------------------------------------------------------
// The Wave Driver message handler
// -----------------------------------------------------------------------------
DWORD
CDriverContext::WaveMessage(PMMDRV_MESSAGE_PARAMS pParams)
{ DWORD dwRet = MMSYSERR_ERROR;
DWORD dwParam1, dwParam2;
UINT uDeviceId;
HSTREAM pStream;
__try {
pStream = (HSTREAM) pParams->dwUser;
dwParam1 = pParams->dwParam1;
dwParam2 = pParams->dwParam2;
uDeviceId = pParams->uDeviceId;
switch (pParams->uMsg) {
//
// device enumeration
//
// This driver supports exactly one input and one output device
case WIDM_GETNUMDEVS:
case WODM_GETNUMDEVS:
dwRet = 1;
break;
//
// device caps
//
case WIDM_GETDEVCAPS:
case WODM_GETDEVCAPS:
if (pStream != NULL || uDeviceId == 0) {
dwRet = GetCaps(pParams->uMsg, (PWAVEOUTCAPS) dwParam1);
}
else {
dwRet = MMSYSERR_BADDEVICEID;
}
break;
case WODM_GETEXTDEVCAPS:
if (uDeviceId == 0) {
dwRet = GetExtCaps((PWAVEOUTEXTCAPS) dwParam1);
}
else {
dwRet = MMSYSERR_BADDEVICEID;
}
break;
//
// stream open
//
case WIDM_OPEN:
case WODM_OPEN:
if (uDeviceId == 0) {
dwRet = OpenStream(pParams->uMsg, (HSTREAM*) pParams->dwUser, (LPWAVEOPENDESC) dwParam1, dwParam2);
}
else {
dwRet = MMSYSERR_BADDEVICEID;
}
break;
//
// Input/Output Shared messages
//
case WIDM_ADDBUFFER:
case WODM_WRITE:
dwRet = pStream->AddBuffer((PWAVEHDR) dwParam1);
break;
case WIDM_CLOSE:
case WODM_CLOSE:
dwRet = pStream->Close();
break;
case WIDM_STOP:
case WODM_PAUSE:
dwRet = pStream->Pause();
break;
case WIDM_START:
case WODM_RESTART:
dwRet = pStream->Unpause();
break;
case WIDM_UNPREPARE:
case WODM_UNPREPARE:
dwRet = pStream->UnprepareHeader((PWAVEHDR) dwParam1);
break;
case WIDM_PREPARE:
case WODM_PREPARE:
dwRet = pStream->PrepareHeader((PWAVEHDR) dwParam1);
break;
case WIDM_RESET:
case WODM_RESET:
dwRet = pStream->Reset();
break;
case WIDM_GETPOS:
case WODM_GETPOS:
dwRet = pStream->GetPosition((PMMTIME) dwParam1);
break;
// Output-only messages
// set/get volume is ugly, because we can get either a valid stream handle
// OR a device iD.
case WODM_GETVOLUME:
if (pStream != NULL) {
dwRet = pStream->GetVolume((PDWORD) dwParam1);
}
else {
if (uDeviceId != 0) {
dwRet = MMSYSERR_BADDEVICEID;
}
else {
dwRet = GetVolume( (PULONG) dwParam1);
}
}
break;
case WODM_SETVOLUME:
if (pStream != NULL) {
dwRet = pStream->SetVolume(dwParam1);
}
else {
if (uDeviceId != 0) {
dwRet = MMSYSERR_BADDEVICEID;
}
else {
dwRet = SetVolume( dwParam1);
}
}
break;
case WODM_BREAKLOOP:
dwRet = pStream->BreakLoop();
break;
break;
case WODM_GETPLAYBACKRATE:
dwRet = pStream->GetPlaybackRate((PDWORD) dwParam1);
break;
case WODM_SETPLAYBACKRATE:
dwRet = pStream->SetPlaybackRate(dwParam1);
break;
// group WIDM_xxx with any other unsupported items.
case WODM_GETPITCH:
case WODM_SETPITCH:
default:
//
// Add support for custom WAV messages here
//
dwRet = MMSYSERR_NOTSUPPORTED;
}
} __except (GetExceptionCode() == STATUS_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
RETAILMSG(1, (TEXT("EXCEPTION IN WAV_IOControl!!!!\r\n")));
}
return dwRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -