/* -*- tab-width: 8; c-basic-offset: 4 -*- */
/*
 * Sample MCI CDAUDIO Wine Driver for Linux
 *
 * Copyright 1994 Martin Ayotte
 */

#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include "windows.h"
#include "user.h"
#include "driver.h"
#include "mmsystem.h"
#include "debug.h"
#include "multimedia.h"

#ifdef HAVE_LINUX_CDROM_H
# include <linux/cdrom.h>
#endif
#ifdef HAVE_LINUX_UCDROM_H
# include <linux/ucdrom.h>
#endif
#ifdef HAVE_MACHINE_SOUNDCARD_H
# include <machine/soundcard.h>
#endif
#ifdef HAVE_SYS_CDIO_H
# include <sys/cdio.h>
#endif

#ifdef __FreeBSD__
# define CDAUDIO_DEV "/dev/rcd0c"
#else
# define CDAUDIO_DEV "/dev/cdrom"
#endif

#ifdef SOUND_VERSION
# define IOCTL(a,b,c)		ioctl(a,b,&c)
#else
# define IOCTL(a,b,c)		(c = ioctl(a,b,c) )
#endif

#define MAX_CDAUDIODRV 		(1)
#define MAX_CDAUDIO_TRACKS 	256

#define CDFRAMES_PERSEC 	75
#define CDFRAMES_PERMIN 	4500
#define SECONDS_PERMIN	 	60

#if defined(linux) || defined(__FreeBSD__)
typedef struct {
    int     		nUseCount;          /* Incremented for each shared open */
    BOOL16  		fShareable;         /* TRUE if first open was shareable */
    WORD    		wNotifyDeviceID;    /* MCI device ID with a pending notification */
    HANDLE16 		hCallback;          /* Callback handle for pending notification */
    MCI_OPEN_PARMS16 	openParms;
    DWORD		dwTimeFormat;
    int			unixdev;
#ifdef linux
    struct cdrom_subchnl	sc;
#elif defined(__FreeBSD__)
    struct cd_sub_channel_info	sc;
#endif
    int			cdMode;
    int			mciMode;
    UINT16		nCurTrack;
    DWORD		dwCurFrame;
    UINT16		nTracks;
    DWORD		dwTotalLen;
    LPDWORD		lpdwTrackLen;
    LPDWORD		lpdwTrackPos;
    DWORD		dwFirstOffset;
} WINE_CDAUDIO;

static WINE_CDAUDIO	CDADev[MAX_CDAUDIODRV];
#endif

/*-----------------------------------------------------------------------*/

/**************************************************************************
 * 				CDAUDIO_mciGetOpenDrv		[internal]	
 */
static WINE_CDAUDIO*  CDAUDIO_mciGetOpenDrv(UINT16 wDevID)
{
    if (wDevID >= MAX_CDAUDIODRV || CDADev[wDevID].nUseCount == 0 || 
	CDADev[wDevID].unixdev == 0) {
	WARN(cdaudio, "Invalid wDevID=%u\n", wDevID);
	return 0;
    }
    return &CDADev[wDevID];
}

/**************************************************************************
 * 				CDAUDIO_GetNumberOfTracks		[internal]
 */
static UINT16 CDAUDIO_GetNumberOfTracks(WINE_CDAUDIO* wcda)
{
#if defined(linux) || defined(__FreeBSD__)
#ifdef linux
    struct cdrom_tochdr	hdr;
#elif defined(__FreeBSD__)
    struct ioc_toc_header	hdr;
#endif
    
    if (wcda->nTracks == 0) {
	if (ioctl(wcda->unixdev,
#ifdef linux
		  CDROMREADTOCHDR
#elif defined(__FreeBSD__)
		  CDIOREADTOCHEADER
#endif
		  , &hdr)) {
	    WARN(cdaudio, "(%p) -- Error occured !\n", wcda);
	    return (WORD)-1;
	}
#ifdef linux
	wcda->nTracks = hdr.cdth_trk1;
#elif defined(__FreeBSD__)
	wcda->nTracks = hdr.ending_track - hdr.starting_track + 1;
#endif
    }
    return wcda->nTracks;
#else
    return (WORD)-1;
#endif
}


/**************************************************************************
 * 				CDAUDIO_GetTracksInfo			[internal]
 */
static BOOL32 CDAUDIO_GetTracksInfo(WINE_CDAUDIO* wcda)
{
#if defined(linux) || defined(__FreeBSD__)
    int		i, length;
    int		start, last_start = 0;
    int		total_length = 0;
#ifdef linux
    struct cdrom_tocentry	entry;
#elif defined(__FreeBSD__)
    struct ioc_read_toc_entry	entry;
    struct cd_toc_entry             toc_buffer;
#endif
    
    if (wcda->nTracks == 0) {
	if (CDAUDIO_GetNumberOfTracks(wcda) == (WORD)-1) return FALSE;
    }
    TRACE(cdaudio,"nTracks=%u\n", wcda->nTracks);

    if (wcda->lpdwTrackLen != NULL) 
	free(wcda->lpdwTrackLen);
    wcda->lpdwTrackLen = (LPDWORD)malloc((wcda->nTracks + 1) * sizeof(DWORD));
    if (wcda->lpdwTrackPos != NULL) 
	free(wcda->lpdwTrackPos);
    wcda->lpdwTrackPos = (LPDWORD)malloc((wcda->nTracks + 1) * sizeof(DWORD));
    if (wcda->lpdwTrackLen == NULL || wcda->lpdwTrackPos == NULL) {
	WARN(cdaudio, "error allocating track table !\n");
	return FALSE;
    }
    memset(wcda->lpdwTrackLen, 0, (wcda->nTracks + 1) * sizeof(DWORD));
    memset(wcda->lpdwTrackPos, 0, (wcda->nTracks + 1) * sizeof(DWORD));
    for (i = 0; i <= wcda->nTracks; i++) {
	if (i == wcda->nTracks)
#ifdef linux
	    entry.cdte_track = CDROM_LEADOUT;
#elif defined(__FreeBSD__)
#define LEADOUT 0xaa
	entry.starting_track = LEADOUT; /* XXX */
#endif
	else
#ifdef linux
	    entry.cdte_track = i + 1;
#elif defined(__FreeBSD__)
	entry.starting_track = i + 1;
#endif
#ifdef linux
	entry.cdte_format = CDROM_MSF;
#elif defined(__FreeBSD__)
	bzero((char *)&toc_buffer, sizeof(toc_buffer));
	entry.address_format = CD_MSF_FORMAT;
	entry.data_len = sizeof(toc_buffer);
	entry.data = &toc_buffer;
#endif
	if (ioctl(wcda->unixdev, 
#ifdef linux
		  CDROMREADTOCENTRY
#elif defined(__FreeBSD__)
		  CDIOREADTOCENTRYS
#endif
		  , &entry)) {
	    WARN(cdaudio, "error read entry\n");
	    return FALSE;
	}
#ifdef linux
	start = CDFRAMES_PERSEC * (SECONDS_PERMIN * 
				   entry.cdte_addr.msf.minute + entry.cdte_addr.msf.second) + 
	    entry.cdte_addr.msf.frame;
#elif defined(__FreeBSD__)
	start = CDFRAMES_PERSEC * (SECONDS_PERMIN *
				   toc_buffer.addr.msf.minute + toc_buffer.addr.msf.second) +
	    toc_buffer.addr.msf.frame;
#endif
	if (i == 0) {
	    last_start = start;
	    wcda->dwFirstOffset = start;
	    TRACE(cdaudio, "dwFirstOffset=%u\n", start);
	} else {
	    length = start - last_start;
	    last_start = start;
	    start = last_start - length;
	    total_length += length;
	    wcda->lpdwTrackLen[i - 1] = length;
	    wcda->lpdwTrackPos[i - 1] = start;
	    TRACE(cdaudio, "track #%u start=%u len=%u\n", i, start, length);
	}
    }
    wcda->dwTotalLen = total_length;
    TRACE(cdaudio,"total_len=%u\n", total_length);
    return TRUE;
#else
    return FALSE;
#endif
}

/**************************************************************************
 * 				CDAUDIO_mciOpen			[internal]
 */
static DWORD CDAUDIO_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS32A lpOpenParms)
{
#if defined(linux) || defined(__FreeBSD__)
    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;
    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__)
    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);
	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__)
    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__)
    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
}


/**************************************************************************
 * 				CDAUDIO_CalcFrame			[internal]
 */
static DWORD CDAUDIO_CalcFrame(WINE_CDAUDIO* wcda, DWORD dwTime)
{
    DWORD	dwFrame = 0;
#if defined(linux) || defined(__FreeBSD__)
    UINT16	wTrack;
    
    TRACE(cdaudio,"(%p, %08lX, %lu);\n", wcda, wcda->dwTimeFormat, dwTime);
    
    switch (wcda->dwTimeFormat) {
    case MCI_FORMAT_MILLISECONDS:
	dwFrame = dwTime * CDFRAMES_PERSEC / 1000;
	TRACE(cdaudio, "MILLISECONDS %lu\n", dwFrame);
	break;
    case MCI_FORMAT_MSF:
	TRACE(cdaudio, "MSF %02u:%02u:%02u\n",
	      MCI_MSF_MINUTE(dwTime), MCI_MSF_SECOND(dwTime), MCI_MSF_FRAME(dwTime));
	dwFrame += CDFRAMES_PERMIN * MCI_MSF_MINUTE(dwTime);
	dwFrame += CDFRAMES_PERSEC * MCI_MSF_SECOND(dwTime);
	dwFrame += MCI_MSF_FRAME(dwTime);
	break;
    case MCI_FORMAT_TMSF:
    default:
	/* unknown format ! force TMSF ! ... */
	wTrack = MCI_TMSF_TRACK(dwTime);
	TRACE(cdaudio, "MSF %02u-%02u:%02u:%02u\n",
	      MCI_TMSF_TRACK(dwTime), MCI_TMSF_MINUTE(dwTime), 
	      MCI_TMSF_SECOND(dwTime), MCI_TMSF_FRAME(dwTime));
	TRACE(cdaudio, "TMSF trackpos[%u]=%lu\n",
	      wTrack, wcda->lpdwTrackPos[wTrack - 1]);
	dwFrame = wcda->lpdwTrackPos[wTrack - 1];
	dwFrame += CDFRAMES_PERMIN * MCI_TMSF_MINUTE(dwTime);
	dwFrame += CDFRAMES_PERSEC * MCI_TMSF_SECOND(dwTime);
	dwFrame += MCI_TMSF_FRAME(dwTime);
	break;
    }
#endif
    return dwFrame;
}


/**************************************************************************
 * 				CDAUDIO_GetCDStatus				[internal]
 */
static BOOL32 CDAUDIO_GetCDStatus(WINE_CDAUDIO*	wcda)
{
#if defined(linux) || defined(__FreeBSD__)
    int		oldmode = wcda->cdMode;
#ifdef __FreeBSD__
    struct ioc_read_subchannel	read_sc;
    
    read_sc.address_format = CD_MSF_FORMAT;
    read_sc.data_format    = CD_CURRENT_POSITION;
    read_sc.track          = 0;
    read_sc.data_len       = sizeof(wcda->sc);
    read_sc.data	   = (struct cd_sub_channel_info *)&wcda->sc;
#elif linux
    wcda->sc.cdsc_format = CDROM_MSF;
#endif
    if (ioctl(wcda->unixdev,
#ifdef linux
	      CDROMSUBCHNL, &wcda->sc
#elif defined(__FreeBSD__)
	      CDIOCREADSUBCHANNEL, &read_sc
#endif
	      )) {
	TRACE(cdaudio,"opened or no_media !\n");
	wcda->cdMode = MCI_MODE_OPEN; /* was NOT_READY */
	return TRUE;
    }
    switch (
#ifdef linux
	    wcda->sc.cdsc_audiostatus
#elif defined(__FreeBSD__)
	    wcda->sc.header.audio_status
#endif
	    ) {
#ifdef linux
    case CDROM_AUDIO_INVALID:
#elif defined(__FreeBSD__)
    case CD_AS_AUDIO_INVALID:
#endif
	WARN(cdaudio, "device doesn't support status, using MCI status.\n");
	wcda->cdMode = 0;
	break;
#ifdef linux
    case CDROM_AUDIO_NO_STATUS: 
#elif defined(__FreeBSD__)
    case CD_AS_NO_STATUS:
#endif
	wcda->cdMode = MCI_MODE_STOP;
	TRACE(cdaudio,"MCI_MODE_STOP !\n");
	break;
#ifdef linux
    case CDROM_AUDIO_PLAY: 
#elif defined(__FreeBSD__)
    case CD_AS_PLAY_IN_PROGRESS:
#endif
	wcda->cdMode = MCI_MODE_PLAY;
	TRACE(cdaudio,"MCI_MODE_PLAY !\n");
	break;
#ifdef linux
    case CDROM_AUDIO_PAUSED:
#elif defined(__FreeBSD__)
    case CD_AS_PLAY_PAUSED:
#endif
	wcda->cdMode = MCI_MODE_PAUSE;
	TRACE(cdaudio,"MCI_MODE_PAUSE !\n");
	break;
    default:
#ifdef linux
	TRACE(cdaudio,"status=%02X !\n",
	      wcda->sc.cdsc_audiostatus);
#elif defined(__FreeBSD__)
	TRACE(cdaudio,"status=%02X !\n",
	      wcda->sc.header.audio_status);
#endif
    }
#ifdef linux
    wcda->nCurTrack = wcda->sc.cdsc_trk;
    wcda->dwCurFrame = 
	CDFRAMES_PERMIN * wcda->sc.cdsc_absaddr.msf.minute +
	CDFRAMES_PERSEC * wcda->sc.cdsc_absaddr.msf.second +
	wcda->sc.cdsc_absaddr.msf.frame;
#elif defined(__FreeBSD__)
    wcda->nCurTrack = wcda->sc.what.position.track_number;
    wcda->dwCurFrame = 
	CDFRAMES_PERMIN * wcda->sc.what.position.absaddr.msf.minute +
	CDFRAMES_PERSEC * wcda->sc.what.position.absaddr.msf.second +
	wcda->sc.what.position.absaddr.msf.frame;
#endif
#ifdef linux
    TRACE(cdaudio,"%02u-%02u:%02u:%02u \n",
	  wcda->sc.cdsc_trk,
	  wcda->sc.cdsc_absaddr.msf.minute,
	  wcda->sc.cdsc_absaddr.msf.second,
	  wcda->sc.cdsc_absaddr.msf.frame);
#elif defined(__FreeBSD__)
    TRACE(cdaudio,"%02u-%02u:%02u:%02u \n",
	  wcda->sc.what.position.track_number,
	  wcda->sc.what.position.absaddr.msf.minute,
	  wcda->sc.what.position.absaddr.msf.second,
	  wcda->sc.what.position.absaddr.msf.frame);
#endif
    
    if (oldmode != wcda->cdMode && oldmode == MCI_MODE_OPEN) {
	if (!CDAUDIO_GetTracksInfo(wcda)) {
	    WARN(cdaudio, "error updating TracksInfo !\n");
	    return MCIERR_INTERNAL;
	}
    }
    return TRUE;
#else
    return FALSE;
#endif
}


/**************************************************************************
 * 				CDAUDIO_CalcTime			[internal]
 */
static DWORD CDAUDIO_CalcTime(WINE_CDAUDIO* wcda, DWORD dwFrame)
{
    DWORD	dwTime = 0;
#if defined(linux) || defined(__FreeBSD__)
    UINT16	wTrack;
    UINT16	wMinutes;
    UINT16	wSeconds;
    UINT16	wFrames;
    
    TRACE(cdaudio,"(%p, %08lX, %lu);\n", wcda, wcda->dwTimeFormat, dwFrame);
    
    switch (wcda->dwTimeFormat) {
    case MCI_FORMAT_MILLISECONDS:
	dwTime = dwFrame / CDFRAMES_PERSEC * 1000;
	TRACE(cdaudio, "MILLISECONDS %lu\n", dwTime);
	break;
    case MCI_FORMAT_MSF:
	wMinutes = dwFrame / CDFRAMES_PERMIN;
	wSeconds = (dwFrame - CDFRAMES_PERMIN * wMinutes) / CDFRAMES_PERSEC;
	wFrames = dwFrame - CDFRAMES_PERMIN * wMinutes - CDFRAMES_PERSEC * wSeconds;
	dwTime = MCI_MAKE_MSF(wMinutes, wSeconds, wFrames);
	TRACE(cdaudio,"MSF %02u:%02u:%02u -> dwTime=%lu\n",wMinutes, wSeconds, wFrames, dwTime);
	break;
    case MCI_FORMAT_TMSF:
    default:
	/* unknown format ! force TMSF ! ... */
	for (wTrack = 0; wTrack < wcda->nTracks; wTrack++) {
	    /*				dwTime += wcda->lpdwTrackLen[wTrack - 1];
					TRACE(cdaudio, "Adding trk#%u curpos=%u \n", dwTime);
					if (dwTime >= dwFrame) break; */
	    if (wcda->lpdwTrackPos[wTrack - 1] >= dwFrame) break;
	}
	wMinutes = dwFrame / CDFRAMES_PERMIN;
	wSeconds = (dwFrame - CDFRAMES_PERMIN * wMinutes) / CDFRAMES_PERSEC;
	wFrames = dwFrame - CDFRAMES_PERMIN * wMinutes - CDFRAMES_PERSEC * wSeconds;
	dwTime = MCI_MAKE_TMSF(wTrack, wMinutes, wSeconds, wFrames);
	TRACE(cdaudio, "%02u-%02u:%02u:%02u\n", wTrack, wMinutes, wSeconds, wFrames);
	break;
    }
#endif
    return dwTime;
}


/**************************************************************************
 * 				CDAUDIO_mciStatus		[internal]
 */
static DWORD CDAUDIO_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
    WINE_CDAUDIO*	wcda = CDAUDIO_mciGetOpenDrv(wDevID);
    DWORD	        ret = 0;

    TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);

    if (lpParms == NULL) {
	ret = MCIERR_NULL_PARAMETER_BLOCK;
    } else if (wcda == NULL) {
	ret = MCIERR_INVALID_DEVICE_ID;
    } else {
    if (dwFlags & MCI_NOTIFY) {
	    TRACE(cdaudio, "MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
	    mciDriverNotify16((HWND16)LOWORD(lpParms->dwCallback), 
			      wcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
    }
    if (dwFlags & MCI_STATUS_ITEM) {
	switch(lpParms->dwItem) {
	case MCI_STATUS_CURRENT_TRACK:
		if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_INTERNAL;
		lpParms->dwReturn = wcda->nCurTrack;
	    TRACE(cdaudio,"CURRENT_TRACK=%lu!\n", lpParms->dwReturn);
	    return 0;
	case MCI_STATUS_LENGTH:
		if (wcda->nTracks == 0) {
		    if (!CDAUDIO_GetTracksInfo(wcda)) {
		    WARN(cdaudio, "error reading TracksInfo !\n");
		    return MCIERR_INTERNAL;
		}
	    }
	    if (dwFlags & MCI_TRACK) {
		    TRACE(cdaudio,"MCI_TRACK #%lu LENGTH=??? !\n", lpParms->dwTrack);
		    if (lpParms->dwTrack > wcda->nTracks)
		    return MCIERR_OUTOFRANGE;
		    lpParms->dwReturn = wcda->lpdwTrackLen[lpParms->dwTrack];
		} else {
		    lpParms->dwReturn = wcda->dwTotalLen;
	    }
		lpParms->dwReturn = CDAUDIO_CalcTime(wcda, lpParms->dwReturn);
	    TRACE(cdaudio,"LENGTH=%lu !\n", lpParms->dwReturn);
	    return 0;
	case MCI_STATUS_MODE:
		if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_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;
		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;
	    return 0;
	case MCI_STATUS_POSITION:
		if (!CDAUDIO_GetCDStatus(wcda)) return MCIERR_INTERNAL;
		lpParms->dwReturn = wcda->dwCurFrame;
	    if (dwFlags & MCI_STATUS_START) {
		    lpParms->dwReturn = wcda->dwFirstOffset;
		TRACE(cdaudio,"get MCI_STATUS_START !\n");
	    }
	    if (dwFlags & MCI_TRACK) {
		    if (lpParms->dwTrack > wcda->nTracks)
		    return MCIERR_OUTOFRANGE;
		    lpParms->dwReturn = wcda->lpdwTrackPos[lpParms->dwTrack - 1];
		TRACE(cdaudio,"get MCI_TRACK #%lu !\n", lpParms->dwTrack);
	    }
		lpParms->dwReturn = CDAUDIO_CalcTime(wcda, lpParms->dwReturn);
		TRACE(cdaudio,"MCI_STATUS_POSITION=%08lX !\n", lpParms->dwReturn);
	    return 0;
	case MCI_STATUS_READY:
	    TRACE(cdaudio,"MCI_STATUS_READY !\n");
	    lpParms->dwReturn = TRUE;
	    return 0;
	case MCI_STATUS_TIME_FORMAT:
		lpParms->dwReturn = wcda->dwTimeFormat;
		TRACE(cdaudio,"MCI_STATUS_TIME_FORMAT =%08lx!\n", lpParms->dwReturn);
		return 0;
		/* FIXME: the constant used here are not defined in mmsystem.h */
		/* MCI_CDA_STATUS_TYPE_TRACK is very likely to be 0x00004001 */
	    case MCI_CDA_STATUS_TYPE_TRACK:
		if (!(dwFlags & MCI_TRACK)) return MCIERR_MISSING_PARAMETER;
		lpParms->dwReturn = 0xFFFFFFFF;	/* FIXME: MCI_CDA_TRACK_AUDIO ou MCI_CDA_TRACK_OTHER */
		TRACE(cdaudio, "MCI_CDA_STATUS_TYPE_TRACK[%ld]=%08lx\n", lpParms->dwTrack, lpParms->dwReturn);
	    return 0;
	default:
	    WARN(cdaudio, "unknown command %08lX !\n", lpParms->dwItem);
	    return MCIERR_UNRECOGNIZED_COMMAND;
	}
    }
    }
    WARN(cdaudio, "not MCI_STATUS_ITEM !\n");
    return 0;
#else
    return MMSYSERR_NOTENABLED;
#endif
}


/**************************************************************************
 * 				CDAUDIO_mciPlay			[internal]
 */
static DWORD CDAUDIO_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
    int 	start, end;
    WINE_CDAUDIO*	wcda = CDAUDIO_mciGetOpenDrv(wDevID);
    DWORD		ret = 0;
#ifdef linux
    struct 	cdrom_msf	msf;
#elif defined(__FreeBSD__)
    struct	ioc_play_msf	msf;
#endif
    
    TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
    
    if (lpParms == NULL) {
	ret = MCIERR_NULL_PARAMETER_BLOCK;
    } 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);
    }
    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;
    msf.cdmsf_sec0 = (start % CDFRAMES_PERMIN) / CDFRAMES_PERSEC;
    msf.cdmsf_frame0 = start % CDFRAMES_PERSEC;
    msf.cdmsf_min1 = end / CDFRAMES_PERMIN;
    msf.cdmsf_sec1 = (end % CDFRAMES_PERMIN) / CDFRAMES_PERSEC;
    msf.cdmsf_frame1 = end % CDFRAMES_PERSEC;
#elif defined(__FreeBSD__)
    msf.start_m     = start / CDFRAMES_PERMIN;
    msf.start_s     = (start % CDFRAMES_PERMIN) / CDFRAMES_PERSEC;
    msf.start_f     = start % CDFRAMES_PERSEC;
    msf.end_m       = end / CDFRAMES_PERMIN;
    msf.end_s       = (end % CDFRAMES_PERMIN) / CDFRAMES_PERSEC;
    msf.end_f       = end % CDFRAMES_PERSEC;
#endif
	if (ioctl(wcda->unixdev,
#ifdef linux
	      CDROMSTART
#elif defined(__FreeBSD__)
	      CDIOCSTART
#endif
	      )) {
	WARN(cdaudio, "motor doesn't start !\n");
	return MCIERR_HARDWARE;
    }
	if (ioctl(wcda->unixdev, 
#ifdef linux
	      CDROMPLAYMSF
#elif defined(__FreeBSD__)
	      CDIOCPLAYMSF
#endif
	      , &msf)) {
	WARN(cdaudio, "device doesn't play !\n");
	return MCIERR_HARDWARE;
    }
#ifdef linux
    TRACE(cdaudio,"msf = %d:%d:%d %d:%d:%d\n",
	  msf.cdmsf_min0, msf.cdmsf_sec0, msf.cdmsf_frame0,
	  msf.cdmsf_min1, msf.cdmsf_sec1, msf.cdmsf_frame1);
#elif defined(__FreeBSD__)
    TRACE(cdaudio,"msf = %d:%d:%d %d:%d:%d\n",
	  msf.start_m, msf.start_s, msf.start_f,
	  msf.end_m,   msf.end_s,   msf.end_f);
#endif
	wcda->mciMode = MCI_MODE_PLAY;
    if (dwFlags & MCI_NOTIFY) {
	    TRACE(cdaudio, "MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
	/*
	  mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
	      wcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
	*/
    }
    }
    return ret;

#else
    return MCIERR_HARDWARE;
#endif
}

/**************************************************************************
 * 				CDAUDIO_mciStop			[internal]
 */
static DWORD CDAUDIO_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
    WINE_CDAUDIO*	wcda = CDAUDIO_mciGetOpenDrv(wDevID);

    TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);

    if (wcda == NULL)	return MCIERR_INVALID_DEVICE_ID;
    
    if (ioctl(wcda->unixdev,
#ifdef linux
	      CDROMSTOP
#elif defined(__FreeBSD__)
	      CDIOCSTOP
#endif
	      )) return MCIERR_HARDWARE;
    wcda->mciMode = MCI_MODE_STOP;
    if (lpParms && (dwFlags & MCI_NOTIFY)) {
	TRACE(cdaudio, "MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
	mciDriverNotify16((HWND16)LOWORD(lpParms->dwCallback), 
			  wcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
    }
    return 0;
#else
    return MCIERR_HARDWARE;
#endif
}

/**************************************************************************
 * 				CDAUDIO_mciPause		[internal]
 */
static DWORD CDAUDIO_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
    WINE_CDAUDIO*	wcda = CDAUDIO_mciGetOpenDrv(wDevID);

    TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);

    if (wcda == NULL)	return MCIERR_INVALID_DEVICE_ID;

    if (ioctl(wcda->unixdev,
#ifdef linux
	      CDROMPAUSE
#elif defined(__FreeBSD__)
	      CDIOCPAUSE
#endif
	      )) return MCIERR_HARDWARE;
    wcda->mciMode = MCI_MODE_PAUSE;
    if (lpParms && (dwFlags & MCI_NOTIFY)) {
        TRACE(cdaudio, "MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
	mciDriverNotify16((HWND16)LOWORD(lpParms->dwCallback), 
			  wcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
    }
    return 0;
#else
    return MCIERR_HARDWARE;
#endif
}

/**************************************************************************
 * 				CDAUDIO_mciResume		[internal]
 */
static DWORD CDAUDIO_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
    WINE_CDAUDIO*	wcda = CDAUDIO_mciGetOpenDrv(wDevID);

    TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);

    if (wcda == NULL)	return MCIERR_INVALID_DEVICE_ID;
    
    if (ioctl(wcda->unixdev, 
#ifdef linux
	      CDROMRESUME
#elif defined(__FreeBSD__)
	      CDIOCRESUME
#endif
	      )) return MCIERR_HARDWARE;
    wcda->mciMode = MCI_MODE_STOP;
    if (lpParms && (dwFlags & MCI_NOTIFY)) {
	TRACE(cdaudio, "MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
	mciDriverNotify16((HWND16)LOWORD(lpParms->dwCallback), 
			  wcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
    }
    return 0;
#else
    return MCIERR_HARDWARE;
#endif
}

/**************************************************************************
 * 				CDAUDIO_mciSeek			[internal]
 */
static DWORD CDAUDIO_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
    DWORD	dwRet;
    MCI_PLAY_PARMS PlayParms;
    WINE_CDAUDIO*	wcda = CDAUDIO_mciGetOpenDrv(wDevID);

    TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);

    if (wcda == NULL)	return MCIERR_INVALID_DEVICE_ID;
    if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
    
    if (ioctl(wcda->unixdev,
#ifdef linux
	      CDROMRESUME
#elif defined(__FreeBSD__)
	      CDIOCRESUME
#endif
	      )) {
	perror("ioctl CDROMRESUME");
	return MCIERR_HARDWARE;
    }
    wcda->mciMode = MCI_MODE_SEEK;
    switch(dwFlags) {
    case MCI_SEEK_TO_START:
	PlayParms.dwFrom = 0;
	break;
    case MCI_SEEK_TO_END:
	PlayParms.dwFrom = wcda->dwTotalLen;
	break;
    case MCI_TO:
	PlayParms.dwFrom = lpParms->dwTo;
	break;
    }
    dwRet = CDAUDIO_mciPlay(wDevID, MCI_WAIT | MCI_FROM, &PlayParms);
    if (dwRet != 0) return dwRet;
    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), 
			  wcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
    }
    return dwRet;
#else
    return MCIERR_HARDWARE;
#endif
}

/**************************************************************************
 * 				CDAUDIO_mciSetDoor		[internal]
 */
static DWORD	CDAUDIO_mciSetDoor(UINT16 wDevID, int open)
{
    WINE_CDAUDIO*	wcda = CDAUDIO_mciGetOpenDrv(wDevID);

    TRACE(cdaudio, "(%04x, %s) !\n", wDevID, (open) ? "OPEN" : "CLOSE");

    if (wcda == NULL) return MCIERR_INVALID_DEVICE_ID;

#ifdef __FreeBSD__
    if (ioctl(wcda->unixdev, CDIOCALLOW)) return MCIERR_HARDWARE;
    if (open) {
	if (ioctl(wcda->unixdev, CDIOCEJECT)) return MCIERR_HARDWARE;
	wcda->mciMode = MCI_MODE_OPEN;
    } else {
	if (ioctl(wcda->unixdev, CDIOCCLOSE)) return MCIERR_HARDWARE;
	wcda->mciMode = MCI_MODE_STOP;
    }
    if (ioctl(wcda->unixdev, CDIOCPREVENT)) return MCIERR_HARDWARE;
#elif linux
    if (open) {
	if (ioctl(wcda->unixdev, CDROMEJECT)) return MCIERR_HARDWARE;
	wcda->mciMode = MCI_MODE_OPEN;
    } else {
	if (ioctl(wcda->unixdev, CDROMEJECT, 1)) return MCIERR_HARDWARE;
	wcda->mciMode = MCI_MODE_STOP;
    }
#endif
    wcda->nTracks = 0;
    return 0;
}

/**************************************************************************
 * 				CDAUDIO_mciSet			[internal]
 */
static DWORD CDAUDIO_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
    WINE_CDAUDIO*	wcda = CDAUDIO_mciGetOpenDrv(wDevID);
    
    TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
    
    if (wcda == NULL)	return MCIERR_INVALID_DEVICE_ID;
    if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;;
    /*
      TRACE(cdaudio,"dwTimeFormat=%08lX\n", lpParms->dwTimeFormat);
      TRACE(cdaudio,"dwAudio=%08lX\n", lpParms->dwAudio);
    */
    if (dwFlags & MCI_SET_TIME_FORMAT) {
	switch (lpParms->dwTimeFormat) {
	case MCI_FORMAT_MILLISECONDS:
	    TRACE(cdaudio, "MCI_FORMAT_MILLISECONDS !\n");
	    break;
	case MCI_FORMAT_MSF:
	    TRACE(cdaudio,"MCI_FORMAT_MSF !\n");
	    break;
	case MCI_FORMAT_TMSF:
	    TRACE(cdaudio,"MCI_FORMAT_TMSF !\n");
	    break;
	default:
	    WARN(cdaudio, "bad time format !\n");
	    return MCIERR_BAD_TIME_FORMAT;
	}
	wcda->dwTimeFormat = lpParms->dwTimeFormat;
    }
    if (dwFlags & MCI_SET_DOOR_OPEN) {
	CDAUDIO_mciSetDoor(wDevID, TRUE);
    }
    if (dwFlags & MCI_SET_DOOR_CLOSED) {
	CDAUDIO_mciSetDoor(wDevID, TRUE);
    }
    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_NOTIFY) {
	TRACE(cdaudio, "MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
	      lpParms->dwCallback);
	mciDriverNotify16((HWND16)LOWORD(lpParms->dwCallback), 
			  wcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
    }
    return 0;
#else
    return MCIERR_HARDWARE;
#endif
}

/**************************************************************************
 * 			MCICDAUDIO_DriverProc32		[sample driver]
 */
LONG MCICDAUDIO_DriverProc32(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
			  DWORD dwParam1, DWORD dwParam2)
{
#if defined(linux) || defined(__FreeBSD__)
    switch(wMsg) {
    case DRV_LOAD:		return 1;
    case DRV_FREE:		return 1;
    case DRV_OPEN:		return 1;
    case DRV_CLOSE:		return 1;
    case DRV_ENABLE:		return 1;	
    case DRV_DISABLE:		return 1;
    case DRV_QUERYCONFIGURE:	return 1;
    case DRV_CONFIGURE:		MessageBox16(0, "Sample MultiMedia Linux Driver !", "MMLinux Driver", MB_OK); return 1;
    case DRV_INSTALL:		return DRVCNF_RESTART;
    case DRV_REMOVE:		return DRVCNF_RESTART;

    case MCI_OPEN_DRIVER:	return CDAUDIO_mciOpen(dwDevID, dwParam1, (LPMCI_OPEN_PARMS32A)dwParam2); 
    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);
    case MCI_STATUS:		return CDAUDIO_mciStatus(dwDevID, dwParam1, (LPMCI_STATUS_PARMS)dwParam2);
    case MCI_SET:		return CDAUDIO_mciSet(dwDevID, dwParam1, (LPMCI_SET_PARMS)dwParam2);
    case MCI_PLAY:		return CDAUDIO_mciPlay(dwDevID, dwParam1, (LPMCI_PLAY_PARMS)dwParam2);
    case MCI_STOP:		return CDAUDIO_mciStop(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
    case MCI_PAUSE:		return CDAUDIO_mciPause(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
    case MCI_RESUME:		return CDAUDIO_mciResume(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
    case MCI_SEEK:		return CDAUDIO_mciSeek(dwDevID, dwParam1, (LPMCI_SEEK_PARMS)dwParam2);
	/* FIXME: I wonder if those two next items are really called ? */
    case MCI_SET_DOOR_OPEN:	return CDAUDIO_mciSetDoor(dwDevID, TRUE);
    case MCI_SET_DOOR_CLOSED:	return CDAUDIO_mciSetDoor(dwDevID, FALSE);
    case MCI_LOAD:		
    case MCI_SAVE:		
    case MCI_FREEZE:		
    case MCI_PUT:		
    case MCI_REALIZE:		
    case MCI_UNFREEZE:		
    case MCI_UPDATE:		
    case MCI_WHERE:		
    case MCI_WINDOW:		
    case MCI_STEP:		
    case MCI_SPIN:		
    case MCI_ESCAPE:		
    case MCI_COPY:		
    case MCI_CUT:		
    case MCI_DELETE:		
    case MCI_PASTE:		
	WARN(cdaudio, "Unsupported command=%s\n", MCI_CommandToString(wMsg));
	break;
    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;
#endif
}

/*-----------------------------------------------------------------------*/
