]> git.saurik.com Git - wxWidgets.git/blob - utils/wxMMedia2/lib/cdwin.cpp
12439116a83b8ab3890e660fbd009d4bb426fc73
[wxWidgets.git] / utils / wxMMedia2 / lib / cdwin.cpp
1 ////////////////////////////////////////////////////////////////////////////////
2 // Name: cdwin.cpp
3 // Purpose: wxMMedia
4 // Author: Guilhem Lavaux
5 // Created: 1997
6 // Updated: 1998
7 // Copyright: (C) 1997, 1998, Guilhem Lavaux
8 // License: wxWindows license
9 ////////////////////////////////////////////////////////////////////////////////
10 #ifdef __GNUG__
11 #pragma implementation "cdwin.h"
12 #endif
13
14 #include <windows.h>
15 #include <stdio.h>
16 #include <mmsystem.h>
17 #ifdef WX_PRECOMP
18 #include "wx/wxprec.h"
19 #else
20 #include "wx/wx.h"
21 #endif
22 #define WXMMEDIA_INTERNAL
23 #include "cdbase.h"
24 #include "cdwin.h"
25
26 #ifdef __BORLANDC__
27 #pragma hdrstop
28 #endif
29
30 wxCDAudioWin::wxCDAudioWin(void)
31 : wxCDAudio(), m_trksize(NULL), m_trkpos(NULL), m_ok(TRUE), m_toc(NULL)
32 {
33 MCI_OPEN_PARMS open_struct;
34 MCI_SET_PARMS set_struct;
35 DWORD ret;
36
37 m_internal = new CDAW_Internal;
38 open_struct.lpstrDeviceType = "cdaudio";
39 ret = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE,
40 (DWORD)&open_struct);
41 if (ret) {
42 m_ok = FALSE;
43 return;
44 }
45 m_internal->dev_id = open_struct.wDeviceID;
46
47 set_struct.dwTimeFormat = MCI_FORMAT_MSF;
48 ret = mciSendCommand(m_internal->dev_id, MCI_SET, MCI_SET_TIME_FORMAT,
49 (DWORD)(LPVOID)&set_struct);
50
51 PrepareToc();
52
53 set_struct.dwTimeFormat = MCI_FORMAT_TMSF;
54 ret = mciSendCommand(m_internal->dev_id, MCI_SET, MCI_SET_TIME_FORMAT,
55 (DWORD)(LPVOID)&set_struct);
56 }
57
58 wxCDAudioWin::~wxCDAudioWin(void)
59 {
60 if (m_ok) {
61 mciSendCommand(m_internal->dev_id, MCI_CLOSE, 0, NULL);
62 delete m_toc;
63 delete[] m_trksize;
64 delete[] m_trkpos;
65 }
66 delete m_internal;
67 }
68
69 void wxCDAudioWin::PrepareToc(void)
70 {
71 MCI_STATUS_PARMS status_struct;
72 MCI_SET_PARMS set_struct;
73 wxUint16 i, nb_m_trksize;
74 wxCDtime total_time, *trk;
75 DWORD ret, tmem;
76
77 if (!m_ok)
78 return;
79
80 status_struct.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;
81 ret = mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
82 (DWORD)&status_struct);
83 nb_m_trksize = status_struct.dwReturn;
84
85 m_trksize = new wxCDtime[nb_m_trksize+1];
86 m_trkpos = new wxCDtime[nb_m_trksize+1];
87
88 status_struct.dwItem = MCI_STATUS_LENGTH;
89 ret = mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
90 (DWORD)&status_struct);
91 total_time.track = nb_m_trksize;
92 tmem = status_struct.dwReturn;
93 total_time.min = MCI_MSF_MINUTE(tmem);
94 total_time.sec = MCI_MSF_SECOND(tmem);
95 total_time.hour = total_time.min / 60;
96 total_time.min %= 60;
97
98 for (i=1;i<=nb_m_trksize;i++) {
99 status_struct.dwItem = MCI_STATUS_POSITION;
100 status_struct.dwTrack = i;
101 ret = mciSendCommand(m_internal->dev_id, MCI_STATUS,
102 MCI_STATUS_ITEM | MCI_TRACK,
103 (DWORD)(LPVOID)&status_struct);
104 tmem = status_struct.dwReturn;
105
106 trk = &m_trkpos[i];
107 trk->track = i;
108 trk->min = MCI_MSF_MINUTE(tmem);
109 trk->sec = MCI_MSF_SECOND(tmem);
110 trk->hour = trk->min / 60;
111 trk->min %= 60;
112
113 status_struct.dwItem = MCI_STATUS_LENGTH;
114 status_struct.dwTrack = i;
115 ret = mciSendCommand(m_internal->dev_id, MCI_STATUS,
116 MCI_STATUS_ITEM | MCI_TRACK,
117 (DWORD)(LPVOID)&status_struct);
118 tmem = status_struct.dwReturn;
119
120 trk = &m_trksize[i];
121 trk->track = i;
122 trk->min = MCI_MSF_MINUTE(tmem);
123 trk->sec = MCI_MSF_SECOND(tmem);
124 trk->hour = trk->min / 60;
125 trk->min %= 60;
126 }
127
128 m_toc = new CDtoc(total_time, m_trksize, m_trkpos);
129 }
130
131 bool wxCDAudioWin::Play(const wxCDtime& beg_time, const wxCDtime& end_time)
132 {
133 DWORD tmsf;
134 MCI_PLAY_PARMS play_struct;
135
136 if (!m_ok)
137 return FALSE;
138
139 tmsf = MCI_MAKE_TMSF(beg_time.track, beg_time.min,
140 beg_time.sec, 0);
141 play_struct.dwFrom = tmsf;
142 tmsf = MCI_MAKE_TMSF(end_time.track, end_time.min,
143 end_time.sec, 0);
144 play_struct.dwTo = tmsf;
145
146 mciSendCommand(m_internal->dev_id, MCI_PLAY, 0, (DWORD)&play_struct);
147 return TRUE;
148 }
149
150 bool wxCDAudioWin::Pause(void)
151 {
152 if (!m_ok)
153 return FALSE;
154
155 return (mciSendCommand(m_internal->dev_id, MCI_PAUSE, 0, 0) == 0);
156 }
157
158 bool wxCDAudioWin::Resume(void)
159 {
160 if (!m_ok)
161 return FALSE;
162
163 return (mciSendCommand(m_internal->dev_id, MCI_RESUME, 0, 0) == 0);
164 }
165
166 wxCDAudio::CDstatus wxCDAudioWin::GetStatus(void)
167 {
168 MCI_STATUS_PARMS status_struct;
169
170 if (!m_ok)
171 return STOPPED;
172
173 status_struct.dwItem = MCI_STATUS_MODE;
174 mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
175 (DWORD)&status_struct);
176 switch (status_struct.dwReturn) {
177 case MCI_MODE_PAUSE:
178 return PAUSED;
179 case MCI_MODE_PLAY:
180 return PLAYING;
181 }
182 return STOPPED;
183 }
184
185 wxCDtime wxCDAudioWin::GetTime(void)
186 {
187 MCI_STATUS_PARMS status_struct;
188 wxCDtime cd_time = {-1, -1, -1, -1};
189
190 if (!m_ok)
191 return cd_time;
192
193 status_struct.dwItem = MCI_STATUS_TIME_FORMAT;
194 mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
195 (DWORD)&status_struct);
196 cd_time.track = MCI_TMSF_TRACK(status_struct.dwReturn);
197 cd_time.min = MCI_TMSF_MINUTE(status_struct.dwReturn);
198 cd_time.sec = MCI_TMSF_SECOND(status_struct.dwReturn);
199 cd_time.hour = cd_time.min / 60;
200 cd_time.min %= 60;
201 return cd_time;
202 }
203
204 wxCDAudio::CDtoc& wxCDAudioWin::GetToc(void)
205 {
206 return *m_toc;
207 }