📄 mciwave.c
字号:
TRACE("MCI_WAVE_SET_AVGBYTESPERSEC = %ld\n", wmw->wfxRef.nAvgBytesPerSec); } if (dwFlags & MCI_WAVE_SET_BITSPERSAMPLE) { wmw->wfxRef.wBitsPerSample = ((LPMCI_WAVE_SET_PARMS)lpParms)->wBitsPerSample; TRACE("MCI_WAVE_SET_BITSPERSAMPLE = %d\n", wmw->wfxRef.wBitsPerSample); } if (dwFlags & MCI_WAVE_SET_BLOCKALIGN) { wmw->wfxRef.nBlockAlign = ((LPMCI_WAVE_SET_PARMS)lpParms)->nBlockAlign; TRACE("MCI_WAVE_SET_BLOCKALIGN = %d\n", wmw->wfxRef.nBlockAlign); } if (dwFlags & MCI_WAVE_SET_CHANNELS) { wmw->wfxRef.nChannels = ((LPMCI_WAVE_SET_PARMS)lpParms)->nChannels; TRACE("MCI_WAVE_SET_CHANNELS = %d\n", wmw->wfxRef.nChannels); } if (dwFlags & MCI_WAVE_SET_FORMATTAG) { wmw->wfxRef.wFormatTag = ((LPMCI_WAVE_SET_PARMS)lpParms)->wFormatTag; TRACE("MCI_WAVE_SET_FORMATTAG = %d\n", wmw->wfxRef.wFormatTag); } if (dwFlags & MCI_WAVE_SET_SAMPLESPERSEC) { wmw->wfxRef.nSamplesPerSec = ((LPMCI_WAVE_SET_PARMS)lpParms)->nSamplesPerSec; TRACE("MCI_WAVE_SET_SAMPLESPERSEC = %ld\n", wmw->wfxRef.nSamplesPerSec); } return 0;}/************************************************************************** * WAVE_mciSave [internal] */static DWORD WAVE_mciSave(UINT wDevID, DWORD dwFlags, LPMCI_SAVE_PARMS lpParms){ WINE_MCIWAVE* wmw = WAVE_mciGetOpenDev(wDevID); DWORD ret = MCIERR_FILE_NOT_SAVED, tmpRet; WPARAM wparam = MCI_NOTIFY_FAILURE; TRACE("%d, %08lX, %p);\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wmw == NULL) return MCIERR_INVALID_DEVICE_ID; if (dwFlags & MCI_WAIT) { FIXME("MCI_WAIT not implemented\n"); } ret = mmioAscend(wmw->hFile, &wmw->ckWaveData, 0); ret = mmioAscend(wmw->hFile, &wmw->ckMainRIFF, 0); ret = mmioClose(wmw->hFile, 0); /* If the destination file already exists, it has to be overwritten. (Behaviour verified in Windows (2000)). If it doesn't overwrite, it is breaking one of my applications. We are making use of mmioRename, which WILL NOT overwrite the destination file (which is what Windows does, also verified in Win2K) So, lets delete the destination file before calling mmioRename. If the destination file DOESN'T exist, the delete will fail silently. Let's also be careful not to lose our previous error code. */ tmpRet = GetLastError(); DeleteFileA (lpParms->lpfilename); SetLastError(tmpRet); if (0 == mmioRenameA(wmw->openParms.lpstrElementName, lpParms->lpfilename, 0, 0 )) { ret = ERROR_SUCCESS; } if (dwFlags & MCI_NOTIFY) { if (ret == ERROR_SUCCESS) wparam = MCI_NOTIFY_SUCCESSFUL; mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), wmw->openParms.wDeviceID, wparam); } return ret;}/************************************************************************** * WAVE_mciStatus [internal] */static DWORD WAVE_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms){ WINE_MCIWAVE* wmw = WAVE_mciGetOpenDev(wDevID); DWORD ret = 0; TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wmw == NULL) return MCIERR_INVALID_DEVICE_ID; if (dwFlags & MCI_STATUS_ITEM) { switch (lpParms->dwItem) { case MCI_STATUS_CURRENT_TRACK: lpParms->dwReturn = 1; TRACE("MCI_STATUS_CURRENT_TRACK => %lu\n", lpParms->dwReturn); break; case MCI_STATUS_LENGTH: if (!wmw->hFile) { lpParms->dwReturn = 0; return MCIERR_UNSUPPORTED_FUNCTION; } /* only one track in file is currently handled, so don't take care of MCI_TRACK flag */ lpParms->dwReturn = WAVE_ConvertByteToTimeFormat(wmw, wmw->ckWaveData.cksize, &ret); TRACE("MCI_STATUS_LENGTH => %lu\n", lpParms->dwReturn); break; case MCI_STATUS_MODE: TRACE("MCI_STATUS_MODE => %u\n", wmw->dwStatus); lpParms->dwReturn = MAKEMCIRESOURCE(wmw->dwStatus, wmw->dwStatus); ret = MCI_RESOURCE_RETURNED; break; case MCI_STATUS_MEDIA_PRESENT: TRACE("MCI_STATUS_MEDIA_PRESENT => TRUE!\n"); lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE); ret = MCI_RESOURCE_RETURNED; break; case MCI_STATUS_NUMBER_OF_TRACKS: /* only one track in file is currently handled, so don't take care of MCI_TRACK flag */ lpParms->dwReturn = 1; TRACE("MCI_STATUS_NUMBER_OF_TRACKS => %lu!\n", lpParms->dwReturn); break; case MCI_STATUS_POSITION: if (!wmw->hFile) { lpParms->dwReturn = 0; return MCIERR_UNSUPPORTED_FUNCTION; } /* only one track in file is currently handled, so don't take care of MCI_TRACK flag */ lpParms->dwReturn = WAVE_ConvertByteToTimeFormat(wmw, (dwFlags & MCI_STATUS_START) ? 0 : wmw->dwPosition, &ret); TRACE("MCI_STATUS_POSITION %s => %lu\n", (dwFlags & MCI_STATUS_START) ? "start" : "current", lpParms->dwReturn); break; case MCI_STATUS_READY: lpParms->dwReturn = (wmw->dwStatus == MCI_MODE_NOT_READY) ? MAKEMCIRESOURCE(FALSE, MCI_FALSE) : MAKEMCIRESOURCE(TRUE, MCI_TRUE); TRACE("MCI_STATUS_READY => %u!\n", LOWORD(lpParms->dwReturn)); ret = MCI_RESOURCE_RETURNED; break; case MCI_STATUS_TIME_FORMAT: lpParms->dwReturn = MAKEMCIRESOURCE(wmw->dwMciTimeFormat, wmw->dwMciTimeFormat); TRACE("MCI_STATUS_TIME_FORMAT => %lu\n", lpParms->dwReturn); ret = MCI_RESOURCE_RETURNED; break; case MCI_WAVE_INPUT: TRACE("MCI_WAVE_INPUT !\n"); lpParms->dwReturn = 0; ret = MCIERR_WAVE_INPUTUNSPECIFIED; break; case MCI_WAVE_OUTPUT: TRACE("MCI_WAVE_OUTPUT !\n"); { UINT id; if (waveOutGetID(wmw->hWave, &id) == MMSYSERR_NOERROR) { lpParms->dwReturn = id; } else { lpParms->dwReturn = 0; ret = MCIERR_WAVE_INPUTUNSPECIFIED; } } break; case MCI_WAVE_STATUS_AVGBYTESPERSEC: if (!wmw->hFile) { lpParms->dwReturn = 0; return MCIERR_UNSUPPORTED_FUNCTION; } lpParms->dwReturn = wmw->lpWaveFormat->nAvgBytesPerSec; TRACE("MCI_WAVE_STATUS_AVGBYTESPERSEC => %lu!\n", lpParms->dwReturn); break; case MCI_WAVE_STATUS_BITSPERSAMPLE: if (!wmw->hFile) { lpParms->dwReturn = 0; return MCIERR_UNSUPPORTED_FUNCTION; } lpParms->dwReturn = wmw->lpWaveFormat->wBitsPerSample; TRACE("MCI_WAVE_STATUS_BITSPERSAMPLE => %lu!\n", lpParms->dwReturn); break; case MCI_WAVE_STATUS_BLOCKALIGN: if (!wmw->hFile) { lpParms->dwReturn = 0; return MCIERR_UNSUPPORTED_FUNCTION; } lpParms->dwReturn = wmw->lpWaveFormat->nBlockAlign; TRACE("MCI_WAVE_STATUS_BLOCKALIGN => %lu!\n", lpParms->dwReturn); break; case MCI_WAVE_STATUS_CHANNELS: if (!wmw->hFile) { lpParms->dwReturn = 0; return MCIERR_UNSUPPORTED_FUNCTION; } lpParms->dwReturn = wmw->lpWaveFormat->nChannels; TRACE("MCI_WAVE_STATUS_CHANNELS => %lu!\n", lpParms->dwReturn); break; case MCI_WAVE_STATUS_FORMATTAG: if (!wmw->hFile) { lpParms->dwReturn = 0; return MCIERR_UNSUPPORTED_FUNCTION; } lpParms->dwReturn = wmw->lpWaveFormat->wFormatTag; TRACE("MCI_WAVE_FORMATTAG => %lu!\n", lpParms->dwReturn); break; case MCI_WAVE_STATUS_LEVEL: TRACE("MCI_WAVE_STATUS_LEVEL !\n"); lpParms->dwReturn = 0xAAAA5555; break; case MCI_WAVE_STATUS_SAMPLESPERSEC: if (!wmw->hFile) { lpParms->dwReturn = 0; return MCIERR_UNSUPPORTED_FUNCTION; } lpParms->dwReturn = wmw->lpWaveFormat->nSamplesPerSec; TRACE("MCI_WAVE_STATUS_SAMPLESPERSEC => %lu!\n", lpParms->dwReturn); break; default: WARN("unknown command %08lX !\n", lpParms->dwItem); return MCIERR_UNRECOGNIZED_COMMAND; } } if (dwFlags & MCI_NOTIFY) { mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), wmw->openParms.wDeviceID, MCI_NOTIFY_SUCCESSFUL); } return ret;}/************************************************************************** * WAVE_mciGetDevCaps [internal] */static DWORD WAVE_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms){ WINE_MCIWAVE* wmw = WAVE_mciGetOpenDev(wDevID); DWORD ret = 0; TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wmw == NULL) return MCIERR_INVALID_DEVICE_ID; if (dwFlags & MCI_GETDEVCAPS_ITEM) { switch(lpParms->dwItem) { case MCI_GETDEVCAPS_DEVICE_TYPE: lpParms->dwReturn = MAKEMCIRESOURCE(MCI_DEVTYPE_WAVEFORM_AUDIO, MCI_DEVTYPE_WAVEFORM_AUDIO); ret = MCI_RESOURCE_RETURNED; break; case MCI_GETDEVCAPS_HAS_AUDIO: lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE); ret = MCI_RESOURCE_RETURNED; break; case MCI_GETDEVCAPS_HAS_VIDEO: lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); ret = MCI_RESOURCE_RETURNED; break; case MCI_GETDEVCAPS_USES_FILES: lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE); ret = MCI_RESOURCE_RETURNED; break; case MCI_GETDEVCAPS_COMPOUND_DEVICE: lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE); ret = MCI_RESOURCE_RETURNED; break; case MCI_GETDEVCAPS_CAN_RECORD: lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE); ret = MCI_RESOURCE_RETURNED; break; case MCI_GETDEVCAPS_CAN_EJECT: lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); ret = MCI_RESOURCE_RETURNED; break; case MCI_GETDEVCAPS_CAN_PLAY: lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE); ret = MCI_RESOURCE_RETURNED; break; case MCI_GETDEVCAPS_CAN_SAVE: lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE); ret = MCI_RESOURCE_RETURNED; break; case MCI_WAVE_GETDEVCAPS_INPUTS: lpParms->dwReturn = 1; break; case MCI_WAVE_GETDEVCAPS_OUTPUTS: lpParms->dwReturn = 1; break; default: FIXME("Unknown capability (%08lx) !\n", lpParms->dwItem); return MCIERR_UNRECOGNIZED_COMMAND; } } else { WARN("No GetDevCaps-Item !\n"); return MCIERR_UNRECOGNIZED_COMMAND; } return ret;}/************************************************************************** * WAVE_mciInfo [internal] */static DWORD WAVE_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSA lpParms){ DWORD ret = 0; LPCSTR str = 0; WINE_MCIWAVE* wmw = WAVE_mciGetOpenDev(wDevID); TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms); if (lpParms == NULL || lpParms->lpstrReturn == NULL) { ret = MCIERR_NULL_PARAMETER_BLOCK; } else if (wmw == NULL) { ret = MCIERR_INVALID_DEVICE_ID; } else { TRACE("buf=%p, len=%lu\n", lpParms->lpstrReturn, lpParms->dwRetSize); switch (dwFlags & ~(MCI_WAIT|MCI_NOTIFY)) { case MCI_INFO_PRODUCT: str = "Wine's audio player"; break; case MCI_INFO_FILE: str = wmw->openParms.lpstrElementName; break; case MCI_WAVE_INPUT: str = "Wine Wave In"; break; case MCI_WAVE_OUTPUT: str = "Wine Wave Out"; break; default: WARN("Don't know this info command (%lu)\n", dwFlags); ret = MCIERR_UNRECOGNIZED_COMMAND; } } if (str) { if (strlen(str) + 1 > lpParms->dwRetSize) { ret = MCIERR_PARAM_OVERFLOW; } else { lstrcpynA(lpParms->lpstrReturn, str, lpParms->dwRetSize); } } else { lpParms->lpstrReturn[0] = 0; } return ret;}/************************************************************************** * DriverProc (MCIWAVE.@) */LONG CALLBACK MCIWAVE_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg, DWORD dwParam1, DWORD dwParam2){ TRACE("(%08lX, %p, %08lX, %08lX, %08lX)\n", dwDevID, hDriv, wMsg, dwParam1, dwParam2); switch (wMsg) { case DRV_LOAD: return 1; case DRV_FREE: return 1; case DRV_OPEN: return WAVE_drvOpen((LPSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSA)dwParam2); case DRV_CLOSE: return WAVE_drvClose(dwDevID); case DRV_ENABLE: return 1; case DRV_DISABLE: return 1; case DRV_QUERYCONFIGURE: return 1; case DRV_CONFIGURE: MessageBoxA(0, "Sample MultiMedia Driver !", "OSS Driver", MB_OK); return 1; case DRV_INSTALL: return DRVCNF_RESTART; case DRV_REMOVE: return DRVCNF_RESTART; } if (dwDevID == 0xFFFFFFFF) return MCIERR_UNSUPPORTED_FUNCTION; switch (wMsg) { case MCI_OPEN_DRIVER: return WAVE_mciOpen (dwDevID, dwParam1, (LPMCI_WAVE_OPEN_PARMSA) dwParam2); case MCI_CLOSE_DRIVER: return WAVE_mciClose (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_CUE: return WAVE_mciCue (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_PLAY: return WAVE_mciPlay (dwDevID, dwParam1, (LPMCI_PLAY_PARMS) dwParam2); case MCI_RECORD: return WAVE_mciRecord (dwDevID, dwParam1, (LPMCI_RECORD_PARMS) dwParam2); case MCI_STOP: return WAVE_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_SET: return WAVE_mciSet (dwDevID, dwParam1, (LPMCI_SET_PARMS) dwParam2); case MCI_PAUSE: return WAVE_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_RESUME: return WAVE_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_STATUS: return WAVE_mciStatus (dwDevID, dwParam1, (LPMCI_STATUS_PARMS) dwParam2); case MCI_GETDEVCAPS: return WAVE_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS) dwParam2); case MCI_INFO: return WAVE_mciInfo (dwDevID, dwParam1, (LPMCI_INFO_PARMSA) dwParam2); case MCI_SEEK: return WAVE_mciSeek (dwDevID, dwParam1, (LPMCI_SEEK_PARMS) dwParam2); case MCI_SAVE: return WAVE_mciSave (dwDevID, dwParam1, (LPMCI_SAVE_PARMS) dwParam2); /* commands that should be supported */ case MCI_LOAD: case MCI_FREEZE: case MCI_PUT: case MCI_REALIZE: case MCI_UNFREEZE: case MCI_UPDATE: case MCI_WHERE: case MCI_STEP: case MCI_SPIN: case MCI_ESCAPE: case MCI_COPY: case MCI_CUT: case MCI_DELETE: case MCI_PASTE: FIXME("Unsupported yet command [%lu]\n", wMsg); break; case MCI_WINDOW: TRACE("Unsupported command [%lu]\n", wMsg); break; /* option which can be silenced */ case MCI_CONFIGURE: return 0; case MCI_OPEN: case MCI_CLOSE: ERR("Shouldn't receive a MCI_OPEN or CLOSE message\n"); break; default: FIXME("is probably wrong msg [%lu]\n", wMsg); return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); } return MCIERR_UNRECOGNIZED_COMMAND;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -