1 ////////////////////////////////////////////////////////////////////////////////
4 // Author: Guilhem Lavaux
7 // Copyright: (C) 1997, 1998, Guilhem Lavaux
8 // License: wxWindows license
9 ////////////////////////////////////////////////////////////////////////////////
11 #pragma implementation "cdwin.h"
18 #include "wx/wxprec.h"
22 #define WXMMEDIA_INTERNAL
30 wxCDAudioWin::wxCDAudioWin(void)
31 : wxCDAudio(), m_trksize(NULL
), m_trkpos(NULL
), m_ok(TRUE
), m_toc(NULL
)
33 MCI_OPEN_PARMS open_struct
;
34 MCI_SET_PARMS set_struct
;
37 m_internal
= new CDAW_Internal
;
38 open_struct
.lpstrDeviceType
= "cdaudio";
39 ret
= mciSendCommand(NULL
, MCI_OPEN
, MCI_OPEN_TYPE
,
45 m_internal
->dev_id
= open_struct
.wDeviceID
;
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
);
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
);
58 wxCDAudioWin::~wxCDAudioWin(void)
61 mciSendCommand(m_internal
->dev_id
, MCI_CLOSE
, 0, NULL
);
69 void wxCDAudioWin::PrepareToc(void)
71 MCI_STATUS_PARMS status_struct
;
72 MCI_SET_PARMS set_struct
;
73 wxUint16 i
, nb_m_trksize
;
74 wxCDtime total_time
, *trk
;
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
;
85 m_trksize
= new wxCDtime
[nb_m_trksize
+1];
86 m_trkpos
= new wxCDtime
[nb_m_trksize
+1];
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;
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
;
108 trk
->min
= MCI_MSF_MINUTE(tmem
);
109 trk
->sec
= MCI_MSF_SECOND(tmem
);
110 trk
->hour
= trk
->min
/ 60;
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
;
122 trk
->min
= MCI_MSF_MINUTE(tmem
);
123 trk
->sec
= MCI_MSF_SECOND(tmem
);
124 trk
->hour
= trk
->min
/ 60;
128 m_toc
= new CDtoc(total_time
, m_trksize
, m_trkpos
);
131 bool wxCDAudioWin::Play(const wxCDtime
& beg_time
, const wxCDtime
& end_time
)
134 MCI_PLAY_PARMS play_struct
;
139 tmsf
= MCI_MAKE_TMSF(beg_time
.track
, beg_time
.min
,
141 play_struct
.dwFrom
= tmsf
;
142 tmsf
= MCI_MAKE_TMSF(end_time
.track
, end_time
.min
,
144 play_struct
.dwTo
= tmsf
;
146 mciSendCommand(m_internal
->dev_id
, MCI_PLAY
, 0, (DWORD
)&play_struct
);
150 bool wxCDAudioWin::Pause(void)
155 return (mciSendCommand(m_internal
->dev_id
, MCI_PAUSE
, 0, 0) == 0);
158 bool wxCDAudioWin::Resume(void)
163 return (mciSendCommand(m_internal
->dev_id
, MCI_RESUME
, 0, 0) == 0);
166 wxCDAudio::CDstatus
wxCDAudioWin::GetStatus(void)
168 MCI_STATUS_PARMS status_struct
;
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
) {
185 wxCDtime
wxCDAudioWin::GetTime(void)
187 MCI_STATUS_PARMS status_struct
;
188 wxCDtime cd_time
= {-1, -1, -1, -1};
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;
204 wxCDAudio::CDtoc
& wxCDAudioWin::GetToc(void)