diff options
Diffstat (limited to 'Src/Plugins/Input/in_cdda/MCI.Cpp')
-rw-r--r-- | Src/Plugins/Input/in_cdda/MCI.Cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_cdda/MCI.Cpp b/Src/Plugins/Input/in_cdda/MCI.Cpp new file mode 100644 index 00000000..26132b12 --- /dev/null +++ b/Src/Plugins/Input/in_cdda/MCI.Cpp @@ -0,0 +1,152 @@ +#include "main.h" + +MCIERROR MCISendCommand(MCIDEVICEID IDDevice, UINT uMsg, DWORD fdwCommand, DWORD_PTR dwParam) +{ + MCIERROR nErr = mciSendCommand(IDDevice, uMsg, fdwCommand, dwParam); +#if 0 + if (nErr) + { + wchar_t szError[256] = {0}; + mciGetErrorString(nErr, szError, 256); + MessageBox(NULL,szError,L"MCI CD Error",MB_OK); + } +#endif + return nErr; +} + +int isMediaPresent(MCIDEVICEID wDeviceID) +{ + MCI_STATUS_PARMS p; + p.dwItem=MCI_STATUS_MEDIA_PRESENT; + if (MCISendCommand(wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD_PTR)&p)) return 1; + return p.dwReturn?1:0; +} + +BOOL CDOpen(MCIDEVICEID* lpDeviceID, int device, const wchar_t *alias) +{ + //OutputDebugString("Calling cdopen()\n"); + MCI_OPEN_PARMS sMCIOpen; + MCI_SET_PARMS sMCISet; + wchar_t zDevice[3]={(wchar_t)device,':',0}; + DWORD nErr; + + sMCIOpen.dwCallback = 0; + sMCIOpen.wDeviceID = 0; + sMCIOpen.lpstrAlias = alias; + sMCIOpen.lpstrDeviceType = (LPCTSTR) MCI_DEVTYPE_CD_AUDIO; + sMCIOpen.lpstrElementName = zDevice; + nErr = MCISendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_SHAREABLE | + MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT | + (alias ? MCI_OPEN_ALIAS : 0), (DWORD_PTR) &sMCIOpen); + if (nErr) + { + nErr = MCISendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | + MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT | + (alias ? MCI_OPEN_ALIAS : 0), (DWORD_PTR) &sMCIOpen); + if (nErr) + { + return FALSE; + } + } + + sMCISet.dwTimeFormat = MCI_FORMAT_TMSF; + MCISendCommand (sMCIOpen.wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD_PTR) &sMCISet); + + *lpDeviceID = sMCIOpen.wDeviceID; + + return TRUE; +} + +void CDClose(MCIDEVICEID* lpDeviceID) +{ + MCI_GENERIC_PARMS sMCIGeneric; + + sMCIGeneric.dwCallback = (DWORD_PTR) line.hMainWindow; + MCISendCommand(*lpDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD_PTR) &sMCIGeneric); + + *lpDeviceID = 0; +} + +void CDEject(MCIDEVICEID wDeviceID) +{ + MCI_SET_PARMS mciset; + MCISendCommand (wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN,(DWORD_PTR) &mciset); +} + +unsigned int CDGetTracks(MCIDEVICEID wDeviceID) +{ + MCI_STATUS_PARMS sMCIStatus; + sMCIStatus.dwItem = MCI_STATUS_NUMBER_OF_TRACKS; + if (MCISendCommand (wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT,(DWORD_PTR) &sMCIStatus)) return -1; + return sMCIStatus.dwReturn; +} + +unsigned int CDGetCurrTrack(MCIDEVICEID wDeviceID) +{ + MCI_STATUS_PARMS sMCIStatus; + + sMCIStatus.dwItem = MCI_STATUS_POSITION; + MCISendCommand (wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT,(DWORD_PTR) &sMCIStatus); + + return ((int) MCI_TMSF_TRACK (sMCIStatus.dwReturn)); +} + +int CDPlay(MCIDEVICEID wDeviceID, unsigned int nTrack, BOOL bResume, unsigned int nMin, unsigned int nSec, unsigned int endms) +{ + MCI_PLAY_PARMS sMCIPlay; + unsigned int nActualTrack = nTrack; + + sMCIPlay.dwFrom = MCI_MAKE_TMSF (nActualTrack, nMin, nSec, 0); + sMCIPlay.dwTo = MCI_MAKE_TMSF (nActualTrack, endms/60000, (endms/1000)%60,0); + if (!bResume) + { + return MCISendCommand (wDeviceID, MCI_PLAY, MCI_FROM | MCI_TO ,(DWORD_PTR) &sMCIPlay); + } + else + { + return MCISendCommand (wDeviceID, MCI_PLAY, MCI_FROM | MCI_TO, (DWORD_PTR) (LPVOID) &sMCIPlay); + } +} + +void CDStop(MCIDEVICEID wDeviceID) +{ + MCISendCommand(wDeviceID, MCI_STOP, 0, 0); +} + +void CDPause(MCIDEVICEID wDeviceID) +{ + MCISendCommand(wDeviceID, MCI_PAUSE, 0,0); +} + +unsigned int CDGetTrackLength(MCIDEVICEID wDeviceID, unsigned int nTrack) +{ + MCI_STATUS_PARMS sMCIStatus; + int r; + + sMCIStatus.dwItem = MCI_STATUS_POSITION ; + sMCIStatus.dwTrack = nTrack+1; + if (MCISendCommand (wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK | MCI_WAIT,(DWORD_PTR) &sMCIStatus)) // if error than last track + { + sMCIStatus.dwItem = MCI_STATUS_LENGTH; + sMCIStatus.dwTrack = nTrack; + if (MCISendCommand (wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK | MCI_WAIT,(DWORD_PTR) &sMCIStatus)) return -1000; + return sMCIStatus.dwReturn; + } + + r=sMCIStatus.dwReturn; + sMCIStatus.dwItem = MCI_STATUS_POSITION ; + sMCIStatus.dwTrack = nTrack; + if (MCISendCommand (wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK | MCI_WAIT,(DWORD_PTR) &sMCIStatus)) return -1000; + return r-sMCIStatus.dwReturn; +} + +BOOL CDID(MCIDEVICEID wDeviceID, wchar_t *id, size_t len) +{ + MCI_INFO_PARMS sMCIInfo; + sMCIInfo.dwCallback=0; + sMCIInfo.dwRetSize=len; + sMCIInfo.lpstrReturn=id; + DWORD nErr= MCISendCommand(wDeviceID, MCI_INFO, MCI_INFO_MEDIA_IDENTITY, (DWORD_PTR)&sMCIInfo); + + return !nErr; +}
\ No newline at end of file |