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

📄 wav.c

📁 此代码为WCE5.0下声卡的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//  @doc    WDEV_EXT
//
//  @func   BOOL | WAV_IOControl | Device IO control routine
//
//  @parm   DWORD | dwOpenData | Value returned from WAV_Open call
//
//  @parm   DWORD | dwCode | 
//          IO control code for the function to be performed. WAV_IOControl only
//          supports one IOCTL value (IOCTL_WAV_MESSAGE)
//
//  @parm   PBYTE | pBufIn | 
//          Pointer to the input parameter structure (<t MMDRV_MESSAGE_PARAMS>).
//
//  @parm   DWORD | dwLenIn | 
//          Size in bytes of input parameter structure (sizeof(<t MMDRV_MESSAGE_PARAMS>)).
//
//  @parm   PBYTE | pBufOut | Pointer to the return value (DWORD).
//
//  @parm   DWORD | dwLenOut | Size of the return value variable (sizeof(DWORD)).
//
//  @parm   PDWORD | pdwActualOut | Unused
//
//  @rdesc  Returns TRUE for success, FALSE for failure
//
//  @xref   <t Wave Input Driver Messages> (WIDM_XXX) <nl>
//          <t Wave Output Driver Messages> (WODM_XXX)
//
// -----------------------------------------------------------------------------
BOOL
WAV_IOControl(
    PDWORD pdwOpenData, 
    DWORD  dwCode, 
    PBYTE  pBufIn,
    DWORD  dwLenIn, 
    PBYTE  pBufOut, 
    DWORD  dwLenOut,
    PDWORD pdwActualOut
    )
{
    DWORD dwRet;
    PMMDRV_MESSAGE_PARAMS pParams = (PMMDRV_MESSAGE_PARAMS) pBufIn;

#if 1
    FUNC_WMDD("+WAV_IOControl");
    HEXPARAM(pdwOpenData); 
    HEXPARAM(dwCode); 
    HEXPARAM(pBufIn);
    HEXPARAM(dwLenIn); 
    HEXPARAM(pBufOut); 
    HEXPARAM(dwLenOut);
    HEXPARAM(pdwActualOut);
#endif

    // check caller trust. if context hasn't been initialized, load from CeGetCallerTrust.
    if (*pdwOpenData != OEM_CERTIFY_TRUST) {
        if (OEM_CERTIFY_TRUST != (*pdwOpenData = CeGetCallerTrust())) {
            PRINTMSG(ZONE_WARN, (TEXT("WAV_IoControl: untrusted process\r\n")));
            SetLastError(ERROR_ACCESS_DENIED);
            return FALSE;
        }
    }

    //  set the error code to be no error first
    SetLastError(MMSYSERR_NOERROR);


    try {

        switch (dwCode) {
        default:
        PRINTMSG(ZONE_WODM, (TEXT("Unsupported dwCode in WAV_IOControl()\r\n")));
        return(FALSE);

        case IOCTL_MIX_MESSAGE:
        switch (pParams->uMsg) {
        case MXDM_GETNUMDEVS:
            PRINTMSG(ZONE_WODM, (TEXT("MXDM_GETNUMDEVS\r\n")));
            dwRet = 1;
            break;

        case MXDM_GETDEVCAPS:
            PRINTMSG(ZONE_WODM, (TEXT("MXDM_GETDEVCAPS\r\n")));
            dwRet = wdev_MXDM_GETDEVCAPS((PMIXERCAPS) pParams->dwParam1, pParams->dwParam2);
            break;

        case MXDM_OPEN:
            PRINTMSG(ZONE_WODM, (TEXT("MXDM_OPEN\r\n")));
            dwRet = wdev_MXDM_OPEN((PDWORD) pParams->dwUser, (PMIXEROPENDESC) pParams->dwParam1, pParams->dwParam2);
            break;

        case MXDM_CLOSE:
            PRINTMSG(ZONE_WODM, (TEXT("MXDM_CLOSE\r\n")));
            dwRet = wdev_MXDM_CLOSE(pParams->dwUser);
            break;

        case MXDM_GETLINEINFO:
            PRINTMSG(ZONE_WODM, (TEXT("MXDM_GETLINEINFO\r\n")));
            dwRet = wdev_MXDM_GETLINEINFO((PMIXERLINE) pParams->dwParam1, pParams->dwParam2); 
            break;

        case MXDM_GETLINECONTROLS:
            PRINTMSG(ZONE_WODM, (TEXT("MXDM_GETLINECONTROLS\r\n")));
            dwRet = wdev_MXDM_GETLINECONTROLS((PMIXERLINECONTROLS) pParams->dwParam1, pParams->dwParam2);
            break;

        case MXDM_GETCONTROLDETAILS:
            PRINTMSG(ZONE_WODM, (TEXT("MXDM_GETCONTROLDETAILS\r\n")));
            dwRet = wdev_MXDM_GETCONTROLDETAILS((PMIXERCONTROLDETAILS) pParams->dwParam1, pParams->dwParam2);
            break;

        case MXDM_SETCONTROLDETAILS:
            PRINTMSG(ZONE_WODM, (TEXT("MXDM_SETCONTROLDETAILS\r\n")));
            dwRet = wdev_MXDM_SETCONTROLDETAILS((PMIXERCONTROLDETAILS) pParams->dwParam1, pParams->dwParam2);
            break;

        default:
            ERRMSG("Unsupported mixer message");
            dwRet = MMSYSERR_NOTSUPPORTED;
            break;
        }      // switch (pParams->uMsg)
        break; // case IOCTL_MIX_MESSAGE

        case IOCTL_WAV_MESSAGE:
        switch (pParams->uMsg) {

            case WODM_BREAKLOOP:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_BREAKLOOP\r\n")));
                dwRet = wdev_WODM_BREAKLOOP(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_CLOSE:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_CLOSE\r\n")));
                dwRet = wdev_COMMON_CLOSE(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETDEVCAPS:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_GETDEVCAPS\r\n")));
                dwRet = wdev_COMMON_GETDEVCAPS(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETNUMDEVS:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_GETNUMDEVS\r\n")));
                dwRet = wdev_COMMON_GETNUMDEVS(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETPITCH:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_GETPITCH\r\n")));
                dwRet = wdev_WODM_GETPITCH(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETPLAYBACKRATE:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_GETPLAYBACKRATE\r\n")));
                dwRet = wdev_WODM_GETPLAYBACKRATE(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETPOS:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_GETPOS\r\n")));
                dwRet = wdev_COMMON_GETPOS(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETVOLUME:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_GETVOLUME\r\n")));
                dwRet = wdev_WODM_GETVOLUME(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_OPEN:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_OPEN\r\n")));
                dwRet = wdev_COMMON_OPEN(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_PAUSE:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_PAUSE\r\n")));
                dwRet = wdev_WODM_PAUSE(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_PREPARE:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_PREPARE\r\n")));
                dwRet = wdev_COMMON_PREPARE(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_RESET:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_RESET\r\n")));
                dwRet = wdev_WODM_RESET(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_RESTART:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_RESTART\r\n")));
                dwRet = wdev_WODM_RESTART(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_SETPITCH:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_SETPITCH\r\n")));
                dwRet = wdev_WODM_SETPITCH(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_SETPLAYBACKRATE:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_SETPLAYBACKRATE\r\n")));
                dwRet = wdev_WODM_SETPLAYBACKRATE(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_SETVOLUME:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_SETVOLUME\r\n")));
                dwRet = wdev_WODM_SETVOLUME(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_UNPREPARE:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_UNPREPARE\r\n")));
                dwRet = wdev_COMMON_UNPREPARE(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_WRITE:
                PRINTMSG(ZONE_WODM, (TEXT("WODM_WRITE\r\n")));
                dwRet = wdev_WODM_WRITE(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_ADDBUFFER:
                PRINTMSG(ZONE_WIDM, (TEXT("WIDM_ADDBUFFER\r\n")));
                dwRet = wdev_COMMON_ADDBUFFER(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_CLOSE:
                PRINTMSG(ZONE_WIDM, (TEXT("WIDM_CLOSE\r\n")));
                dwRet = wdev_COMMON_CLOSE(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_GETDEVCAPS:
                PRINTMSG(ZONE_WIDM, (TEXT("WIDM_GETDEVCAPS\r\n")));
                dwRet = wdev_COMMON_GETDEVCAPS(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_GETNUMDEVS:
                PRINTMSG(ZONE_WIDM, (TEXT("WIDM_GETNUMDEVS\r\n")));
                dwRet = wdev_COMMON_GETNUMDEVS(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_GETPOS:
                PRINTMSG(ZONE_WIDM, (TEXT("WIDM_GETPOS\r\n")));
                dwRet = wdev_COMMON_GETPOS(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_OPEN:
                PRINTMSG(ZONE_WIDM, (TEXT("WIDM_OPEN\r\n")));
                dwRet = wdev_COMMON_OPEN(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_PREPARE:
                PRINTMSG(ZONE_WIDM, (TEXT("WIDM_PREPARE\r\n")));
                dwRet = wdev_COMMON_PREPARE(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_RESET:
                PRINTMSG(ZONE_WIDM, (TEXT("WIDM_RESET\r\n")));
                dwRet = wdev_WIDM_RESET(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_START:
                PRINTMSG(ZONE_WIDM, (TEXT("WIDM_START\r\n")));
                dwRet = wdev_WIDM_START(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_STOP:
                PRINTMSG(ZONE_WIDM, (TEXT("WIDM_STOP\r\n")));
                dwRet = wdev_WIDM_STOP(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_UNPREPARE:
                PRINTMSG(ZONE_WIDM, (TEXT("WIDM_UNPREPARE\r\n")));
                dwRet = wdev_COMMON_UNPREPARE(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            default:
                // Note: the value returned from PDD_AudioMessage makes its way all the way
                // back to the application and is returned from waveInMessage/waveOutMessage
                dwRet = PDD_AudioMessage(pParams->uMsg, pParams->dwParam1, pParams->dwParam2);
        }

        break; // case IOCTL_WAV_MESSAGE
        } // switch (dwCode)


        //
        // Pass the return code back via pBufOut
        //
        if (pBufOut != NULL) {
            *((DWORD*) pBufOut) = dwRet;
        }   


    } except (GetExceptionCode() == STATUS_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {

        RETAILMSG(1, (TEXT("EXCEPTION IN WAV_IOControl!!!!\r\n")));
    }   

    return TRUE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -