⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drvrctxt.cpp

📁 此代码为WCE5.0下声卡的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    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 + -