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