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;
207 wmcda->cs.DebugInfo->Spare[0] = (
DWORD_PTR)(__FILE__
": WINE_MCICDAUDIO.cs");
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);
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
#define IDirectSoundBuffer_Lock(p, a, b, c, d, e, f, g)
BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD dwData)
#define AUDIO_STATUS_PAUSED
#define MCI_NO_COMMAND_TABLE
static void MCICDA_Notify(DWORD_PTR hWndCallBack, WINE_MCICDAUDIO *wmcda, UINT wStatus)
const unsigned char * inbuffer
#define MCIERR_INVALID_FILE
DWORD WINAPI mciGetDriverData(UINT uDeviceID)
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
#define DSBCAPS_GETCURRENTPOSITION2
#define MCIERR_CANNOT_LOAD_DRIVER
#define AUDIO_STATUS_NO_STATUS
#define MCI_COLONIZED3_RETURN
#define MCI_STATUS_NUMBER_OF_TRACKS
#define IDirectSoundBuffer_Release(p)
#define MCI_GETDEVCAPS_CAN_SAVE
#define MCIERR_UNSUPPORTED_FUNCTION
static LPDIRECTSOUNDCREATE pDirectSoundCreate
#define MCI_CDA_TRACK_AUDIO
#define MCIERR_DRIVER_INTERNAL
static DWORD CDROM_Audio_GetSerial(CDROM_TOC *toc)
#define MCI_TMSF_SECOND(t)
static BOOL MCICDA_ReadTOC(WINE_MCICDAUDIO *wmcda, CDROM_TOC *toc, DWORD *br)
#define INVALID_HANDLE_VALUE
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
DWORD WINAPI GetLastError(VOID)
#define MCI_GETDEVCAPS_COMPOUND_DEVICE
#define AUDIO_STATUS_NOT_SUPPORTED
#define IOCTL_CDROM_CURRENT_POSITION
static DWORD MCICDA_Pause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
static BOOL device_io(HANDLE dev, DWORD code, void *inbuffer, DWORD insize, void *outbuffer, DWORD outsize, DWORD *retsize, OVERLAPPED *overlapped)
#define MCI_RESOURCE_RETURNED
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define MCI_GETDEVCAPS_CAN_RECORD
#define MAKEMCIRESOURCE(wRet, wRes)
#define MCI_SET_DOOR_CLOSED
#define MCI_STATUS_POSITION
#define MCI_CDA_TRACK_OTHER
static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
#define MCI_NOTIFY_ABORTED
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
#define IOCTL_CDROM_RAW_READ
#define DRV_QUERYCONFIGURE
const char * wine_dbg_sprintf(const char *format,...)
static DWORD MCICDA_Close(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
#define IDirectSoundBuffer_GetCurrentPosition(p, a, b)
int WINAPI MessageBoxA(_In_opt_ HWND, _In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_ UINT)
static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenParms)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus)
static DWORD MCICDA_Stop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
#define MCI_GETDEVCAPS_USES_FILES
#define AUDIO_STATUS_PLAY_ERROR
#define MCI_OPEN_ELEMENT_ID
#define MCIERR_FLAGS_NOT_COMPATIBLE
#define MCI_FORMAT_MILLISECONDS
static DWORD MCICDA_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
LRESULT CALLBACK MCICDA_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, LPARAM dwParam1, LPARAM dwParam2)
static const WCHAR desc[]
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
#define IDirectSoundBuffer_GetCaps(p, a)
#define MCI_CDA_STATUS_TYPE_TRACK
static DWORD MCICDA_CalcFrame(WINE_MCICDAUDIO *wmcda, DWORD dwTime)
#define IOCTL_CDROM_STOP_AUDIO
static DWORD MCICDA_GetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms)
#define MCI_GETDEVCAPS_DEVICE_TYPE
#define IOCTL_STORAGE_EJECT_MEDIA
#define IOCTL_CDROM_SEEK_AUDIO_MSF
static DWORD MCICDA_SetDoor(UINT wDevID, BOOL open)
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)
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
HWND WINAPI GetDesktopWindow(void)
#define IOCTL_CDROM_PLAY_AUDIO_MSF
#define MCI_MSF_MINUTE(t)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCSTR lpName OPTIONAL)
static DWORD MCICDA_GetStatus(WINE_MCICDAUDIO *wmcda)
#define MCIERR_MISSING_PARAMETER
#define MCI_NOTIFY_FAILURE
#define AUDIO_STATUS_IN_PROGRESS
#define MCI_GETDEVCAPS_HAS_VIDEO
#define MCIERR_PARAM_OVERFLOW
#define FRAME_OF_TOC(toc, idx)
static DWORD MCICDA_Play(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
#define DSBCAPS_GLOBALFOCUS
#define MCI_MSF_SECOND(t)
#define InterlockedExchangePointer(Target, Value)
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define MCI_STATUS_LENGTH
TRACK_MODE_TYPE TrackMode
unsigned char size_t * outsize
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define MCI_OPEN_SHAREABLE
#define MCI_SET_TIME_FORMAT
static DWORD MCICDA_SkipDataTracks(WINE_MCICDAUDIO *wmcda, DWORD *frame)
#define MCIERR_BAD_TIME_FORMAT
#define IDirectSoundBuffer_GetStatus(p, a)
const unsigned char size_t insize
IDirectSoundBuffer * dsBuf
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
PCRITICAL_SECTION_DEBUG DebugInfo
WINE_DEFAULT_DEBUG_CHANNEL(mcicda)
#define MCI_NOTIFY_SUCCESSFUL
int seek(void *fd, ulong off, int mode)
GLenum const GLvoid * addr
#define DSBSTATUS_PLAYING
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
#define MCI_GETDEVCAPS_HAS_AUDIO
#define MCI_STATUS_CURRENT_TRACK
#define AUDIO_STATUS_PLAY_COMPLETE
static int MCICDA_GetError(WINE_MCICDAUDIO *wmcda)
#define MCI_DEVTYPE_CD_AUDIO
#define MCIERR_OUTOFRANGE
#define MCIERR_NO_IDENTITY
#define MCI_GETDEVCAPS_ITEM
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
static DWORD MCICDA_drvClose(DWORD dwDevID)
#define IDirectSound_SetCooperativeLevel(p, a, b)
#define IOCTL_CDROM_PAUSE_AUDIO
#define IDirectSoundBuffer_Restore(p)
#define MCI_SEEK_TO_START
#define IDirectSoundBuffer_Stop(p)
#define IOCTL_CDROM_RESUME_AUDIO
static DWORD MCICDA_CalcTime(WINE_MCICDAUDIO *wmcda, DWORD tf, DWORD dwFrame, LPDWORD lpRet)
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED * overlapped
#define MCI_TMSF_MINUTE(t)
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)
#define MCI_INFO_MEDIA_UPC
#define IDirectSound_Release(p)
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
#define MCI_MODE_NOT_READY
#define MCI_NOTIFY_SUPERSEDED
static DWORD CALLBACK MCICDA_playLoop(void *ptr)
#define MCI_MAKE_TMSF(t, m, s, f)
#define IDirectSound_CreateSoundBuffer(p, a, b, c)
#define IOCTL_STORAGE_LOAD_MEDIA
static DWORD MCICDA_Resume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
#define MCI_MAKE_MSF(m, s, f)
#define MCIERR_DEVICE_NOT_READY
#define MCI_TMSF_FRAME(t)
#define MCI_COLONIZED4_RETURN
struct IDirectSound * LPDIRECTSOUND
static WINE_MCICDAUDIO * MCICDA_GetOpenDrv(UINT wDevID)
#define MCI_TMSF_TRACK(t)
#define MCIERR_UNRECOGNIZED_COMMAND
#define ERROR_NOT_SUPPORTED
HRESULT(WINAPI * LPDIRECTSOUNDCREATE)(LPCGUID, LPDIRECTSOUND *, LPUNKNOWN)
#define MCI_GETDEVCAPS_CAN_EJECT
TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS]
LRESULT WINAPI DefDriverProc(DWORD_PTR dwDriverIdentifier, HDRVR hDrv, UINT Msg, LPARAM lParam1, LPARAM lParam2)
#define GetProcAddress(x, y)
static DWORD MCICDA_Info(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms)
#define IOCTL_CDROM_READ_TOC
#define MCIERR_MUST_USE_SHAREABLE
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
#define MCIERR_INVALID_DEVICE_ID
#define MCI_INFO_MEDIA_IDENTITY
#define MCI_STATUS_TIME_FORMAT
#define IDirectSoundBuffer_Play(p, a, b, c)
static DWORD MCICDA_Set(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
#define IDirectSoundBuffer_Unlock(p, a, b, c, d)
#define MCI_STATUS_MEDIA_PRESENT
#define IOCTL_CDROM_READ_Q_CHANNEL
static SERVICE_STATUS status
#define MCIERR_NULL_PARAMETER_BLOCK
#define DSBLOCK_ENTIREBUFFER
#define HeapFree(x, y, z)
static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
MCIDEVICEID wNotifyDeviceID
#define MCI_SET_DOOR_OPEN
DWORD_PTR Spare[8/sizeof(DWORD_PTR)]
#define MCI_FORMAT_RETURN_BASE
#define MCI_GETDEVCAPS_CAN_PLAY