28#define WIN32_NO_STATUS
37#include "wine/winternl.h"
39#include "wine/unicode.h"
44#define CDFRAMES_PERSEC 75
45#define CDFRAMES_PERMIN (CDFRAMES_PERSEC * 60)
46#define FRAME_OF_ADDR(a) ((a)[1] * CDFRAMES_PERMIN + (a)[2] * CDFRAMES_PERSEC + (a)[3])
47#define FRAME_OF_TOC(toc, idx) FRAME_OF_ADDR((toc).TrackData[idx - (toc).FirstTrack].Address)
50#define RAW_SECTOR_SIZE (2352)
53#define CDDA_FRAG_SIZE (32768)
55#define CDDA_FRAG_COUNT (3)
87#define XX(x) case (x): str = #x; break
103 TRACE(
"Device %p, Code %s -> Return %d, Bytes %u\n",
dev,
str,
ret, *retsize);
110 DWORD lastPos, curPos, endPos, br;
112 DWORD lockLen, fragLen;
117 memset(&caps, 0,
sizeof(caps));
118 caps.
dwSize =
sizeof(caps);
122 curPos = lastPos = 0;
153 if(endPos == ~0
u) endPos = lastPos;
188 if (!modp)
return 0xFFFFFFFF;
224 return (dwDevID == 0xFFFFFFFF) ? 1 : 0;
235 WARN(
"Invalid wDevID=%u\n", wDevID);
261 WARN(
"error reading TOC !\n");
298 switch (
data.CurrentPosition.Header.AudioStatus)
345 TRACE(
"MILLISECONDS %u\n", dwFrame);
348 TRACE(
"MSF %02u:%02u:%02u\n",
358 &toc,
sizeof(toc), &br,
NULL))
360 if (wTrack < toc.FirstTrack || wTrack > toc.
LastTrack)
362 TRACE(
"MSF %02u-%02u:%02u:%02u\n",
366 TRACE(
"TMSF trackpos[%u]=%d:%d:%d\n",
389 TRACE(
"(%p, %08X, %u);\n", wmcda,
tf, dwFrame);
402 TRACE(
"MSF %02u:%02u:%02u -> dwTime=%u\n",
403 wMinutes, wSeconds, wFrames,
dwTime);
409 &toc,
sizeof(toc), &br,
NULL))
413 ERR(
"Out of range value %u [%u,%u]\n",
429 TRACE(
"%02u-%02u:%02u:%02u\n", wTrack, wMinutes, wSeconds, wFrames);
448 TRACE(
"(%04X, %08X, %p);\n", wDevID,
dwFlags, lpOpenParms);
538 TRACE(
"(%04X, %08X, %p);\n", wDevID, dwParam, lpParms);
567 TRACE(
"MCI_GETDEVCAPS_ITEM dwItem=%08X;\n", lpParms->
dwItem);
569 switch (lpParms->
dwItem) {
607 WARN(
"Unsupported %x devCaps item\n", lpParms->
dwItem);
611 TRACE(
"No GetDevCaps-Item !\n");
626 DWORD dwStart, dwEnd;
645 serial += wMagic + (dwEnd - dwStart);
670 static const WCHAR wszAudioCd[] = {
'W',
'i',
'n',
'e',
'\'',
's',
' ',
'a',
'u',
'd',
'i',
'o',
' ',
'C',
'D',0};
678 static const WCHAR wszLu[] = {
'%',
'l',
'u',0};
681 &toc,
sizeof(toc), &br,
NULL)) {
689 WARN(
"Don't know this info command (%u)\n",
dwFlags);
724 switch (lpParms->
dwItem) {
741 TRACE(
"MCI_TRACK #%u LENGTH=??? !\n", lpParms->
dwTrack);
781 TRACE(
"MCI_STATUS_NUMBER_OF_TRACKS = %lu\n", lpParms->
dwReturn);
792 TRACE(
"get MCI_STATUS_START !\n");
818 TRACE(
"MCI_STATUS_READY !\n");
855 FIXME(
"unknown command %08X !\n", lpParms->
dwItem);
992 format.nSamplesPerSec = 44100;
993 format.wBitsPerSample = 16;
1020 &rdInfo,
sizeof(rdInfo), cdData, lockLen,
1088 TRACE(
"(%04X, %08X, %p);\n", wDevID,
dwFlags, lpParms);
1126 TRACE(
"(%04X, %08X, %p);\n", wDevID,
dwFlags, lpParms);
1155 TRACE(
"(%04X, %08X, %p);\n", wDevID,
dwFlags, lpParms);
1184 TRACE(
"(%04X, %08X, %p);\n", wDevID,
dwFlags, lpParms);
1203 TRACE(
"Seeking to start\n");
1209 TRACE(
"Seeking to end\n");
1217 TRACE(
"Seeking to %u\n", lpParms->
dwTo);
1248 TRACE(
"(%04x, %s) !\n", wDevID, (
open) ?
"OPEN" :
"CLOSE");
1267 TRACE(
"(%04X, %08X, %p);\n", wDevID,
dwFlags, lpParms);
1286 TRACE(
"MCI_FORMAT_MILLISECONDS !\n");
1289 TRACE(
"MCI_FORMAT_MSF !\n");
1292 TRACE(
"MCI_FORMAT_TMSF !\n");
1361 TRACE(
"Unsupported command [0x%x]\n", wMsg);
1365 ERR(
"Shouldn't receive a MCI_OPEN or CLOSE message\n");
1368 TRACE(
"Sending msg [0x%x] to default driver proc\n", wMsg);
1369 return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define IOCTL_CDROM_CURRENT_POSITION
BOOL WINAPI DeviceIoControl(IN HANDLE hDevice, IN DWORD dwIoControlCode, IN LPVOID lpInBuffer OPTIONAL, IN DWORD nInBufferSize OPTIONAL, OUT LPVOID lpOutBuffer OPTIONAL, IN DWORD nOutBufferSize OPTIONAL, OUT LPDWORD lpBytesReturned OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
const char * wine_dbg_sprintf(const char *format,...)
#define GetProcAddress(x, y)
#define INVALID_HANDLE_VALUE
#define ERROR_NOT_SUPPORTED
#define HeapFree(x, y, z)
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
static DWORD MCICDA_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
static WINE_MCICDAUDIO * MCICDA_GetOpenDrv(UINT wDevID)
static DWORD MCICDA_SetDoor(UINT wDevID, BOOL open)
static DWORD MCICDA_Resume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
LRESULT CALLBACK MCICDA_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, LPARAM dwParam1, LPARAM dwParam2)
static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenParms)
static DWORD MCICDA_Close(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
static DWORD MCICDA_Stop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
static DWORD MCICDA_GetStatus(WINE_MCICDAUDIO *wmcda)
static DWORD MCICDA_SkipDataTracks(WINE_MCICDAUDIO *wmcda, DWORD *frame)
static void MCICDA_Notify(DWORD_PTR hWndCallBack, WINE_MCICDAUDIO *wmcda, UINT wStatus)
static DWORD MCICDA_GetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms)
static DWORD MCICDA_drvClose(DWORD dwDevID)
static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
#define FRAME_OF_TOC(toc, idx)
static DWORD MCICDA_Play(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
HRESULT(WINAPI * LPDIRECTSOUNDCREATE)(LPCGUID, LPDIRECTSOUND *, LPUNKNOWN)
static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
static DWORD MCICDA_CalcFrame(WINE_MCICDAUDIO *wmcda, DWORD dwTime)
static DWORD MCICDA_Pause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
static DWORD CDROM_Audio_GetSerial(CDROM_TOC *toc)
static DWORD MCICDA_Info(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms)
static int MCICDA_GetError(WINE_MCICDAUDIO *wmcda)
static LPDIRECTSOUNDCREATE pDirectSoundCreate
static DWORD MCICDA_CalcTime(WINE_MCICDAUDIO *wmcda, DWORD tf, DWORD dwFrame, LPDWORD lpRet)
static BOOL MCICDA_ReadTOC(WINE_MCICDAUDIO *wmcda, CDROM_TOC *toc, DWORD *br)
static DWORD MCICDA_Set(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
static DWORD CALLBACK MCICDA_playLoop(void *ptr)
static BOOL device_io(HANDLE dev, DWORD code, void *inbuffer, DWORD insize, void *outbuffer, DWORD outsize, DWORD *retsize, OVERLAPPED *overlapped)
#define MCI_NO_COMMAND_TABLE
#define MCI_FORMAT_RETURN_BASE
#define MAKEMCIRESOURCE(wRet, wRes)
BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus)
#define MCI_RESOURCE_RETURNED
#define MCI_COLONIZED3_RETURN
BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD dwData)
DWORD WINAPI mciGetDriverData(UINT uDeviceID)
#define MCI_COLONIZED4_RETURN
LRESULT WINAPI DefDriverProc(DWORD_PTR dwDriverIdentifier, HDRVR hDrv, UINT Msg, LPARAM lParam1, LPARAM lParam2)
#define InterlockedExchangePointer(Target, Value)
#define IDirectSoundBuffer_Unlock(p, a, b, c, d)
#define DSBCAPS_GLOBALFOCUS
#define IDirectSoundBuffer_Restore(p)
#define IDirectSoundBuffer_GetCurrentPosition(p, a, b)
#define DSBCAPS_GETCURRENTPOSITION2
#define IDirectSoundBuffer_GetStatus(p, a)
#define DSBLOCK_ENTIREBUFFER
#define IDirectSoundBuffer_Stop(p)
struct IDirectSound * LPDIRECTSOUND
#define DSBSTATUS_PLAYING
#define IDirectSoundBuffer_Play(p, a, b, c)
#define IDirectSoundBuffer_GetCaps(p, a)
#define IDirectSound_Release(p)
#define IDirectSoundBuffer_Lock(p, a, b, c, d, e, f, g)
#define IDirectSound_SetCooperativeLevel(p, a, b)
#define IDirectSound_CreateSoundBuffer(p, a, b, c)
#define IDirectSoundBuffer_Release(p)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum const GLvoid * addr
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
const unsigned char * inbuffer
const unsigned char size_t insize
unsigned char size_t * outsize
#define MCIERR_FLAGS_NOT_COMPATIBLE
#define MCI_OPEN_SHAREABLE
#define MCI_TMSF_MINUTE(t)
#define MCI_NOTIFY_SUPERSEDED
#define MCI_GETDEVCAPS_CAN_SAVE
#define MCI_CDA_TRACK_OTHER
#define MCI_GETDEVCAPS_HAS_VIDEO
#define MCI_STATUS_POSITION
#define MCI_MAKE_TMSF(t, m, s, f)
#define DRV_QUERYCONFIGURE
#define MCI_OPEN_ELEMENT_ID
#define MCI_TMSF_SECOND(t)
#define MCI_GETDEVCAPS_CAN_RECORD
#define MCI_FORMAT_MILLISECONDS
#define MCI_MAKE_MSF(m, s, f)
#define MCIERR_CANNOT_LOAD_DRIVER
#define MCI_GETDEVCAPS_DEVICE_TYPE
#define MCI_INFO_MEDIA_IDENTITY
#define MCI_MSF_MINUTE(t)
#define MCIERR_DEVICE_NOT_READY
#define MCIERR_NO_IDENTITY
#define MCIERR_UNRECOGNIZED_COMMAND
#define MCI_TMSF_FRAME(t)
#define MCI_GETDEVCAPS_COMPOUND_DEVICE
#define MCI_SET_DOOR_OPEN
#define MCI_GETDEVCAPS_USES_FILES
#define MCI_GETDEVCAPS_CAN_PLAY
#define MCI_CDA_TRACK_AUDIO
#define MCIERR_PARAM_OVERFLOW
#define MCIERR_INVALID_DEVICE_ID
#define MCI_SET_TIME_FORMAT
#define MCIERR_INVALID_FILE
#define MCI_GETDEVCAPS_CAN_EJECT
#define MCIERR_MISSING_PARAMETER
#define MCIERR_NULL_PARAMETER_BLOCK
#define MCI_NOTIFY_ABORTED
#define MCIERR_DRIVER_INTERNAL
#define MCIERR_OUTOFRANGE
#define MCI_INFO_MEDIA_UPC
#define MCI_STATUS_CURRENT_TRACK
#define MCI_STATUS_NUMBER_OF_TRACKS
#define MCI_SET_DOOR_CLOSED
#define MCI_GETDEVCAPS_ITEM
#define MCI_STATUS_LENGTH
#define MCI_TMSF_TRACK(t)
#define MCIERR_MUST_USE_SHAREABLE
#define MCI_SEEK_TO_START
#define MCI_NOTIFY_SUCCESSFUL
#define MCI_NOTIFY_FAILURE
#define MCI_MSF_SECOND(t)
#define MCI_CDA_STATUS_TYPE_TRACK
#define MCI_MODE_NOT_READY
#define MCI_STATUS_MEDIA_PRESENT
#define MCIERR_BAD_TIME_FORMAT
#define MCIERR_UNSUPPORTED_FUNCTION
#define MCI_STATUS_TIME_FORMAT
#define MCI_DEVTYPE_CD_AUDIO
#define MCI_GETDEVCAPS_HAS_AUDIO
static const WCHAR desc[]
#define AUDIO_STATUS_IN_PROGRESS
#define AUDIO_STATUS_NO_STATUS
#define IOCTL_CDROM_SEEK_AUDIO_MSF
#define AUDIO_STATUS_PLAY_COMPLETE
#define AUDIO_STATUS_PAUSED
#define IOCTL_CDROM_PAUSE_AUDIO
#define IOCTL_CDROM_STOP_AUDIO
#define IOCTL_CDROM_READ_Q_CHANNEL
#define AUDIO_STATUS_NOT_SUPPORTED
#define AUDIO_STATUS_PLAY_ERROR
#define IOCTL_CDROM_PLAY_AUDIO_MSF
#define IOCTL_CDROM_RESUME_AUDIO
#define IOCTL_CDROM_READ_TOC
#define IOCTL_CDROM_RAW_READ
#define IOCTL_STORAGE_LOAD_MEDIA
#define IOCTL_STORAGE_EJECT_MEDIA
int seek(void *fd, ulong off, int mode)
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED * overlapped
MCIDEVICEID wNotifyDeviceID
IDirectSoundBuffer * dsBuf
TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS]
DWORD_PTR Spare[8/sizeof(DWORD_PTR)]
PCRITICAL_SECTION_DEBUG DebugInfo
TRACK_MODE_TYPE TrackMode
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
DWORD WINAPI GetLastError(void)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
int WINAPI MessageBoxA(_In_opt_ HWND hWnd, _In_opt_ LPCSTR lpText, _In_opt_ LPCSTR lpCaption, _In_ UINT uType)
HWND WINAPI GetDesktopWindow(void)