mcicda.c

来自「Wine-20031016」· C语言 代码 · 共 1,057 行 · 第 1/3 页

C
1,057
字号
    if ( ! (toc.TrackData[i-toc.FirstTrack].Control & 4) )      break;  /* The frame will be an address in the next audio track or   * address of lead-out. */  if ( FRAME_OF_TOC(toc, i) > *frame )    *frame = FRAME_OF_TOC(toc, i);  return 0;}/************************************************************************** * 				MCICDA_Play			[internal] */static DWORD MCICDA_Play(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms){    WINE_MCICDAUDIO*	        wmcda = MCICDA_GetOpenDrv(wDevID);    DWORD		        ret = 0, start, end;    DWORD                       br;    CDROM_PLAY_AUDIO_MSF        play;    CDROM_SUB_Q_DATA_FORMAT     fmt;    SUB_Q_CHANNEL_DATA          data;    CDROM_TOC			toc;    TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);    if (lpParms == NULL)	return MCIERR_NULL_PARAMETER_BLOCK;    if (wmcda == NULL)	return MCIERR_INVALID_DEVICE_ID;    if (dwFlags & MCI_FROM) {	start = MCICDA_CalcFrame(wmcda, lpParms->dwFrom);	if ( (ret=MCICDA_SkipDataTracks(wmcda, &start)) )	  return ret;	TRACE("MCI_FROM=%08lX -> %lu \n", lpParms->dwFrom, start);    } else {        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);        }        start = FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress);	if ( (ret=MCICDA_SkipDataTracks(wmcda, &start)) )	  return ret;    }    if (dwFlags & MCI_TO) {	end = MCICDA_CalcFrame(wmcda, lpParms->dwTo);	TRACE("MCI_TO=%08lX -> %lu \n", lpParms->dwTo, end);    } else {        if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL, 0,                             &toc, sizeof(toc), &br, NULL)) {            WARN("error reading TOC !\n");            return MCICDA_GetError(wmcda);        }	end = FRAME_OF_TOC(toc, toc.LastTrack + 1) - 1;    }    TRACE("Playing from %lu to %lu\n", start, end);    play.StartingM = start / CDFRAMES_PERMIN;    play.StartingS = (start / CDFRAMES_PERSEC) % 60;    play.StartingF = start % CDFRAMES_PERSEC;    play.EndingM   = end / CDFRAMES_PERMIN;    play.EndingS   = (end / CDFRAMES_PERSEC) % 60;    play.EndingF   = end % CDFRAMES_PERSEC;    if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_PLAY_AUDIO_MSF, &play, sizeof(play),                         NULL, 0, &br, NULL)) {	ret = MCIERR_HARDWARE;    } else if (dwFlags & MCI_NOTIFY) {	TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);	/*	  mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),	  wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);	*/    }    return ret;}/************************************************************************** * 				MCICDA_Stop			[internal] */static DWORD MCICDA_Stop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms){    WINE_MCICDAUDIO*	wmcda = MCICDA_GetOpenDrv(wDevID);    DWORD               br;    TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);    if (wmcda == NULL)	return MCIERR_INVALID_DEVICE_ID;    if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_STOP_AUDIO, NULL, 0, NULL, 0, &br, NULL))	return MCIERR_HARDWARE;    if (lpParms && (dwFlags & MCI_NOTIFY)) {	TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);	mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),			wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);    }    return 0;}/************************************************************************** * 				MCICDA_Pause			[internal] */static DWORD MCICDA_Pause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms){    WINE_MCICDAUDIO*	wmcda = MCICDA_GetOpenDrv(wDevID);    DWORD               br;    TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);    if (wmcda == NULL)	return MCIERR_INVALID_DEVICE_ID;    if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_PAUSE_AUDIO, NULL, 0, NULL, 0, &br, NULL))	return MCIERR_HARDWARE;    if (lpParms && (dwFlags & MCI_NOTIFY)) {        TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);	mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),			wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);    }    return 0;}/************************************************************************** * 				MCICDA_Resume			[internal] */static DWORD MCICDA_Resume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms){    WINE_MCICDAUDIO*	wmcda = MCICDA_GetOpenDrv(wDevID);    DWORD               br;    TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);    if (wmcda == NULL)	return MCIERR_INVALID_DEVICE_ID;    if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_RESUME_AUDIO, NULL, 0, NULL, 0, &br, NULL))	return MCIERR_HARDWARE;    if (lpParms && (dwFlags & MCI_NOTIFY)) {	TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);	mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),			wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);    }    return 0;}/************************************************************************** * 				MCICDA_Seek			[internal] */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;    CDROM_TOC			toc;    TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);    if (wmcda == NULL)	return MCIERR_INVALID_DEVICE_ID;    if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;    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)) {    case MCI_SEEK_TO_START:	TRACE("Seeking to start\n");	at = FRAME_OF_TOC(toc,toc.FirstTrack);	if ( (ret=MCICDA_SkipDataTracks(wmcda, &at)) )	  return ret;	break;    case MCI_SEEK_TO_END:	TRACE("Seeking to end\n");	at = FRAME_OF_TOC(toc, toc.LastTrack + 1) - 1;	if ( (ret=MCICDA_SkipDataTracks(wmcda, &at)) )	  return ret;	break;    case MCI_TO:	TRACE("Seeking to %lu\n", lpParms->dwTo);        at = MCICDA_CalcFrame(wmcda, lpParms->dwTo);	if ( (ret=MCICDA_SkipDataTracks(wmcda, &at)) )	  return ret;	break;    default:	TRACE("Unknown seek action %08lX\n",	      (dwFlags & ~(MCI_NOTIFY|MCI_WAIT)));	return MCIERR_UNSUPPORTED_FUNCTION;    }    seek.M = at / CDFRAMES_PERMIN;    seek.S = (at / CDFRAMES_PERSEC) % 60;    seek.F = at % CDFRAMES_PERSEC;    if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_SEEK_AUDIO_MSF, &seek, sizeof(seek),                         NULL, 0, &br, NULL))	return MCIERR_HARDWARE;    if (dwFlags & MCI_NOTIFY) {	TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);	mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),			  wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);    }    return 0;}/************************************************************************** * 				MCICDA_SetDoor			[internal] */static DWORD	MCICDA_SetDoor(UINT wDevID, BOOL open){    WINE_MCICDAUDIO*	wmcda = MCICDA_GetOpenDrv(wDevID);    DWORD               br;    TRACE("(%04x, %s) !\n", wDevID, (open) ? "OPEN" : "CLOSE");    if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID;    if (!DeviceIoControl(wmcda->handle,                         (open) ? IOCTL_STORAGE_EJECT_MEDIA : IOCTL_STORAGE_LOAD_MEDIA,                         NULL, 0, NULL, 0, &br, NULL))	return MCIERR_HARDWARE;    return 0;}/************************************************************************** * 				MCICDA_Set			[internal] */static DWORD MCICDA_Set(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms){    WINE_MCICDAUDIO*	wmcda = MCICDA_GetOpenDrv(wDevID);    TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);    if (wmcda == NULL)	return MCIERR_INVALID_DEVICE_ID;    if (dwFlags & MCI_SET_DOOR_OPEN) {	MCICDA_SetDoor(wDevID, TRUE);    }    if (dwFlags & MCI_SET_DOOR_CLOSED) {	MCICDA_SetDoor(wDevID, FALSE);    }    /* only functions which require valid lpParms below this line ! */    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) {	case MCI_FORMAT_MILLISECONDS:	    TRACE("MCI_FORMAT_MILLISECONDS !\n");	    break;	case MCI_FORMAT_MSF:	    TRACE("MCI_FORMAT_MSF !\n");	    break;	case MCI_FORMAT_TMSF:	    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_NOTIFY) {	TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n",	      lpParms->dwCallback);	mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),			wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);    }    return 0;}/************************************************************************** * 			DriverProc (MCICDA.@) */LONG CALLBACK	MCICDA_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg,				      DWORD dwParam1, DWORD dwParam2){    switch(wMsg) {    case DRV_LOAD:		return 1;    case DRV_FREE:		return 1;    case DRV_OPEN:		return MCICDA_drvOpen((LPSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSA)dwParam2);    case DRV_CLOSE:		return MCICDA_drvClose(dwDevID);    case DRV_ENABLE:		return 1;    case DRV_DISABLE:		return 1;    case DRV_QUERYCONFIGURE:	return 1;    case DRV_CONFIGURE:		MessageBoxA(0, "MCI audio CD driver !", "Wine Driver", MB_OK); return 1;    case DRV_INSTALL:		return DRVCNF_RESTART;    case DRV_REMOVE:		return DRVCNF_RESTART;    }    if (dwDevID == 0xFFFFFFFF) return MCIERR_UNSUPPORTED_FUNCTION;    switch (wMsg) {    case MCI_OPEN_DRIVER:	return MCICDA_Open(dwDevID, dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);    case MCI_CLOSE_DRIVER:	return MCICDA_Close(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);    case MCI_GETDEVCAPS:	return MCICDA_GetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2);    case MCI_INFO:		return MCICDA_Info(dwDevID, dwParam1, (LPMCI_INFO_PARMSA)dwParam2);    case MCI_STATUS:		return MCICDA_Status(dwDevID, dwParam1, (LPMCI_STATUS_PARMS)dwParam2);    case MCI_SET:		return MCICDA_Set(dwDevID, dwParam1, (LPMCI_SET_PARMS)dwParam2);    case MCI_PLAY:		return MCICDA_Play(dwDevID, dwParam1, (LPMCI_PLAY_PARMS)dwParam2);    case MCI_STOP:		return MCICDA_Stop(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);    case MCI_PAUSE:		return MCICDA_Pause(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);    case MCI_RESUME:		return MCICDA_Resume(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);    case MCI_SEEK:		return MCICDA_Seek(dwDevID, dwParam1, (LPMCI_SEEK_PARMS)dwParam2);    /* FIXME: I wonder if those two next items are really called ? */    case MCI_SET_DOOR_OPEN:	FIXME("MCI_SET_DOOR_OPEN called. Please report this.\n");				return MCICDA_SetDoor(dwDevID, TRUE);    case MCI_SET_DOOR_CLOSED:	FIXME("MCI_SET_DOOR_CLOSED called. Please report this.\n");				return MCICDA_SetDoor(dwDevID, FALSE);    /* commands that should be supported */    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_STEP:    case MCI_SPIN:    case MCI_ESCAPE:    case MCI_COPY:    case MCI_CUT:    case MCI_DELETE:    case MCI_PASTE:	FIXME("Unsupported yet command [%lu]\n", wMsg);	break;    /* commands that should report an error */    case MCI_WINDOW:	TRACE("Unsupported command [%lu]\n", wMsg);	break;    case MCI_OPEN:    case MCI_CLOSE:	ERR("Shouldn't receive a MCI_OPEN or CLOSE message\n");	break;    default:	TRACE("Sending msg [%lu] to default driver proc\n", wMsg);	return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);    }    return MCIERR_UNRECOGNIZED_COMMAND;}/*-----------------------------------------------------------------------*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?