Jörg Höhle : mcicda: Fix several return codes.

Alexandre Julliard julliard at winehq.org
Tue Aug 17 11:31:15 CDT 2010


Module: wine
Branch: master
Commit: 4bb42e2886ebd7ae9840c4be64f2d5f5e5d89a10
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4bb42e2886ebd7ae9840c4be64f2d5f5e5d89a10

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Sat Jul 31 00:05:46 2010 +0200

mcicda: Fix several return codes.

---

 dlls/mcicda/mcicda.c |   57 +++++++++++++++++++++++++++++---------------------
 1 files changed, 33 insertions(+), 24 deletions(-)

diff --git a/dlls/mcicda/mcicda.c b/dlls/mcicda/mcicda.c
index 5e91bee..6c7d8fb 100644
--- a/dlls/mcicda/mcicda.c
+++ b/dlls/mcicda/mcicda.c
@@ -147,7 +147,6 @@ static DWORD CALLBACK MCICDA_playLoop(void *ptr)
      * signaled by the next command that has MCI_NOTIFY set (or
      * MCI_NOTIFY_ABORTED for MCI_PLAY). */
 
-    ExitThread(0);
     return 0;
 }
 
@@ -279,6 +278,7 @@ static	int	MCICDA_GetError(WINE_MCICDAUDIO* wmcda)
     switch (GetLastError())
     {
     case ERROR_NOT_READY:     return MCIERR_DEVICE_NOT_READY;
+    case ERROR_NOT_SUPPORTED:
     case ERROR_IO_DEVICE:     return MCIERR_HARDWARE;
     default:
 	FIXME("Unknown mode %u\n", GetLastError());
@@ -564,12 +564,12 @@ static DWORD MCICDA_GetDevCaps(UINT wDevID, DWORD dwFlags,
 	    ret = MCI_RESOURCE_RETURNED;
 	    break;
 	default:
-            ERR("Unsupported %x devCaps item\n", lpParms->dwItem);
-	    return MCIERR_UNRECOGNIZED_COMMAND;
+            WARN("Unsupported %x devCaps item\n", lpParms->dwItem);
+	    return MCIERR_UNSUPPORTED_FUNCTION;
 	}
     } else {
 	TRACE("No GetDevCaps-Item !\n");
-	return MCIERR_UNRECOGNIZED_COMMAND;
+	return MCIERR_MISSING_PARAMETER;
     }
     TRACE("lpParms->dwReturn=%08X;\n", lpParms->dwReturn);
     if (dwFlags & MCI_NOTIFY) {
@@ -647,7 +647,7 @@ static DWORD MCICDA_Info(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms)
 	str = buffer;
     } else {
 	WARN("Don't know this info command (%u)\n", dwFlags);
-	ret = MCIERR_UNRECOGNIZED_COMMAND;
+	ret = MCIERR_MISSING_PARAMETER;
     }
     if (str) {
 	if (lpParms->dwRetSize <= strlenW(str)) {
@@ -692,6 +692,7 @@ static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParm
                                  &data, sizeof(data), &br, NULL))
             {
 		return MCICDA_GetError(wmcda);
+		/* alt. data.CurrentPosition.TrackNumber = 1; -- what native yields */
 	    }
 	    lpParms->dwReturn = data.CurrentPosition.TrackNumber;
             TRACE("CURRENT_TRACK=%lu\n", lpParms->dwReturn);
@@ -750,7 +751,8 @@ static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParm
 		return MCICDA_GetError(wmcda);
 	    break;
 	case MCI_STATUS_POSITION:
-	    if (dwFlags & MCI_STATUS_START) {
+            switch (dwFlags & (MCI_STATUS_START | MCI_TRACK)) {
+            case MCI_STATUS_START:
                 if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL, 0,
                                      &toc, sizeof(toc), &br, NULL)) {
                     WARN("error reading TOC !\n");
@@ -758,7 +760,8 @@ static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParm
                 }
 		lpParms->dwReturn = FRAME_OF_TOC(toc, toc.FirstTrack);
 		TRACE("get MCI_STATUS_START !\n");
-	    } else if (dwFlags & MCI_TRACK) {
+                break;
+            case MCI_TRACK:
                 if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL, 0,
                                      &toc, sizeof(toc), &br, NULL)) {
                     WARN("error reading TOC !\n");
@@ -768,13 +771,17 @@ static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParm
 		    return MCIERR_OUTOFRANGE;
 		lpParms->dwReturn = FRAME_OF_TOC(toc, lpParms->dwTrack);
 		TRACE("get MCI_TRACK #%u !\n", lpParms->dwTrack);
-            } else {
+                break;
+            case 0:
                 fmt.Format = IOCTL_CDROM_CURRENT_POSITION;
                 if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_Q_CHANNEL, &fmt, sizeof(fmt),
                                      &data, sizeof(data), &br, NULL)) {
                     return MCICDA_GetError(wmcda);
                 }
                 lpParms->dwReturn = FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress);
+                break;
+            default:
+                return MCIERR_FLAGS_NOT_COMPATIBLE;
             }
 	    lpParms->dwReturn = MCICDA_CalcTime(wmcda, wmcda->dwTimeFormat, lpParms->dwReturn, &ret);
             TRACE("MCI_STATUS_POSITION=%08lX\n", lpParms->dwReturn);
@@ -814,16 +821,15 @@ static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParm
 		else
 		    lpParms->dwReturn = (toc.TrackData[lpParms->dwTrack - toc.FirstTrack].Control & 0x04) ?
                                          MCI_CDA_TRACK_OTHER : MCI_CDA_TRACK_AUDIO;
+		    /* FIXME: MAKEMCIRESOURCE "audio" | "other", localised */
 	    }
             TRACE("MCI_CDA_STATUS_TYPE_TRACK[%d]=%ld\n", lpParms->dwTrack, lpParms->dwReturn);
 	    break;
 	default:
             FIXME("unknown command %08X !\n", lpParms->dwItem);
-	    return MCIERR_UNRECOGNIZED_COMMAND;
+	    return MCIERR_UNSUPPORTED_FUNCTION;
 	}
-    } else {
-	WARN("not MCI_STATUS_ITEM !\n");
-    }
+    } else return MCIERR_MISSING_PARAMETER;
     if ((dwFlags & MCI_NOTIFY) && HRESULT_CODE(ret)==0)
 	MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL);
     return ret;
@@ -908,10 +914,13 @@ static DWORD MCICDA_Play(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
     }
     if (dwFlags & MCI_TO) {
 	end = MCICDA_CalcFrame(wmcda, lpParms->dwTo);
+	if ( (ret=MCICDA_SkipDataTracks(wmcda, &end)) )
+	  return ret;
 	TRACE("MCI_TO=%08X -> %u\n", lpParms->dwTo, end);
     } else {
 	end = FRAME_OF_TOC(toc, toc.LastTrack + 1) - 1;
     }
+    if (end < start) return MCIERR_OUTOFRANGE;
     TRACE("Playing from %u to %u\n", start, end);
 
     oldcb = InterlockedExchangePointer(&wmcda->hCallback,
@@ -1141,7 +1150,7 @@ static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
     DWORD		        at;
     WINE_MCICDAUDIO*	        wmcda = MCICDA_GetOpenDrv(wDevID);
     CDROM_SEEK_AUDIO_MSF        seek;
-    DWORD                       br, ret;
+    DWORD                       br, position, ret;
     CDROM_TOC			toc;
 
     TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms);
@@ -1149,12 +1158,16 @@ static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
     if (wmcda == NULL)	return MCIERR_INVALID_DEVICE_ID;
     if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
 
+    position = dwFlags & (MCI_SEEK_TO_START|MCI_SEEK_TO_END|MCI_TO);
+    if (!position)		return MCIERR_MISSING_PARAMETER;
+    if (position&(position-1))	return MCIERR_FLAGS_NOT_COMPATIBLE;
+
     if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL, 0,
                          &toc, sizeof(toc), &br, NULL)) {
         WARN("error reading TOC !\n");
         return MCICDA_GetError(wmcda);
     }
-    switch (dwFlags & ~(MCI_NOTIFY|MCI_WAIT)) {
+    switch (position) {
     case MCI_SEEK_TO_START:
 	TRACE("Seeking to start\n");
 	at = FRAME_OF_TOC(toc,toc.FirstTrack);
@@ -1174,9 +1187,7 @@ static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
 	  return ret;
 	break;
     default:
-	TRACE("Unknown seek action %08lX\n",
-	      (dwFlags & ~(MCI_NOTIFY|MCI_WAIT)));
-	return MCIERR_UNSUPPORTED_FUNCTION;
+	return MCIERR_FLAGS_NOT_COMPATIBLE;
     }
 
     if (wmcda->hThread != 0) {
@@ -1241,7 +1252,6 @@ static DWORD MCICDA_Set(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
     if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
     /*
       TRACE("dwTimeFormat=%08lX\n", lpParms->dwTimeFormat);
-      TRACE("dwAudio=%08lX\n", lpParms->dwAudio);
     */
     if (dwFlags & MCI_SET_TIME_FORMAT) {
 	switch (lpParms->dwTimeFormat) {
@@ -1255,14 +1265,12 @@ static DWORD MCICDA_Set(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
 	    TRACE("MCI_FORMAT_TMSF !\n");
 	    break;
 	default:
-	    WARN("bad time format !\n");
 	    return MCIERR_BAD_TIME_FORMAT;
 	}
 	wmcda->dwTimeFormat = lpParms->dwTimeFormat;
     }
-    if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION;
-    if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION;
-    if (dwFlags & MCI_SET_OFF) return MCIERR_UNSUPPORTED_FUNCTION;
+    if (dwFlags & MCI_SET_AUDIO) /* one xp machine ignored it */
+	TRACE("SET_AUDIO %X %x\n", dwFlags, lpParms->dwAudio);
 
     if (dwFlags & MCI_NOTIFY)
 	MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL);
@@ -1304,10 +1312,11 @@ LRESULT CALLBACK MCICDA_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
     case MCI_SEEK:		return MCICDA_Seek(dwDevID, dwParam1, (LPMCI_SEEK_PARMS)dwParam2);
     /* commands that should report an error as they are not supported in
      * the native version */
-    case MCI_SET_DOOR_CLOSED:
-    case MCI_SET_DOOR_OPEN:
+    case MCI_RECORD:
     case MCI_LOAD:
     case MCI_SAVE:
+	return MCIERR_UNSUPPORTED_FUNCTION;
+    case MCI_BREAK:
     case MCI_FREEZE:
     case MCI_PUT:
     case MCI_REALIZE:




More information about the wine-cvs mailing list