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

📄 wav.cxx

📁 Windows CE操作系统中适用的蓝牙驱动程序
💻 CXX
📖 第 1 页 / 共 2 页
字号:


// -----------------------------------------------------------------------------
//
//  @doc    WDEV_EXT
//
//  @func   void | WAV_PowerDown | Device powerdown routine
//
//  @comm   Called to suspend device.  Cannot call any routines aside from
//          those in the dll in this call.
//
// -----------------------------------------------------------------------------
extern "C" VOID
WAV_PowerDown(
    VOID
    )
{
    WMDD_PowerHandler(TRUE);
}




// -----------------------------------------------------------------------------
//
//  @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)
//
// -----------------------------------------------------------------------------
extern "C" 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 0
    BSS_FUNC_WMDD("+WAV_IOControl");
    BSS_HEXPARAM(pdwOpenData); 
    BSS_HEXPARAM(dwCode); 
    BSS_HEXPARAM(pBufIn);
    BSS_HEXPARAM(dwLenIn); 
    BSS_HEXPARAM(pBufOut); 
    BSS_HEXPARAM(dwLenOut);
    BSS_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 {

        if (dwCode != IOCTL_WAV_MESSAGE) {
            BSS_WODM(TEXT("Unsupported dwCode in WAV_IOControl()"));
            return(FALSE);
        }

        switch (pParams->uMsg) {

            case WODM_BREAKLOOP:
                BSS_WODM(TEXT("WODM_BREAKLOOP"));
                dwRet = wdev_WODM_BREAKLOOP(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_CLOSE:
                BSS_WODM(TEXT("WODM_CLOSE"));
                dwRet = wdev_COMMON_CLOSE(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETDEVCAPS:
                BSS_WODM(TEXT("WODM_GETDEVCAPS"));
                dwRet = wdev_COMMON_GETDEVCAPS(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETEXTDEVCAPS:
            	BSS_WODM(TEXT("WODM_GETTEXTDEVCAPS"));
            	dwRet = wdev_WODM_GETEXTDEVCAPS(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
            		                     pParams->dwParam1, pParams->dwParam2);
            	break;

            case WODM_GETNUMDEVS:
                BSS_WODM(TEXT("WODM_GETNUMDEVS"));
                dwRet = wdev_COMMON_GETNUMDEVS(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETPITCH:
                BSS_WODM(TEXT("WODM_GETPITCH"));
                dwRet = wdev_WODM_GETPITCH(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETPLAYBACKRATE:
                BSS_WODM(TEXT("WODM_GETPLAYBACKRATE"));
                dwRet = wdev_WODM_GETPLAYBACKRATE(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETPOS:
                BSS_WODM(TEXT("WODM_GETPOS"));
                dwRet = wdev_COMMON_GETPOS(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_GETVOLUME:
                BSS_WODM(TEXT("WODM_GETVOLUME"));
                dwRet = wdev_WODM_GETVOLUME(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_OPEN:
                BSS_WODM(TEXT("WODM_OPEN"));
                dwRet = wdev_COMMON_OPEN(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_PAUSE:
                BSS_WODM(TEXT("WODM_PAUSE"));
                dwRet = wdev_WODM_PAUSE(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_PREPARE:
                BSS_WODM(TEXT("WODM_PREPARE"));
                dwRet = wdev_COMMON_PREPARE(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_RESET:
                BSS_WODM(TEXT("WODM_RESET"));
                dwRet = wdev_WODM_RESET(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_RESTART:
                BSS_WODM(TEXT("WODM_RESTART"));
                dwRet = wdev_WODM_RESTART(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_SETPITCH:
                BSS_WODM(TEXT("WODM_SETPITCH"));
                dwRet = wdev_WODM_SETPITCH(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_SETPLAYBACKRATE:
                BSS_WODM(TEXT("WODM_SETPLAYBACKRATE"));
                dwRet = wdev_WODM_SETPLAYBACKRATE(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_SETVOLUME:
                BSS_WODM(TEXT("WODM_SETVOLUME"));
                dwRet = wdev_WODM_SETVOLUME(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_UNPREPARE:
                BSS_WODM(TEXT("WODM_UNPREPARE"));
                dwRet = wdev_COMMON_UNPREPARE(WAPI_OUT, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_WRITE:
                BSS_WODM(TEXT("WODM_WRITE"));
                dwRet = wdev_WODM_WRITE(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WODM_BT_SCO_AUDIO_CONTROL:
                BSS_WODM(TEXT("WODM_BT_SCO_AUDIO_CONTROL"));
                if (pParams->dwParam2) {
                    dwRet = InitSco();
                }
                else {
                    dwRet = DeinitSco();
                }
                break;

            case WIDM_ADDBUFFER:
                BSS_WIDM(TEXT("WIDM_ADDBUFFER"));
                dwRet = wdev_COMMON_ADDBUFFER(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_CLOSE:
                BSS_WIDM(TEXT("WIDM_CLOSE"));
                dwRet = wdev_COMMON_CLOSE(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_GETDEVCAPS:
                BSS_WIDM(TEXT("WIDM_GETDEVCAPS"));
                dwRet = wdev_COMMON_GETDEVCAPS(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_GETNUMDEVS:
                BSS_WIDM(TEXT("WIDM_GETNUMDEVS"));
                dwRet = wdev_COMMON_GETNUMDEVS(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_GETPOS:
                BSS_WIDM(TEXT("WIDM_GETPOS"));
                dwRet = wdev_COMMON_GETPOS(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_OPEN:
                BSS_WIDM(TEXT("WIDM_OPEN"));
                dwRet = wdev_COMMON_OPEN(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_PREPARE:
                BSS_WIDM(TEXT("WIDM_PREPARE"));
                dwRet = wdev_COMMON_PREPARE(WAPI_IN, pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_RESET:
                BSS_WIDM(TEXT("WIDM_RESET"));
                dwRet = wdev_WIDM_RESET(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_START:
                BSS_WIDM(TEXT("WIDM_START"));
                dwRet = wdev_WIDM_START(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_STOP:
                BSS_WIDM(TEXT("WIDM_STOP"));
                dwRet = wdev_WIDM_STOP(pParams->uDeviceId, pParams->dwUser,
                                         pParams->dwParam1, pParams->dwParam2);
                break;

            case WIDM_UNPREPARE:
                BSS_WIDM(TEXT("WIDM_UNPREPARE"));
                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);
        }

        //
        // 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 + -