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