Removed incorrect patch for MCI_OPEN anc MCI_CLOSE parameters (thanks to Robert Riggs
for pointing out the bug, see the fix in mcistring.c)
Fixed MCI seeking on CD audio.
diff --git a/multimedia/mcicda.c b/multimedia/mcicda.c
index c9c1e52..ead46ab 100644
--- a/multimedia/mcicda.c
+++ b/multimedia/mcicda.c
@@ -108,7 +108,7 @@
#else
if (ioctl(wcda->unixdev, CDIOREADTOCHEADER, &hdr)) {
#endif
- WARN(cdaudio, "(%p) -- Error occured !\n", wcda);
+ WARN(cdaudio, "(%p) -- Error occured (%d)!\n", wcda, errno);
return (WORD)-1;
}
#ifdef linux
@@ -123,7 +123,6 @@
#endif
}
-
/**************************************************************************
* CDAUDIO_GetTracksInfo [internal]
*/
@@ -155,8 +154,7 @@
free(wcda->lpbTrackFlags);
wcda->lpbTrackFlags = (LPBYTE)malloc((wcda->nTracks + 1) * sizeof(BYTE));
if (wcda->lpdwTrackLen == NULL || wcda->lpdwTrackPos == NULL ||
- wcda->lpbTrackFlags == NULL)
- {
+ wcda->lpbTrackFlags == NULL) {
WARN(cdaudio, "error allocating track table !\n");
return FALSE;
}
@@ -190,7 +188,7 @@
#else
if (ioctl(wcda->unixdev, CDIOREADTOCENTRYS, &entry)) {
#endif
- WARN(cdaudio, "error read entry\n");
+ WARN(cdaudio, "error read entry (%d)\n", errno);
return FALSE;
}
#ifdef linux
@@ -215,10 +213,11 @@
wcda->lpdwTrackPos[i - 1] = start;
TRACE(cdaudio, "track #%u start=%u len=%u\n", i, start, length);
}
- wcda->lpbTrackFlags[i] =
#ifdef linux
+ wcda->lpbTrackFlags[i] =
(entry.cdte_adr << 4) | (entry.cdte_ctrl & 0x0f);
-#else
+#elif
+ wcda->lpbTrackFlags[i] =
(toc_buffer.addr_type << 4) | (toc_buffer.control & 0x0f);
#endif
TRACE(cdaudio, "track #%u flags=%02x\n", i + 1, wcda->lpbTrackFlags[i]);
@@ -232,202 +231,7 @@
}
/**************************************************************************
- * CDAUDIO_mciOpen [internal]
- */
-static DWORD CDAUDIO_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS32A lpOpenParms)
-{
-#if defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)
- DWORD dwDeviceID;
- WINE_CDAUDIO* wcda;
-
- TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpOpenParms);
-
- if (lpOpenParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
- if (wDevID > MAX_CDAUDIODRV) return MCIERR_INVALID_DEVICE_ID;
-
- dwDeviceID = lpOpenParms->wDeviceID;
-
- wcda = &CDADev[wDevID];
-
- if (wcda->nUseCount > 0) {
- /* The driver already open on this channel */
- /* If the driver was opened shareable before and this open specifies */
- /* shareable then increment the use count */
- if (wcda->fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
- ++wcda->nUseCount;
- else
- return MCIERR_MUST_USE_SHAREABLE;
- } else {
- wcda->nUseCount = 1;
- wcda->fShareable = dwFlags & MCI_OPEN_SHAREABLE;
- }
- if (dwFlags & MCI_OPEN_ELEMENT) {
- TRACE(cdaudio,"MCI_OPEN_ELEMENT !\n");
- /* return MCIERR_NO_ELEMENT_ALLOWED; */
- }
-
- wcda->openParms.dwCallback = lpOpenParms->dwCallback;
- wcda->openParms.wDeviceID = (WORD)lpOpenParms->wDeviceID;
- wcda->openParms.wReserved0 = 0; /*????*/
- wcda->openParms.lpstrDeviceType = lpOpenParms->lpstrDeviceType;
- wcda->openParms.lpstrElementName = lpOpenParms->lpstrElementName;
- wcda->openParms.lpstrAlias = lpOpenParms->lpstrAlias;
-
- wcda->wNotifyDeviceID = dwDeviceID;
- wcda->unixdev = open (CDAUDIO_DEV, O_RDONLY, 0);
- if (wcda->unixdev == -1) {
- WARN(cdaudio,"can't open '%s'!. errno=%d\n", CDAUDIO_DEV, errno );
- perror( "can't open\n" );
- return MCIERR_HARDWARE;
- }
- wcda->cdMode = 0;
- wcda->mciMode = MCI_MODE_STOP;
- wcda->dwTimeFormat = MCI_FORMAT_TMSF;
- wcda->nCurTrack = 0;
- wcda->nTracks = 0;
- wcda->dwTotalLen = 0;
- wcda->dwFirstOffset = 0;
- wcda->lpdwTrackLen = NULL;
- wcda->lpdwTrackPos = NULL;
- wcda->lpbTrackFlags = NULL;
- if (!CDAUDIO_GetTracksInfo(&CDADev[wDevID])) {
- WARN(cdaudio,"error reading TracksInfo !\n");
- /* return MCIERR_INTERNAL; */
- }
-
- /*
- Moved to mmsystem.c mciOpen routine
-
- if (dwFlags & MCI_NOTIFY) {
- TRACE(cdaudio, "MCI_NOTIFY_SUCCESSFUL %08lX !\n",
- lpParms->dwCallback);
- mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
- wcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
- }
- */
- return 0;
-#else
- return MCIERR_HARDWARE;
-#endif
-}
-
-/**************************************************************************
- * CDAUDIO_mciClose [internal]
- */
-static DWORD CDAUDIO_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
-{
-#if defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)
- WINE_CDAUDIO* wcda = CDAUDIO_mciGetOpenDrv(wDevID);
-
- TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwParam, lpParms);
-
- if (wcda == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- if (--wcda->nUseCount == 0) {
- if (wcda->lpdwTrackLen != NULL) free(wcda->lpdwTrackLen);
- if (wcda->lpdwTrackPos != NULL) free(wcda->lpdwTrackPos);
- if (wcda->lpbTrackFlags != NULL) free(wcda->lpbTrackFlags);
- close(wcda->unixdev);
- }
-#endif
- return 0;
-}
-
-/**************************************************************************
- * CDAUDIO_mciGetDevCaps [internal]
- */
-static DWORD CDAUDIO_mciGetDevCaps(UINT16 wDevID, DWORD dwFlags,
- LPMCI_GETDEVCAPS_PARMS lpParms)
-{
-#if defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)
- TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- if (dwFlags & MCI_GETDEVCAPS_ITEM) {
- TRACE(cdaudio, "MCI_GETDEVCAPS_ITEM dwItem=%08lX;\n", lpParms->dwItem);
-
- switch(lpParms->dwItem) {
- case MCI_GETDEVCAPS_CAN_RECORD:
- lpParms->dwReturn = FALSE;
- break;
- case MCI_GETDEVCAPS_HAS_AUDIO:
- lpParms->dwReturn = TRUE;
- break;
- case MCI_GETDEVCAPS_HAS_VIDEO:
- lpParms->dwReturn = FALSE;
- break;
- case MCI_GETDEVCAPS_DEVICE_TYPE:
- lpParms->dwReturn = MCI_DEVTYPE_CD_AUDIO;
- break;
- case MCI_GETDEVCAPS_USES_FILES:
- lpParms->dwReturn = FALSE;
- break;
- case MCI_GETDEVCAPS_COMPOUND_DEVICE:
- lpParms->dwReturn = FALSE;
- break;
- case MCI_GETDEVCAPS_CAN_EJECT:
- lpParms->dwReturn = TRUE;
- break;
- case MCI_GETDEVCAPS_CAN_PLAY:
- lpParms->dwReturn = TRUE;
- break;
- case MCI_GETDEVCAPS_CAN_SAVE:
- lpParms->dwReturn = FALSE;
- break;
- default:
- return MCIERR_UNRECOGNIZED_COMMAND;
- }
- }
- TRACE(cdaudio, "lpParms->dwReturn=%08lX;\n", lpParms->dwReturn);
- return 0;
-#else
- return MCIERR_INTERNAL;
-#endif
-}
-
-/**************************************************************************
- * CDAUDIO_mciInfo [internal]
- */
-static DWORD CDAUDIO_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS16 lpParms)
-{
-#if defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)
- DWORD ret = 0;
- LPSTR str = 0;
- WINE_CDAUDIO* wcda = CDAUDIO_mciGetOpenDrv(wDevID);
-
- TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
-
- if (lpParms == NULL || lpParms->lpstrReturn == NULL) {
- ret = MCIERR_NULL_PARAMETER_BLOCK;
- } else if (wcda == NULL) {
- ret = MCIERR_INVALID_DEVICE_ID;
- } else {
- TRACE(cdaudio, "buf=%p, len=%lu\n", lpParms->lpstrReturn, lpParms->dwRetSize);
-
- switch(dwFlags) {
- case MCI_INFO_PRODUCT:
- str = "Wine's audio CDROM";
- break;
- default:
- WARN(cdaudio, "Don't know this info command (%lu)\n", dwFlags);
- ret = MCIERR_UNRECOGNIZED_COMMAND;
- }
- }
- if (str) {
- ret = MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize, str);
- } else {
- lpParms->lpstrReturn[0] = 0;
- }
-
- return ret;
-#else
- return MCIERR_INTERNAL;
-#endif
-}
-
-
-/**************************************************************************
+>>>>>>> 1.9
* CDAUDIO_CalcFrame [internal]
*/
static DWORD CDAUDIO_CalcFrame(WINE_CDAUDIO* wcda, DWORD dwTime)
@@ -469,7 +273,6 @@
return dwFrame;
}
-
/**************************************************************************
* CDAUDIO_GetCDStatus [internal]
*/
@@ -493,7 +296,7 @@
#else
if (ioctl(wcda->unixdev, CDIOCREADSUBCHANNEL, &read_sc)) {
#endif
- TRACE(cdaudio,"opened or no_media !\n");
+ TRACE(cdaudio,"opened or no_media (%d)!\n", errno);
wcda->cdMode = MCI_MODE_OPEN; /* was NOT_READY */
return TRUE;
}
@@ -575,7 +378,7 @@
if (oldmode != wcda->cdMode && oldmode == MCI_MODE_OPEN) {
if (!CDAUDIO_GetTracksInfo(wcda)) {
WARN(cdaudio, "error updating TracksInfo !\n");
- return MCIERR_INTERNAL;
+ return FALSE;
}
}
return TRUE;
@@ -584,7 +387,6 @@
#endif
}
-
/**************************************************************************
* CDAUDIO_CalcTime [internal]
*/
@@ -631,6 +433,199 @@
return dwTime;
}
+static DWORD CDAUDIO_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms);
+static DWORD CDAUDIO_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms);
+
+/**************************************************************************
+ * CDAUDIO_mciOpen [internal]
+ */
+static DWORD CDAUDIO_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS32A lpOpenParms)
+{
+#if defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)
+ DWORD dwDeviceID;
+ WINE_CDAUDIO* wcda;
+ MCI_SEEK_PARMS seekParms;
+
+ TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpOpenParms);
+
+ if (lpOpenParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
+ if (wDevID > MAX_CDAUDIODRV) return MCIERR_INVALID_DEVICE_ID;
+
+ dwDeviceID = lpOpenParms->wDeviceID;
+
+ wcda = &CDADev[wDevID];
+
+ if (wcda->nUseCount > 0) {
+ /* The driver already open on this channel */
+ /* If the driver was opened shareable before and this open specifies */
+ /* shareable then increment the use count */
+ if (wcda->fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
+ ++wcda->nUseCount;
+ else
+ return MCIERR_MUST_USE_SHAREABLE;
+ } else {
+ wcda->nUseCount = 1;
+ wcda->fShareable = dwFlags & MCI_OPEN_SHAREABLE;
+ }
+ if (dwFlags & MCI_OPEN_ELEMENT) {
+ TRACE(cdaudio,"MCI_OPEN_ELEMENT !\n");
+ /* return MCIERR_NO_ELEMENT_ALLOWED; */
+ }
+
+ wcda->openParms.dwCallback = lpOpenParms->dwCallback;
+ wcda->openParms.wDeviceID = (WORD)lpOpenParms->wDeviceID;
+ wcda->openParms.wReserved0 = 0; /*????*/
+ wcda->openParms.lpstrDeviceType = lpOpenParms->lpstrDeviceType;
+ wcda->openParms.lpstrElementName = lpOpenParms->lpstrElementName;
+ wcda->openParms.lpstrAlias = lpOpenParms->lpstrAlias;
+
+ wcda->wNotifyDeviceID = dwDeviceID;
+ wcda->unixdev = open (CDAUDIO_DEV, O_RDONLY, 0);
+ if (wcda->unixdev == -1) {
+ WARN(cdaudio,"can't open '%s'!. errno=%d\n", CDAUDIO_DEV, errno);
+ perror( "can't open\n");
+ return MCIERR_HARDWARE;
+ }
+ wcda->cdMode = 0;
+ wcda->mciMode = MCI_MODE_STOP;
+ wcda->dwTimeFormat = MCI_FORMAT_TMSF;
+ wcda->nCurTrack = 0;
+ wcda->nTracks = 0;
+ wcda->dwTotalLen = 0;
+ wcda->dwFirstOffset = 0;
+ wcda->lpdwTrackLen = NULL;
+ wcda->lpdwTrackPos = NULL;
+ wcda->lpbTrackFlags = NULL;
+ if (!CDAUDIO_GetTracksInfo(&CDADev[wDevID])) {
+ WARN(cdaudio,"error reading TracksInfo !\n");
+ /* return MCIERR_INTERNAL; */
+ }
+
+ CDAUDIO_mciSeek(wDevID, MCI_SEEK_TO_START, &seekParms);
+
+ return 0;
+#else
+ return MCIERR_HARDWARE;
+#endif
+}
+
+/**************************************************************************
+ * CDAUDIO_mciClose [internal]
+ */
+static DWORD CDAUDIO_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
+{
+#if defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)
+ WINE_CDAUDIO* wcda = CDAUDIO_mciGetOpenDrv(wDevID);
+
+ TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwParam, lpParms);
+
+ if (wcda == NULL) return MCIERR_INVALID_DEVICE_ID;
+
+ if (wcda->nUseCount == 1) {
+ CDAUDIO_mciStop(wDevID, 0, NULL);
+
+ if (wcda->lpdwTrackLen != NULL) free(wcda->lpdwTrackLen);
+ if (wcda->lpdwTrackPos != NULL) free(wcda->lpdwTrackPos);
+ if (wcda->lpbTrackFlags != NULL) free(wcda->lpbTrackFlags);
+ close(wcda->unixdev);
+ }
+ wcda->nUseCount--;
+#endif
+ return 0;
+}
+
+/**************************************************************************
+ * CDAUDIO_mciGetDevCaps [internal]
+ */
+static DWORD CDAUDIO_mciGetDevCaps(UINT16 wDevID, DWORD dwFlags,
+ LPMCI_GETDEVCAPS_PARMS lpParms)
+{
+#if defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)
+ TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
+
+ if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
+
+ if (dwFlags & MCI_GETDEVCAPS_ITEM) {
+ TRACE(cdaudio, "MCI_GETDEVCAPS_ITEM dwItem=%08lX;\n", lpParms->dwItem);
+
+ switch(lpParms->dwItem) {
+ case MCI_GETDEVCAPS_CAN_RECORD:
+ lpParms->dwReturn = FALSE;
+ break;
+ case MCI_GETDEVCAPS_HAS_AUDIO:
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_GETDEVCAPS_HAS_VIDEO:
+ lpParms->dwReturn = FALSE;
+ break;
+ case MCI_GETDEVCAPS_DEVICE_TYPE:
+ lpParms->dwReturn = MCI_DEVTYPE_CD_AUDIO;
+ break;
+ case MCI_GETDEVCAPS_USES_FILES:
+ lpParms->dwReturn = FALSE;
+ break;
+ case MCI_GETDEVCAPS_COMPOUND_DEVICE:
+ lpParms->dwReturn = FALSE;
+ break;
+ case MCI_GETDEVCAPS_CAN_EJECT:
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_GETDEVCAPS_CAN_PLAY:
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_GETDEVCAPS_CAN_SAVE:
+ lpParms->dwReturn = FALSE;
+ break;
+ default:
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ }
+ }
+ TRACE(cdaudio, "lpParms->dwReturn=%08lX;\n", lpParms->dwReturn);
+ return 0;
+#else
+ return MCIERR_HARDWARE;
+#endif
+}
+
+/**************************************************************************
+ * CDAUDIO_mciInfo [internal]
+ */
+static DWORD CDAUDIO_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS16 lpParms)
+{
+#if defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)
+ DWORD ret = 0;
+ LPSTR str = 0;
+ WINE_CDAUDIO* wcda = CDAUDIO_mciGetOpenDrv(wDevID);
+
+ TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
+
+ if (lpParms == NULL || lpParms->lpstrReturn == NULL) {
+ ret = MCIERR_NULL_PARAMETER_BLOCK;
+ } else if (wcda == NULL) {
+ ret = MCIERR_INVALID_DEVICE_ID;
+ } else {
+ TRACE(cdaudio, "buf=%p, len=%lu\n", lpParms->lpstrReturn, lpParms->dwRetSize);
+
+ switch(dwFlags) {
+ case MCI_INFO_PRODUCT:
+ str = "Wine's audio CD";
+ break;
+ default:
+ WARN(cdaudio, "Don't know this info command (%lu)\n", dwFlags);
+ ret = MCIERR_UNRECOGNIZED_COMMAND;
+ }
+ }
+ if (str) {
+ ret = MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize, str);
+ } else {
+ lpParms->lpstrReturn[0] = 0;
+ }
+
+ return ret;
+#else
+ return MCIERR_HARDWARE;
+#endif
+}
/**************************************************************************
* CDAUDIO_mciStatus [internal]
@@ -656,7 +651,7 @@
if (dwFlags & MCI_STATUS_ITEM) {
switch(lpParms->dwItem) {
case MCI_STATUS_CURRENT_TRACK:
- if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_INTERNAL;
+ if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_DRIVER_INTERNAL;
lpParms->dwReturn = wcda->nCurTrack;
TRACE(cdaudio,"CURRENT_TRACK=%lu!\n", lpParms->dwReturn);
return 0;
@@ -664,7 +659,7 @@
if (wcda->nTracks == 0) {
if (!CDAUDIO_GetTracksInfo(wcda)) {
WARN(cdaudio, "error reading TracksInfo !\n");
- return MCIERR_INTERNAL;
+ return MCIERR_DRIVER_INTERNAL;
}
}
if (dwFlags & MCI_TRACK) {
@@ -679,23 +674,23 @@
TRACE(cdaudio,"LENGTH=%lu !\n", lpParms->dwReturn);
return 0;
case MCI_STATUS_MODE:
- if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_INTERNAL;
+ if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_DRIVER_INTERNAL;
lpParms->dwReturn = wcda->cdMode;
if (!lpParms->dwReturn) lpParms->dwReturn = wcda->mciMode;
TRACE(cdaudio,"MCI_STATUS_MODE=%08lX !\n", lpParms->dwReturn);
return 0;
case MCI_STATUS_MEDIA_PRESENT:
- if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_INTERNAL;
+ if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_DRIVER_INTERNAL;
lpParms->dwReturn = (wcda->nTracks > 0) ? TRUE : FALSE;
TRACE(cdaudio,"MCI_STATUS_MEDIA_PRESENT =%s!\n", lpParms->dwReturn ? "Y" : "N");
return 0;
case MCI_STATUS_NUMBER_OF_TRACKS:
lpParms->dwReturn = CDAUDIO_GetNumberOfTracks(wcda);
TRACE(cdaudio,"MCI_STATUS_NUMBER_OF_TRACKS = %lu !\n", lpParms->dwReturn);
- if (lpParms->dwReturn == (WORD)-1) return MCIERR_INTERNAL;
+ if (lpParms->dwReturn == (WORD)-1) return MCIERR_DRIVER_INTERNAL;
return 0;
case MCI_STATUS_POSITION:
- if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_INTERNAL;
+ if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_DRIVER_INTERNAL;
lpParms->dwReturn = wcda->dwCurFrame;
if (dwFlags & MCI_STATUS_START) {
lpParms->dwReturn = wcda->dwFirstOffset;
@@ -735,11 +730,10 @@
WARN(cdaudio, "not MCI_STATUS_ITEM !\n");
return 0;
#else
- return MMSYSERR_NOTENABLED;
+ return MCIERR_HARDWARE;
#endif
}
-
/**************************************************************************
* CDAUDIO_mciPlay [internal]
*/
@@ -762,18 +756,19 @@
} else if (wcda == NULL) {
ret = MCIERR_INVALID_DEVICE_ID;
} else {
- start = 0;
end = wcda->dwTotalLen;
wcda->nCurTrack = 1;
if (dwFlags & MCI_FROM) {
start = CDAUDIO_CalcFrame(wcda, lpParms->dwFrom);
TRACE(cdaudio,"MCI_FROM=%08lX -> %u \n", lpParms->dwFrom, start);
+ } else {
+ if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_DRIVER_INTERNAL;
+ start = wcda->dwCurFrame;
}
if (dwFlags & MCI_TO) {
end = CDAUDIO_CalcFrame(wcda, lpParms->dwTo);
TRACE(cdaudio, "MCI_TO=%08lX -> %u \n", lpParms->dwTo, end);
}
- start += wcda->dwFirstOffset;
end += wcda->dwFirstOffset;
#ifdef linux
msf.cdmsf_min0 = start / CDFRAMES_PERMIN;
@@ -928,7 +923,8 @@
{
#if defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)
DWORD dwRet;
- MCI_PLAY_PARMS PlayParms;
+ MCI_PLAY_PARMS playParms;
+
WINE_CDAUDIO* wcda = CDAUDIO_mciGetOpenDrv(wDevID);
TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
@@ -936,29 +932,27 @@
if (wcda == NULL) return MCIERR_INVALID_DEVICE_ID;
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-#ifdef linux
- if (ioctl(wcda->unixdev, CDROMRESUME)) {
-#else
- if (ioctl(wcda->unixdev, CDIOCRESUME, NULL)) {
-#endif
- perror("ioctl CDROMRESUME");
- return MCIERR_HARDWARE;
- }
wcda->mciMode = MCI_MODE_SEEK;
- switch(dwFlags) {
+ switch (dwFlags & ~(MCI_NOTIFY|MCI_WAIT)) {
case MCI_SEEK_TO_START:
- PlayParms.dwFrom = 0;
+ TRACE(cdaudio, "Seeking to start\n");
+ playParms.dwFrom = 0;
break;
case MCI_SEEK_TO_END:
- PlayParms.dwFrom = wcda->dwTotalLen;
+ TRACE(cdaudio, "Seeking to end\n");
+ playParms.dwFrom = wcda->dwTotalLen;
break;
case MCI_TO:
- PlayParms.dwFrom = lpParms->dwTo;
+ TRACE(cdaudio, "Seeking to %lu\n", lpParms->dwTo);
+ playParms.dwFrom = lpParms->dwTo;
break;
+ default:
+ TRACE(cdaudio, "Seeking to ??=%lu\n", dwFlags);
+ return MCIERR_UNSUPPORTED_FUNCTION;
}
- dwRet = CDAUDIO_mciPlay(wDevID, MCI_WAIT | MCI_FROM, &PlayParms);
+ dwRet = CDAUDIO_mciPlay(wDevID, MCI_WAIT | MCI_FROM, &playParms);
if (dwRet != 0) return dwRet;
- dwRet = CDAUDIO_mciStop(wDevID, MCI_WAIT, (LPMCI_GENERIC_PARMS)&PlayParms);
+ dwRet = CDAUDIO_mciStop(wDevID, MCI_WAIT, (LPMCI_GENERIC_PARMS)&playParms);
if (dwFlags & MCI_NOTIFY) {
TRACE(cdaudio, "MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
mciDriverNotify16((HWND16)LOWORD(lpParms->dwCallback),
@@ -1041,7 +1035,7 @@
CDAUDIO_mciSetDoor(wDevID, TRUE);
}
if (dwFlags & MCI_SET_DOOR_CLOSED) {
- CDAUDIO_mciSetDoor(wDevID, TRUE);
+ CDAUDIO_mciSetDoor(wDevID, FALSE);
}
if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION;
if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION;
@@ -1077,9 +1071,7 @@
case DRV_INSTALL: return DRVCNF_RESTART;
case DRV_REMOVE: return DRVCNF_RESTART;
- case MCI_OPEN:
case MCI_OPEN_DRIVER: return CDAUDIO_mciOpen(dwDevID, dwParam1, (LPMCI_OPEN_PARMS32A)dwParam2);
- case MCI_CLOSE:
case MCI_CLOSE_DRIVER: return CDAUDIO_mciClose(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
case MCI_GETDEVCAPS: return CDAUDIO_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2);
case MCI_INFO: return CDAUDIO_mciInfo(dwDevID, dwParam1, (LPMCI_INFO_PARMS16)dwParam2);
@@ -1111,22 +1103,17 @@
case MCI_PASTE:
WARN(cdaudio, "Unsupported command=%s\n", MCI_CommandToString(wMsg));
break;
-/*
- * This is incorrect according to Microsoft...
- * http://support.microsoft.com/support/kb/articles/q137/5/79.asp
- *
case MCI_OPEN:
case MCI_CLOSE:
FIXME(cdaudio, "Shouldn't receive a MCI_OPEN or CLOSE message\n");
break;
- */
default:
TRACE(cdaudio, "Sending msg=%s to default driver proc\n", MCI_CommandToString(wMsg));
return DefDriverProc32(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
}
return MCIERR_UNRECOGNIZED_COMMAND;
#else
- return MCIERR_HARDWARE;
+ return MCIERR_UNRECOGNIZED_COMMAND;
#endif
}