📄 wav.cxx
字号:
// -----------------------------------------------------------------------------
//
// @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 + -