* signaled by the next command that has MCI_NOTIFY set (or
* MCI_NOTIFY_ABORTED for MCI_PLAY). */
- ExitThread(0);
return 0;
}
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());
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) {
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)) {
&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);
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");
}
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");
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);
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;
}
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,
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);
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);
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) {
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) {
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);
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: