aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_cdda/MCI.Cpp
blob: 26132b1268ebf64c5421cbe05d4f74168b317f82 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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;
}