Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 1 | /* -*- tab-width: 8; c-basic-offset: 4 -*- */ |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 2 | /* |
| 3 | * Sample MCI CDAUDIO Wine Driver for Linux |
| 4 | * |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 5 | * Copyright 1994 Martin Ayotte |
| 6 | * Copyright 1998-99 Eric Pouech |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 7 | */ |
| 8 | |
Marcus Meissner | 61afa33 | 1999-02-22 10:16:00 +0000 | [diff] [blame] | 9 | #include "winuser.h" |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 10 | #include "driver.h" |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 11 | #include "mmddk.h" |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 12 | #include "cdrom.h" |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 13 | #include "debugtools.h" |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 14 | |
Patrik Stridvall | b4b9fae | 1999-04-19 14:56:29 +0000 | [diff] [blame] | 15 | DEFAULT_DEBUG_CHANNEL(cdaudio) |
| 16 | |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 17 | typedef struct { |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 18 | UINT wDevID; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 19 | int nUseCount; /* Incremented for each shared open */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 20 | BOOL fShareable; /* TRUE if first open was shareable */ |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 21 | WORD wNotifyDeviceID; /* MCI device ID with a pending notification */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 22 | HANDLE hCallback; /* Callback handle for pending notification */ |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 23 | DWORD dwTimeFormat; |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 24 | WINE_CDAUDIO wcda; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 25 | int mciMode; |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 26 | } WINE_MCICDAUDIO; |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 27 | |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 28 | /*-----------------------------------------------------------------------*/ |
| 29 | |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 30 | /************************************************************************** |
Eric Pouech | 281c927 | 1999-05-02 10:21:49 +0000 | [diff] [blame] | 31 | * CDAUDIO_drvOpen [internal] |
| 32 | */ |
| 33 | static DWORD CDAUDIO_drvOpen(LPSTR str, LPMCI_OPEN_DRIVER_PARMSA modp) |
| 34 | { |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 35 | WINE_MCICDAUDIO* wmcda = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MCICDAUDIO)); |
Eric Pouech | 281c927 | 1999-05-02 10:21:49 +0000 | [diff] [blame] | 36 | |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 37 | if (!wmcda) |
| 38 | return 0; |
| 39 | |
| 40 | wmcda->wDevID = modp->wDeviceID; |
| 41 | mciSetDriverData(wmcda->wDevID, (DWORD)wmcda); |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 42 | modp->wCustomCommandTable = MCI_NO_COMMAND_TABLE; |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 43 | modp->wType = MCI_DEVTYPE_SEQUENCER; |
| 44 | return modp->wDeviceID; |
Eric Pouech | 281c927 | 1999-05-02 10:21:49 +0000 | [diff] [blame] | 45 | } |
| 46 | |
| 47 | /************************************************************************** |
| 48 | * CDAUDIO_drvClose [internal] |
| 49 | */ |
| 50 | static DWORD CDAUDIO_drvClose(DWORD dwDevID) |
| 51 | { |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 52 | WINE_MCICDAUDIO* wmcda = (WINE_MCICDAUDIO*)mciGetDriverData(dwDevID); |
Eric Pouech | 281c927 | 1999-05-02 10:21:49 +0000 | [diff] [blame] | 53 | |
| 54 | if (wmcda) { |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 55 | HeapFree(GetProcessHeap(), 0, wmcda); |
| 56 | mciSetDriverData(dwDevID, 0); |
Eric Pouech | 281c927 | 1999-05-02 10:21:49 +0000 | [diff] [blame] | 57 | } |
| 58 | return 0; |
| 59 | } |
| 60 | |
| 61 | /************************************************************************** |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 62 | * CDAUDIO_mciGetOpenDrv [internal] |
| 63 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 64 | static WINE_MCICDAUDIO* CDAUDIO_mciGetOpenDrv(UINT wDevID) |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 65 | { |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 66 | WINE_MCICDAUDIO* wmcda = (WINE_MCICDAUDIO*)mciGetDriverData(wDevID); |
Eric Pouech | 281c927 | 1999-05-02 10:21:49 +0000 | [diff] [blame] | 67 | |
| 68 | if (wmcda == NULL || wmcda->nUseCount == 0 || wmcda->wcda.unixdev <= 0) { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 69 | WARN("Invalid wDevID=%u\n", wDevID); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 70 | return 0; |
| 71 | } |
Eric Pouech | 281c927 | 1999-05-02 10:21:49 +0000 | [diff] [blame] | 72 | return wmcda; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 73 | } |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 74 | |
| 75 | /************************************************************************** |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 76 | * CDAUDIO_mciMode [internal] |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 77 | */ |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 78 | static int CDAUDIO_mciMode(int wcdaMode) |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 79 | { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 80 | switch (wcdaMode) { |
| 81 | case WINE_CDA_DONTKNOW: return MCI_MODE_STOP; |
| 82 | case WINE_CDA_NOTREADY: return MCI_MODE_STOP; |
| 83 | case WINE_CDA_OPEN: return MCI_MODE_OPEN; |
| 84 | case WINE_CDA_PLAY: return MCI_MODE_PLAY; |
| 85 | case WINE_CDA_STOP: return MCI_MODE_STOP; |
| 86 | case WINE_CDA_PAUSE: return MCI_MODE_PAUSE; |
| 87 | default: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 88 | FIXME("Unknown mode %04x\n", wcdaMode); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 89 | } |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 90 | return MCI_MODE_STOP; |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 91 | } |
| 92 | |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 93 | /************************************************************************** |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 94 | * CDAUDIO_mciGetError [internal] |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 95 | */ |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 96 | static int CDAUDIO_mciGetError(WINE_MCICDAUDIO* wmcda) |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 97 | { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 98 | switch (wmcda->wcda.cdaMode) { |
| 99 | case WINE_CDA_DONTKNOW: |
| 100 | case WINE_CDA_NOTREADY: return MCIERR_DEVICE_NOT_READY; |
| 101 | case WINE_CDA_OPEN: return MCIERR_DEVICE_OPEN; |
| 102 | case WINE_CDA_PLAY: |
| 103 | case WINE_CDA_STOP: |
| 104 | case WINE_CDA_PAUSE: break; |
| 105 | default: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 106 | FIXME("Unknown mode %04x\n", wmcda->wcda.cdaMode); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 107 | } |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 108 | return MCIERR_DRIVER_INTERNAL; |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 109 | } |
| 110 | |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 111 | /************************************************************************** |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 112 | * CDAUDIO_CalcFrame [internal] |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 113 | */ |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 114 | static DWORD CDAUDIO_CalcFrame(WINE_MCICDAUDIO* wmcda, DWORD dwTime) |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 115 | { |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 116 | DWORD dwFrame = 0; |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 117 | UINT wTrack; |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 118 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 119 | TRACE("(%p, %08lX, %lu);\n", wmcda, wmcda->dwTimeFormat, dwTime); |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 120 | |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 121 | switch (wmcda->dwTimeFormat) { |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 122 | case MCI_FORMAT_MILLISECONDS: |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 123 | dwFrame = (dwTime * CDFRAMES_PERSEC) / 1000; |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 124 | TRACE("MILLISECONDS %lu\n", dwFrame); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 125 | break; |
| 126 | case MCI_FORMAT_MSF: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 127 | TRACE("MSF %02u:%02u:%02u\n", |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 128 | MCI_MSF_MINUTE(dwTime), MCI_MSF_SECOND(dwTime), MCI_MSF_FRAME(dwTime)); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 129 | dwFrame += CDFRAMES_PERMIN * MCI_MSF_MINUTE(dwTime); |
| 130 | dwFrame += CDFRAMES_PERSEC * MCI_MSF_SECOND(dwTime); |
| 131 | dwFrame += MCI_MSF_FRAME(dwTime); |
| 132 | break; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 133 | case MCI_FORMAT_TMSF: |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 134 | default: |
| 135 | /* unknown format ! force TMSF ! ... */ |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 136 | wTrack = MCI_TMSF_TRACK(dwTime); |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 137 | TRACE("MSF %02u-%02u:%02u:%02u\n", |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 138 | MCI_TMSF_TRACK(dwTime), MCI_TMSF_MINUTE(dwTime), |
| 139 | MCI_TMSF_SECOND(dwTime), MCI_TMSF_FRAME(dwTime)); |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 140 | TRACE("TMSF trackpos[%u]=%lu\n", |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 141 | wTrack, wmcda->wcda.lpdwTrackPos[wTrack - 1]); |
| 142 | dwFrame = wmcda->wcda.lpdwTrackPos[wTrack - 1]; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 143 | dwFrame += CDFRAMES_PERMIN * MCI_TMSF_MINUTE(dwTime); |
| 144 | dwFrame += CDFRAMES_PERSEC * MCI_TMSF_SECOND(dwTime); |
| 145 | dwFrame += MCI_TMSF_FRAME(dwTime); |
| 146 | break; |
| 147 | } |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 148 | return dwFrame; |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 149 | } |
| 150 | |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 151 | /************************************************************************** |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 152 | * CDAUDIO_CalcTime [internal] |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 153 | */ |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 154 | static DWORD CDAUDIO_CalcTime(WINE_MCICDAUDIO* wmcda, DWORD dwFrame, LPDWORD lpRet) |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 155 | { |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 156 | DWORD dwTime = 0; |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 157 | UINT wTrack; |
| 158 | UINT wMinutes; |
| 159 | UINT wSeconds; |
| 160 | UINT wFrames; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 161 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 162 | TRACE("(%p, %08lX, %lu);\n", wmcda, wmcda->dwTimeFormat, dwFrame); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 163 | |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 164 | switch (wmcda->dwTimeFormat) { |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 165 | case MCI_FORMAT_MILLISECONDS: |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 166 | dwTime = (dwFrame * 1000) / CDFRAMES_PERSEC; |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 167 | TRACE("MILLISECONDS %lu\n", dwTime); |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 168 | *lpRet = 0; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 169 | break; |
| 170 | case MCI_FORMAT_MSF: |
| 171 | wMinutes = dwFrame / CDFRAMES_PERMIN; |
| 172 | wSeconds = (dwFrame - CDFRAMES_PERMIN * wMinutes) / CDFRAMES_PERSEC; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 173 | wFrames = dwFrame - CDFRAMES_PERMIN * wMinutes - CDFRAMES_PERSEC * wSeconds; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 174 | dwTime = MCI_MAKE_MSF(wMinutes, wSeconds, wFrames); |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 175 | TRACE("MSF %02u:%02u:%02u -> dwTime=%lu\n", |
| 176 | wMinutes, wSeconds, wFrames, dwTime); |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 177 | *lpRet = MCI_COLONIZED3_RETURN; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 178 | break; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 179 | case MCI_FORMAT_TMSF: |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 180 | default: |
| 181 | /* unknown format ! force TMSF ! ... */ |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 182 | for (wTrack = 0; wTrack < wmcda->wcda.nTracks; wTrack++) { |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 183 | /*dwTime += wmcda->lpdwTrackLen[wTrack - 1]; |
| 184 | TRACE("Adding trk#%u curpos=%u \n", dwTime); |
| 185 | if (dwTime >= dwFrame) break; */ |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 186 | if (wmcda->wcda.lpdwTrackPos[wTrack - 1] >= dwFrame) break; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 187 | } |
| 188 | wMinutes = dwFrame / CDFRAMES_PERMIN; |
| 189 | wSeconds = (dwFrame - CDFRAMES_PERMIN * wMinutes) / CDFRAMES_PERSEC; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 190 | wFrames = dwFrame - CDFRAMES_PERMIN * wMinutes - CDFRAMES_PERSEC * wSeconds; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 191 | dwTime = MCI_MAKE_TMSF(wTrack, wMinutes, wSeconds, wFrames); |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 192 | TRACE("%02u-%02u:%02u:%02u\n", wTrack, wMinutes, wSeconds, wFrames); |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 193 | *lpRet = MCI_COLONIZED4_RETURN; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 194 | break; |
| 195 | } |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 196 | return dwTime; |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 197 | } |
| 198 | |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 199 | static DWORD CDAUDIO_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms); |
| 200 | static DWORD CDAUDIO_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 201 | |
| 202 | /************************************************************************** |
| 203 | * CDAUDIO_mciOpen [internal] |
| 204 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 205 | static DWORD CDAUDIO_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSA lpOpenParms) |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 206 | { |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 207 | DWORD dwDeviceID; |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 208 | WINE_MCICDAUDIO* wmcda = (WINE_MCICDAUDIO*)mciGetDriverData(wDevID); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 209 | MCI_SEEK_PARMS seekParms; |
| 210 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 211 | TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpOpenParms); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 212 | |
| 213 | if (lpOpenParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; |
Eric Pouech | 281c927 | 1999-05-02 10:21:49 +0000 | [diff] [blame] | 214 | if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 215 | |
| 216 | dwDeviceID = lpOpenParms->wDeviceID; |
| 217 | |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 218 | if (wmcda->nUseCount > 0) { |
| 219 | /* The driver is already open on this channel */ |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 220 | /* If the driver was opened shareable before and this open specifies */ |
| 221 | /* shareable then increment the use count */ |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 222 | if (wmcda->fShareable && (dwFlags & MCI_OPEN_SHAREABLE)) |
| 223 | ++wmcda->nUseCount; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 224 | else |
| 225 | return MCIERR_MUST_USE_SHAREABLE; |
| 226 | } else { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 227 | wmcda->nUseCount = 1; |
| 228 | wmcda->fShareable = dwFlags & MCI_OPEN_SHAREABLE; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 229 | } |
| 230 | if (dwFlags & MCI_OPEN_ELEMENT) { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 231 | TRACE("MCI_OPEN_ELEMENT !\n"); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 232 | /* return MCIERR_NO_ELEMENT_ALLOWED; */ |
| 233 | } |
| 234 | |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 235 | wmcda->wNotifyDeviceID = dwDeviceID; |
| 236 | if (CDAUDIO_Open(&wmcda->wcda) == -1) { |
| 237 | --wmcda->nUseCount; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 238 | return MCIERR_HARDWARE; |
| 239 | } |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 240 | wmcda->mciMode = MCI_MODE_STOP; |
| 241 | wmcda->dwTimeFormat = MCI_FORMAT_TMSF; |
| 242 | if (!CDAUDIO_GetTracksInfo(&wmcda->wcda)) { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 243 | WARN("error reading TracksInfo !\n"); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 244 | /* return MCIERR_INTERNAL; */ |
| 245 | } |
| 246 | |
| 247 | CDAUDIO_mciSeek(wDevID, MCI_SEEK_TO_START, &seekParms); |
| 248 | |
| 249 | return 0; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 250 | } |
| 251 | |
| 252 | /************************************************************************** |
| 253 | * CDAUDIO_mciClose [internal] |
| 254 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 255 | static DWORD CDAUDIO_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms) |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 256 | { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 257 | WINE_MCICDAUDIO* wmcda = CDAUDIO_mciGetOpenDrv(wDevID); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 258 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 259 | TRACE("(%04X, %08lX, %p);\n", wDevID, dwParam, lpParms); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 260 | |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 261 | if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 262 | |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 263 | if (wmcda->nUseCount == 1) { |
Eric Pouech | d6bbbeb | 1999-03-15 15:15:29 +0000 | [diff] [blame] | 264 | /* FIXME: I don't think we have to stop CD on exit |
| 265 | * CDAUDIO_mciStop(wDevID, 0, NULL); |
| 266 | */ |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 267 | CDAUDIO_Close(&wmcda->wcda); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 268 | } |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 269 | wmcda->nUseCount--; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 270 | return 0; |
| 271 | } |
| 272 | |
| 273 | /************************************************************************** |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 274 | * CDAUDIO_mciGetDevCaps [internal] |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 275 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 276 | static DWORD CDAUDIO_mciGetDevCaps(UINT wDevID, DWORD dwFlags, |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 277 | LPMCI_GETDEVCAPS_PARMS lpParms) |
| 278 | { |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 279 | DWORD ret = 0; |
| 280 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 281 | TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 282 | |
| 283 | if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; |
| 284 | |
| 285 | if (dwFlags & MCI_GETDEVCAPS_ITEM) { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 286 | TRACE("MCI_GETDEVCAPS_ITEM dwItem=%08lX;\n", lpParms->dwItem); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 287 | |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 288 | switch (lpParms->dwItem) { |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 289 | case MCI_GETDEVCAPS_CAN_RECORD: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 290 | lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); |
| 291 | ret = MCI_RESOURCE_RETURNED; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 292 | break; |
| 293 | case MCI_GETDEVCAPS_HAS_AUDIO: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 294 | lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE); |
| 295 | ret = MCI_RESOURCE_RETURNED; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 296 | break; |
| 297 | case MCI_GETDEVCAPS_HAS_VIDEO: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 298 | lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); |
| 299 | ret = MCI_RESOURCE_RETURNED; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 300 | break; |
| 301 | case MCI_GETDEVCAPS_DEVICE_TYPE: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 302 | lpParms->dwReturn = MAKEMCIRESOURCE(MCI_DEVTYPE_CD_AUDIO, MCI_DEVTYPE_CD_AUDIO); |
| 303 | ret = MCI_RESOURCE_RETURNED; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 304 | break; |
| 305 | case MCI_GETDEVCAPS_USES_FILES: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 306 | lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); |
| 307 | ret = MCI_RESOURCE_RETURNED; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 308 | break; |
| 309 | case MCI_GETDEVCAPS_COMPOUND_DEVICE: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 310 | lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); |
| 311 | ret = MCI_RESOURCE_RETURNED; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 312 | break; |
| 313 | case MCI_GETDEVCAPS_CAN_EJECT: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 314 | lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE); |
| 315 | ret = MCI_RESOURCE_RETURNED; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 316 | break; |
| 317 | case MCI_GETDEVCAPS_CAN_PLAY: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 318 | lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE); |
| 319 | ret = MCI_RESOURCE_RETURNED; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 320 | break; |
| 321 | case MCI_GETDEVCAPS_CAN_SAVE: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 322 | lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); |
| 323 | ret = MCI_RESOURCE_RETURNED; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 324 | break; |
| 325 | default: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 326 | ERR("Unsupported %lx devCaps item\n", lpParms->dwItem); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 327 | return MCIERR_UNRECOGNIZED_COMMAND; |
| 328 | } |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 329 | } else { |
| 330 | TRACE("No GetDevCaps-Item !\n"); |
| 331 | return MCIERR_UNRECOGNIZED_COMMAND; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 332 | } |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 333 | TRACE("lpParms->dwReturn=%08lX;\n", lpParms->dwReturn); |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 334 | return ret; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 335 | } |
| 336 | |
| 337 | /************************************************************************** |
| 338 | * CDAUDIO_mciInfo [internal] |
| 339 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 340 | static DWORD CDAUDIO_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSA lpParms) |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 341 | { |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 342 | LPSTR str = 0; |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 343 | WINE_MCICDAUDIO* wmcda = CDAUDIO_mciGetOpenDrv(wDevID); |
| 344 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 345 | TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 346 | |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 347 | if (lpParms == NULL || lpParms->lpstrReturn == NULL) |
| 348 | return MCIERR_NULL_PARAMETER_BLOCK; |
| 349 | if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; |
| 350 | |
| 351 | TRACE("buf=%p, len=%lu\n", lpParms->lpstrReturn, lpParms->dwRetSize); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 352 | |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 353 | switch(dwFlags) { |
| 354 | case MCI_INFO_PRODUCT: |
| 355 | str = "Wine's audio CD"; |
| 356 | break; |
| 357 | default: |
| 358 | WARN("Don't know this info command (%lu)\n", dwFlags); |
| 359 | return MCIERR_UNRECOGNIZED_COMMAND; |
| 360 | } |
| 361 | return MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize, str); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 362 | } |
Alexandre Julliard | bd34d4f | 1995-06-20 19:08:12 +0000 | [diff] [blame] | 363 | |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 364 | /************************************************************************** |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 365 | * CDAUDIO_mciStatus [internal] |
| 366 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 367 | static DWORD CDAUDIO_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms) |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 368 | { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 369 | WINE_MCICDAUDIO* wmcda = CDAUDIO_mciGetOpenDrv(wDevID); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 370 | DWORD ret = 0; |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 371 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 372 | TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 373 | |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 374 | if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; |
| 375 | if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; |
| 376 | |
| 377 | if (dwFlags & MCI_NOTIFY) { |
| 378 | TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 379 | mciDriverNotify((HWND)LOWORD(lpParms->dwCallback), |
| 380 | wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 381 | } |
| 382 | if (dwFlags & MCI_STATUS_ITEM) { |
| 383 | switch (lpParms->dwItem) { |
| 384 | case MCI_STATUS_CURRENT_TRACK: |
| 385 | if (!CDAUDIO_GetCDStatus(&wmcda->wcda)) { |
| 386 | return CDAUDIO_mciGetError(wmcda); |
| 387 | } |
| 388 | lpParms->dwReturn = wmcda->wcda.nCurTrack; |
| 389 | TRACE("CURRENT_TRACK=%lu!\n", lpParms->dwReturn); |
| 390 | break; |
| 391 | case MCI_STATUS_LENGTH: |
| 392 | if (wmcda->wcda.nTracks == 0) { |
| 393 | if (!CDAUDIO_GetTracksInfo(&wmcda->wcda)) { |
| 394 | WARN("error reading TracksInfo !\n"); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 395 | return CDAUDIO_mciGetError(wmcda); |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 396 | } |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 397 | } |
| 398 | if (dwFlags & MCI_TRACK) { |
| 399 | TRACE("MCI_TRACK #%lu LENGTH=??? !\n", lpParms->dwTrack); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 400 | if (lpParms->dwTrack > wmcda->wcda.nTracks || lpParms->dwTrack == 0) |
| 401 | return MCIERR_OUTOFRANGE; |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 402 | lpParms->dwReturn = wmcda->wcda.lpdwTrackLen[lpParms->dwTrack - 1]; |
| 403 | } else { |
| 404 | lpParms->dwReturn = wmcda->wcda.dwTotalLen; |
| 405 | } |
| 406 | lpParms->dwReturn = CDAUDIO_CalcTime(wmcda, lpParms->dwReturn, &ret); |
| 407 | TRACE("LENGTH=%lu !\n", lpParms->dwReturn); |
| 408 | break; |
| 409 | case MCI_STATUS_MODE: |
| 410 | if (!CDAUDIO_GetCDStatus(&wmcda->wcda)) |
| 411 | return CDAUDIO_mciGetError(wmcda); |
| 412 | lpParms->dwReturn = CDAUDIO_mciMode(wmcda->wcda.cdaMode); |
| 413 | if (!lpParms->dwReturn) lpParms->dwReturn = wmcda->mciMode; |
| 414 | TRACE("MCI_STATUS_MODE=%08lX !\n", lpParms->dwReturn); |
| 415 | lpParms->dwReturn = MAKEMCIRESOURCE(lpParms->dwReturn, lpParms->dwReturn); |
| 416 | ret = MCI_RESOURCE_RETURNED; |
| 417 | break; |
| 418 | case MCI_STATUS_MEDIA_PRESENT: |
| 419 | if (!CDAUDIO_GetCDStatus(&wmcda->wcda)) |
| 420 | return CDAUDIO_mciGetError(wmcda); |
| 421 | lpParms->dwReturn = (wmcda->wcda.nTracks == 0) ? |
| 422 | MAKEMCIRESOURCE(FALSE, MCI_FALSE) : MAKEMCIRESOURCE(TRUE, MCI_TRUE); |
| 423 | TRACE("MCI_STATUS_MEDIA_PRESENT =%s!\n", LOWORD(lpParms->dwReturn) ? "Y" : "N"); |
| 424 | ret = MCI_RESOURCE_RETURNED; |
| 425 | break; |
| 426 | case MCI_STATUS_NUMBER_OF_TRACKS: |
| 427 | lpParms->dwReturn = CDAUDIO_GetNumberOfTracks(&wmcda->wcda); |
| 428 | TRACE("MCI_STATUS_NUMBER_OF_TRACKS = %lu !\n", lpParms->dwReturn); |
| 429 | if (lpParms->dwReturn == (WORD)-1) |
| 430 | return CDAUDIO_mciGetError(wmcda); |
| 431 | break; |
| 432 | case MCI_STATUS_POSITION: |
| 433 | if (!CDAUDIO_GetCDStatus(&wmcda->wcda)) |
| 434 | return CDAUDIO_mciGetError(wmcda); |
| 435 | lpParms->dwReturn = wmcda->wcda.dwCurFrame; |
| 436 | if (dwFlags & MCI_STATUS_START) { |
| 437 | lpParms->dwReturn = wmcda->wcda.dwFirstOffset; |
| 438 | TRACE("get MCI_STATUS_START !\n"); |
| 439 | } |
| 440 | if (dwFlags & MCI_TRACK) { |
| 441 | if (lpParms->dwTrack > wmcda->wcda.nTracks || lpParms->dwTrack == 0) |
| 442 | return MCIERR_OUTOFRANGE; |
| 443 | lpParms->dwReturn = wmcda->wcda.lpdwTrackPos[lpParms->dwTrack - 1]; |
| 444 | TRACE("get MCI_TRACK #%lu !\n", lpParms->dwTrack); |
| 445 | } |
| 446 | lpParms->dwReturn = CDAUDIO_CalcTime(wmcda, lpParms->dwReturn, &ret); |
| 447 | TRACE("MCI_STATUS_POSITION=%08lX !\n", lpParms->dwReturn); |
| 448 | break; |
| 449 | case MCI_STATUS_READY: |
| 450 | TRACE("MCI_STATUS_READY !\n"); |
| 451 | lpParms->dwReturn = (wmcda->wcda.cdaMode == WINE_CDA_DONTKNOW || |
| 452 | wmcda->wcda.cdaMode == WINE_CDA_NOTREADY) ? |
| 453 | MAKEMCIRESOURCE(FALSE, MCI_FALSE) : MAKEMCIRESOURCE(TRUE, MCI_TRUE); |
| 454 | TRACE("MCI_STATUS_READY=%u!\n", LOWORD(lpParms->dwReturn)); |
| 455 | ret = MCI_RESOURCE_RETURNED; |
| 456 | break; |
| 457 | case MCI_STATUS_TIME_FORMAT: |
| 458 | lpParms->dwReturn = MAKEMCIRESOURCE(wmcda->dwTimeFormat, wmcda->dwTimeFormat); |
| 459 | TRACE("MCI_STATUS_TIME_FORMAT=%08x!\n", LOWORD(lpParms->dwReturn)); |
| 460 | ret = MCI_RESOURCE_RETURNED; |
| 461 | break; |
| 462 | case MCI_CDA_STATUS_TYPE_TRACK: |
| 463 | if (!(dwFlags & MCI_TRACK)) |
| 464 | ret = MCIERR_MISSING_PARAMETER; |
| 465 | else if (lpParms->dwTrack > wmcda->wcda.nTracks || lpParms->dwTrack == 0) |
| 466 | ret = MCIERR_OUTOFRANGE; |
| 467 | else |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 468 | lpParms->dwReturn = (wmcda->wcda.lpbTrackFlags[lpParms->dwTrack - 1] & |
| 469 | CDROM_DATA_TRACK) ? MCI_CDA_TRACK_OTHER : MCI_CDA_TRACK_AUDIO; |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 470 | TRACE("MCI_CDA_STATUS_TYPE_TRACK[%ld]=%08lx\n", lpParms->dwTrack, lpParms->dwReturn); |
| 471 | break; |
| 472 | default: |
| 473 | FIXME("unknown command %08lX !\n", lpParms->dwItem); |
| 474 | return MCIERR_UNRECOGNIZED_COMMAND; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 475 | } |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 476 | } else { |
| 477 | WARN("not MCI_STATUS_ITEM !\n"); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 478 | } |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 479 | return ret; |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 480 | } |
| 481 | |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 482 | /************************************************************************** |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 483 | * CDAUDIO_mciPlay [internal] |
| 484 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 485 | static DWORD CDAUDIO_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 486 | { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 487 | int start, end; |
| 488 | WINE_MCICDAUDIO* wmcda = CDAUDIO_mciGetOpenDrv(wDevID); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 489 | DWORD ret = 0; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 490 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 491 | TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 492 | |
| 493 | if (lpParms == NULL) { |
| 494 | ret = MCIERR_NULL_PARAMETER_BLOCK; |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 495 | } else if (wmcda == NULL) { |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 496 | ret = MCIERR_INVALID_DEVICE_ID; |
| 497 | } else { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 498 | if (wmcda->wcda.nTracks == 0) { |
| 499 | if (!CDAUDIO_GetTracksInfo(&wmcda->wcda)) { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 500 | WARN("error reading TracksInfo !\n"); |
Ove Kaaven | d4fb057 | 1999-01-03 12:27:28 +0000 | [diff] [blame] | 501 | return MCIERR_DRIVER_INTERNAL; |
| 502 | } |
| 503 | } |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 504 | wmcda->wcda.nCurTrack = 1; |
| 505 | if (dwFlags & MCI_FROM) { |
Eric Pouech | 25ec27a | 1999-04-19 16:26:27 +0000 | [diff] [blame] | 506 | start = CDAUDIO_CalcFrame(wmcda, lpParms->dwFrom); |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 507 | TRACE("MCI_FROM=%08lX -> %u \n", lpParms->dwFrom, start); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 508 | } else { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 509 | if (!CDAUDIO_GetCDStatus(&wmcda->wcda)) return MCIERR_DRIVER_INTERNAL; |
| 510 | start = wmcda->wcda.dwCurFrame; |
| 511 | } |
| 512 | if (dwFlags & MCI_TO) { |
| 513 | end = CDAUDIO_CalcFrame(wmcda, lpParms->dwTo); |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 514 | TRACE("MCI_TO=%08lX -> %u \n", lpParms->dwTo, end); |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 515 | } else { |
| 516 | end = wmcda->wcda.dwFirstOffset + wmcda->wcda.dwTotalLen; |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 517 | } |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 518 | |
| 519 | if (CDAUDIO_Play(&wmcda->wcda, start, end) == -1) |
| 520 | return MCIERR_HARDWARE; |
| 521 | wmcda->mciMode = MCI_MODE_PLAY; |
| 522 | if (dwFlags & MCI_NOTIFY) { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 523 | TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 524 | /* |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 525 | mciDriverNotify((HWND)LOWORD(lpParms->dwCallback), |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 526 | wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); |
| 527 | */ |
| 528 | } |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 529 | } |
| 530 | return ret; |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 531 | } |
| 532 | |
| 533 | /************************************************************************** |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 534 | * CDAUDIO_mciStop [internal] |
| 535 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 536 | static DWORD CDAUDIO_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 537 | { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 538 | WINE_MCICDAUDIO* wmcda = CDAUDIO_mciGetOpenDrv(wDevID); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 539 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 540 | TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 541 | |
| 542 | if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; |
| 543 | |
| 544 | if (CDAUDIO_Stop(&wmcda->wcda) == -1) |
Todd Vierling | ecc7669 | 1998-12-15 17:49:02 +0000 | [diff] [blame] | 545 | return MCIERR_HARDWARE; |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 546 | |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 547 | wmcda->mciMode = MCI_MODE_STOP; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 548 | if (lpParms && (dwFlags & MCI_NOTIFY)) { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 549 | TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 550 | mciDriverNotify((HWND)LOWORD(lpParms->dwCallback), |
| 551 | wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 552 | } |
| 553 | return 0; |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 554 | } |
| 555 | |
| 556 | /************************************************************************** |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 557 | * CDAUDIO_mciPause [internal] |
| 558 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 559 | static DWORD CDAUDIO_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 560 | { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 561 | WINE_MCICDAUDIO* wmcda = CDAUDIO_mciGetOpenDrv(wDevID); |
| 562 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 563 | TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 564 | |
| 565 | if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; |
| 566 | |
| 567 | if (CDAUDIO_Pause(&wmcda->wcda, 1) == -1) |
Todd Vierling | ecc7669 | 1998-12-15 17:49:02 +0000 | [diff] [blame] | 568 | return MCIERR_HARDWARE; |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 569 | wmcda->mciMode = MCI_MODE_PAUSE; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 570 | if (lpParms && (dwFlags & MCI_NOTIFY)) { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 571 | TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 572 | mciDriverNotify((HWND)LOWORD(lpParms->dwCallback), |
| 573 | wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 574 | } |
| 575 | return 0; |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 576 | } |
| 577 | |
| 578 | /************************************************************************** |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 579 | * CDAUDIO_mciResume [internal] |
| 580 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 581 | static DWORD CDAUDIO_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 582 | { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 583 | WINE_MCICDAUDIO* wmcda = CDAUDIO_mciGetOpenDrv(wDevID); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 584 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 585 | TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 586 | |
| 587 | if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; |
| 588 | |
| 589 | if (CDAUDIO_Pause(&wmcda->wcda, 0) == -1) |
Todd Vierling | ecc7669 | 1998-12-15 17:49:02 +0000 | [diff] [blame] | 590 | return MCIERR_HARDWARE; |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 591 | wmcda->mciMode = MCI_MODE_STOP; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 592 | if (lpParms && (dwFlags & MCI_NOTIFY)) { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 593 | TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 594 | mciDriverNotify((HWND)LOWORD(lpParms->dwCallback), |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 595 | wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 596 | } |
| 597 | return 0; |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 598 | } |
| 599 | |
| 600 | /************************************************************************** |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 601 | * CDAUDIO_mciSeek [internal] |
| 602 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 603 | static DWORD CDAUDIO_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 604 | { |
Eric Pouech | d6bbbeb | 1999-03-15 15:15:29 +0000 | [diff] [blame] | 605 | DWORD at; |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 606 | WINE_MCICDAUDIO* wmcda = CDAUDIO_mciGetOpenDrv(wDevID); |
| 607 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 608 | TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 609 | |
| 610 | if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 611 | if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; |
| 612 | |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 613 | wmcda->mciMode = MCI_MODE_SEEK; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 614 | switch (dwFlags & ~(MCI_NOTIFY|MCI_WAIT)) { |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 615 | case MCI_SEEK_TO_START: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 616 | TRACE("Seeking to start\n"); |
Eric Pouech | d6bbbeb | 1999-03-15 15:15:29 +0000 | [diff] [blame] | 617 | at = 0; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 618 | break; |
| 619 | case MCI_SEEK_TO_END: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 620 | TRACE("Seeking to end\n"); |
Eric Pouech | d6bbbeb | 1999-03-15 15:15:29 +0000 | [diff] [blame] | 621 | at = wmcda->wcda.dwTotalLen; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 622 | break; |
| 623 | case MCI_TO: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 624 | TRACE("Seeking to %lu\n", lpParms->dwTo); |
Eric Pouech | d6bbbeb | 1999-03-15 15:15:29 +0000 | [diff] [blame] | 625 | at = lpParms->dwTo; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 626 | break; |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 627 | default: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 628 | TRACE("Seeking to ??=%lu\n", dwFlags); |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 629 | return MCIERR_UNSUPPORTED_FUNCTION; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 630 | } |
Eric Pouech | d6bbbeb | 1999-03-15 15:15:29 +0000 | [diff] [blame] | 631 | if (CDAUDIO_Seek(&wmcda->wcda, at) == -1) { |
| 632 | return MCIERR_HARDWARE; |
| 633 | } |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 634 | if (dwFlags & MCI_NOTIFY) { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 635 | TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 636 | mciDriverNotify((HWND)LOWORD(lpParms->dwCallback), |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 637 | wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 638 | } |
Eric Pouech | d6bbbeb | 1999-03-15 15:15:29 +0000 | [diff] [blame] | 639 | return 0; |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 640 | } |
| 641 | |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 642 | /************************************************************************** |
| 643 | * CDAUDIO_mciSetDoor [internal] |
| 644 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 645 | static DWORD CDAUDIO_mciSetDoor(UINT wDevID, int open) |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 646 | { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 647 | WINE_MCICDAUDIO* wmcda = CDAUDIO_mciGetOpenDrv(wDevID); |
| 648 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 649 | TRACE("(%04x, %s) !\n", wDevID, (open) ? "OPEN" : "CLOSE"); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 650 | |
| 651 | if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; |
| 652 | |
| 653 | if (CDAUDIO_SetDoor(&wmcda->wcda, open) == -1) |
| 654 | return MCIERR_HARDWARE; |
| 655 | wmcda->mciMode = (open) ? MCI_MODE_OPEN : MCI_MODE_STOP; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 656 | return 0; |
| 657 | } |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 658 | |
| 659 | /************************************************************************** |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 660 | * CDAUDIO_mciSet [internal] |
| 661 | */ |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 662 | static DWORD CDAUDIO_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 663 | { |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 664 | WINE_MCICDAUDIO* wmcda = CDAUDIO_mciGetOpenDrv(wDevID); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 665 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 666 | TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 667 | |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 668 | if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 669 | if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 670 | /* |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 671 | TRACE("dwTimeFormat=%08lX\n", lpParms->dwTimeFormat); |
| 672 | TRACE("dwAudio=%08lX\n", lpParms->dwAudio); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 673 | */ |
| 674 | if (dwFlags & MCI_SET_TIME_FORMAT) { |
| 675 | switch (lpParms->dwTimeFormat) { |
| 676 | case MCI_FORMAT_MILLISECONDS: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 677 | TRACE("MCI_FORMAT_MILLISECONDS !\n"); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 678 | break; |
| 679 | case MCI_FORMAT_MSF: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 680 | TRACE("MCI_FORMAT_MSF !\n"); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 681 | break; |
| 682 | case MCI_FORMAT_TMSF: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 683 | TRACE("MCI_FORMAT_TMSF !\n"); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 684 | break; |
| 685 | default: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 686 | WARN("bad time format !\n"); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 687 | return MCIERR_BAD_TIME_FORMAT; |
| 688 | } |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 689 | wmcda->dwTimeFormat = lpParms->dwTimeFormat; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 690 | } |
| 691 | if (dwFlags & MCI_SET_DOOR_OPEN) { |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 692 | CDAUDIO_mciSetDoor(wDevID, TRUE); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 693 | } |
| 694 | if (dwFlags & MCI_SET_DOOR_CLOSED) { |
Eric Pouech | fdae503 | 1998-12-18 15:05:25 +0000 | [diff] [blame] | 695 | CDAUDIO_mciSetDoor(wDevID, FALSE); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 696 | } |
| 697 | if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION; |
| 698 | if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION; |
| 699 | if (dwFlags & MCI_SET_OFF) return MCIERR_UNSUPPORTED_FUNCTION; |
| 700 | if (dwFlags & MCI_NOTIFY) { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 701 | TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 702 | lpParms->dwCallback); |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 703 | mciDriverNotify((HWND)LOWORD(lpParms->dwCallback), |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 704 | wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 705 | } |
| 706 | return 0; |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 707 | } |
| 708 | |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 709 | /************************************************************************** |
Eric Pouech | d6bbbeb | 1999-03-15 15:15:29 +0000 | [diff] [blame] | 710 | * MCICDAUDIO_DriverProc [sample driver] |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 711 | */ |
Eric Pouech | 8d108a2 | 1999-07-15 14:43:13 +0000 | [diff] [blame] | 712 | LONG CALLBACK MCICDAUDIO_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg, |
| 713 | DWORD dwParam1, DWORD dwParam2) |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 714 | { |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 715 | switch(wMsg) { |
| 716 | case DRV_LOAD: return 1; |
| 717 | case DRV_FREE: return 1; |
Eric Pouech | 281c927 | 1999-05-02 10:21:49 +0000 | [diff] [blame] | 718 | case DRV_OPEN: return CDAUDIO_drvOpen((LPSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSA)dwParam2); |
| 719 | case DRV_CLOSE: return CDAUDIO_drvClose(dwDevID); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 720 | case DRV_ENABLE: return 1; |
| 721 | case DRV_DISABLE: return 1; |
| 722 | case DRV_QUERYCONFIGURE: return 1; |
Eric Pouech | 281c927 | 1999-05-02 10:21:49 +0000 | [diff] [blame] | 723 | case DRV_CONFIGURE: MessageBoxA(0, "Sample Multimedia Driver !", "Wine Driver", MB_OK); return 1; |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 724 | case DRV_INSTALL: return DRVCNF_RESTART; |
| 725 | case DRV_REMOVE: return DRVCNF_RESTART; |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 726 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 727 | case MCI_OPEN_DRIVER: return CDAUDIO_mciOpen(dwDevID, dwParam1, (LPMCI_OPEN_PARMSA)dwParam2); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 728 | case MCI_CLOSE_DRIVER: return CDAUDIO_mciClose(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 729 | case MCI_GETDEVCAPS: return CDAUDIO_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2); |
Eric Pouech | 37c0217 | 1999-09-05 16:44:38 +0000 | [diff] [blame] | 730 | case MCI_INFO: return CDAUDIO_mciInfo(dwDevID, dwParam1, (LPMCI_INFO_PARMSA)dwParam2); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 731 | case MCI_STATUS: return CDAUDIO_mciStatus(dwDevID, dwParam1, (LPMCI_STATUS_PARMS)dwParam2); |
| 732 | case MCI_SET: return CDAUDIO_mciSet(dwDevID, dwParam1, (LPMCI_SET_PARMS)dwParam2); |
| 733 | case MCI_PLAY: return CDAUDIO_mciPlay(dwDevID, dwParam1, (LPMCI_PLAY_PARMS)dwParam2); |
| 734 | case MCI_STOP: return CDAUDIO_mciStop(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2); |
| 735 | case MCI_PAUSE: return CDAUDIO_mciPause(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2); |
| 736 | case MCI_RESUME: return CDAUDIO_mciResume(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2); |
| 737 | case MCI_SEEK: return CDAUDIO_mciSeek(dwDevID, dwParam1, (LPMCI_SEEK_PARMS)dwParam2); |
Eric Pouech | d492649 | 1999-02-02 15:25:16 +0000 | [diff] [blame] | 738 | /* FIXME: I wonder if those two next items are really called ? */ |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 739 | case MCI_SET_DOOR_OPEN: return CDAUDIO_mciSetDoor(dwDevID, TRUE); |
| 740 | case MCI_SET_DOOR_CLOSED: return CDAUDIO_mciSetDoor(dwDevID, FALSE); |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 741 | /* commands that should be supported */ |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 742 | case MCI_LOAD: |
| 743 | case MCI_SAVE: |
| 744 | case MCI_FREEZE: |
| 745 | case MCI_PUT: |
| 746 | case MCI_REALIZE: |
| 747 | case MCI_UNFREEZE: |
| 748 | case MCI_UPDATE: |
| 749 | case MCI_WHERE: |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 750 | case MCI_STEP: |
| 751 | case MCI_SPIN: |
| 752 | case MCI_ESCAPE: |
| 753 | case MCI_COPY: |
| 754 | case MCI_CUT: |
| 755 | case MCI_DELETE: |
| 756 | case MCI_PASTE: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 757 | FIXME("Unsupported yet command=%s\n", MCI_MessageToString(wMsg)); |
| 758 | break; |
| 759 | /* commands that should report an error */ |
| 760 | case MCI_WINDOW: |
| 761 | FIXME("Unsupported command=%s\n", MCI_MessageToString(wMsg)); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 762 | break; |
| 763 | case MCI_OPEN: |
| 764 | case MCI_CLOSE: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 765 | ERR("Shouldn't receive a MCI_OPEN or CLOSE message\n"); |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 766 | break; |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 767 | default: |
Eric Pouech | b26cfe7 | 1999-07-24 10:45:24 +0000 | [diff] [blame] | 768 | TRACE("Sending msg=%s to default driver proc\n", MCI_MessageToString(wMsg)); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 769 | return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); |
Eric Pouech | 9f65a71 | 1998-10-11 14:14:24 +0000 | [diff] [blame] | 770 | } |
Eric Pouech | dd49344 | 1998-11-24 14:12:13 +0000 | [diff] [blame] | 771 | return MCIERR_UNRECOGNIZED_COMMAND; |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 772 | } |
| 773 | |
Alexandre Julliard | 6b81b39 | 1994-07-07 16:23:58 +0000 | [diff] [blame] | 774 | /*-----------------------------------------------------------------------*/ |