Commit f33f7d2b authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

Moved MCI part to mciwave.c ; added some error checking ; added

DriverProc
parent 221a0b8d
......@@ -45,9 +45,8 @@
#define IOCTL(a,b,c) (c = ioctl(a,b,c) )
#endif
#define MAX_WAVOUTDRV (1)
#define MAX_WAVINDRV (1)
#define MAX_MCIWAVDRV (1)
#define MAX_WAVEOUTDRV (1)
#define MAX_WAVEINDRV (1)
typedef struct {
int unixdev;
......@@ -71,21 +70,12 @@ typedef struct {
DWORD dwTotalRecorded;
} WINE_WAVEIN;
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 */
HMMIO32 hFile; /* mmio file handle open as Element */
MCI_WAVE_OPEN_PARMS16 openParms;
PCMWAVEFORMAT WaveFormat;
WAVEHDR WaveHdr;
BOOL16 fInput; /* FALSE = Output, TRUE = Input */
} WINE_MCIWAVE;
static WINE_WAVEOUT WOutDev [MAX_WAVEOUTDRV];
static WINE_WAVEIN WInDev [MAX_WAVEOUTDRV];
static WINE_WAVEOUT WOutDev[MAX_WAVOUTDRV];
static WINE_WAVEIN WInDev[MAX_WAVOUTDRV];
static WINE_MCIWAVE MCIWavDev[MAX_MCIWAVDRV];
/*======================================================================*
* Low level WAVE implemantation *
*======================================================================*/
/**************************************************************************
* WAVE_NotifyClient [internal]
......@@ -93,15 +83,16 @@ static WINE_MCIWAVE MCIWavDev[MAX_MCIWAVDRV];
static DWORD WAVE_NotifyClient(UINT16 wDevID, WORD wMsg,
DWORD dwParam1, DWORD dwParam2)
{
TRACE(mciwave,"wDevID = %04X wMsg = %d dwParm1 = %04lX dwParam2 = %04lX\n",wDevID, wMsg, dwParam1, dwParam2);
TRACE(wave,"wDevID = %04X wMsg = %d dwParm1 = %04lX dwParam2 = %04lX\n",wDevID, wMsg, dwParam1, dwParam2);
switch (wMsg) {
case WOM_OPEN:
case WOM_CLOSE:
case WOM_DONE:
if (wDevID > MAX_WAVOUTDRV) return MCIERR_INTERNAL;
if (wDevID > MAX_WAVEOUTDRV) return MCIERR_INTERNAL;
if (WOutDev[wDevID].wFlags != DCB_NULL && !DriverCallback(
if (WOutDev[wDevID].wFlags != DCB_NULL &&
!DriverCallback(
WOutDev[wDevID].waveDesc.dwCallBack,
WOutDev[wDevID].wFlags,
WOutDev[wDevID].waveDesc.hWave,
......@@ -109,7 +100,7 @@ static DWORD WAVE_NotifyClient(UINT16 wDevID, WORD wMsg,
WOutDev[wDevID].waveDesc.dwInstance,
dwParam1,
dwParam2)) {
WARN(mciwave, "can't notify client !\n");
WARN(wave, "can't notify client !\n");
return MMSYSERR_NOERROR;
}
break;
......@@ -117,13 +108,18 @@ static DWORD WAVE_NotifyClient(UINT16 wDevID, WORD wMsg,
case WIM_OPEN:
case WIM_CLOSE:
case WIM_DATA:
if (wDevID > MAX_WAVINDRV) return MCIERR_INTERNAL;
if (wDevID > MAX_WAVEINDRV) return MCIERR_INTERNAL;
if (WInDev[wDevID].wFlags != DCB_NULL && !DriverCallback(
WInDev[wDevID].waveDesc.dwCallBack, WInDev[wDevID].wFlags,
WInDev[wDevID].waveDesc.hWave, wMsg,
WInDev[wDevID].waveDesc.dwInstance, dwParam1, dwParam2)) {
WARN(mciwave, "can't notify client !\n");
if (WInDev[wDevID].wFlags != DCB_NULL &&
!DriverCallback(
WInDev[wDevID].waveDesc.dwCallBack,
WInDev[wDevID].wFlags,
WInDev[wDevID].waveDesc.hWave,
wMsg,
WInDev[wDevID].waveDesc.dwInstance,
dwParam1,
dwParam2)) {
WARN(wave, "can't notify client !\n");
return MMSYSERR_NOERROR;
}
break;
......@@ -131,628 +127,6 @@ static DWORD WAVE_NotifyClient(UINT16 wDevID, WORD wMsg,
return 0;
}
/**************************************************************************
* WAVE_mciOpen [internal]
*/
static DWORD WAVE_mciOpen(UINT16 wDevID, DWORD dwFlags, void* lp, BOOL32 is32)
{
LPPCMWAVEFORMAT lpWaveFormat;
WAVEOPENDESC waveDesc;
DWORD dwRet;
DWORD dwDeviceID;
TRACE(mciwave,"(%04X, %08lX, %p)\n", wDevID, dwFlags, lp);
if (lp == NULL) return MCIERR_INTERNAL;
if (is32) dwDeviceID = ((LPMCI_OPEN_PARMS32A)lp)->wDeviceID;
else dwDeviceID = ((LPMCI_OPEN_PARMS16)lp)->wDeviceID;
if (MCIWavDev[wDevID].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 (MCIWavDev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
++MCIWavDev[wDevID].nUseCount;
else
return MCIERR_MUST_USE_SHAREABLE;
} else {
MCIWavDev[wDevID].nUseCount = 1;
MCIWavDev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
}
MCIWavDev[wDevID].fInput = FALSE;
TRACE(mciwave,"wDevID=%04X\n", wDevID);
TRACE(mciwave,"before OPEN_ELEMENT\n");
if (dwFlags & MCI_OPEN_ELEMENT) {
LPSTR lpstrElementName;
if (is32) lpstrElementName = ((LPMCI_WAVE_OPEN_PARMS32A)lp)->lpstrElementName;
else lpstrElementName = (LPSTR)PTR_SEG_TO_LIN(((LPMCI_WAVE_OPEN_PARMS16)lp)->lpstrElementName);
TRACE(mciwave,"MCI_OPEN_ELEMENT '%s' !\n", lpstrElementName);
if (lpstrElementName && (strlen(lpstrElementName) > 0)) {
MCIWavDev[wDevID].hFile = mmioOpen32A(lpstrElementName, NULL,
MMIO_ALLOCBUF | MMIO_READWRITE | MMIO_EXCLUSIVE);
if (MCIWavDev[wDevID].hFile == 0) {
WARN(mciwave, "can't find file='%s' !\n", lpstrElementName);
return MCIERR_FILE_NOT_FOUND;
}
}
else
MCIWavDev[wDevID].hFile = 0;
}
TRACE(mciwave,"hFile=%u\n", MCIWavDev[wDevID].hFile);
memcpy(&MCIWavDev[wDevID].openParms, lp, sizeof(MCI_WAVE_OPEN_PARMS16));
MCIWavDev[wDevID].wNotifyDeviceID = dwDeviceID;
lpWaveFormat = &MCIWavDev[wDevID].WaveFormat;
waveDesc.hWave = 0;
/*
lpWaveFormat->wf.wFormatTag = WAVE_FORMAT_PCM;
lpWaveFormat->wBitsPerSample = 8;
lpWaveFormat->wf.nChannels = 1;
lpWaveFormat->wf.nSamplesPerSec = 11025;
lpWaveFormat->wf.nAvgBytesPerSec = 11025;
lpWaveFormat->wf.nBlockAlign = 1;
*/
if (MCIWavDev[wDevID].hFile != 0) {
MMCKINFO mmckInfo;
MMCKINFO ckMainRIFF;
if (mmioDescend(MCIWavDev[wDevID].hFile, &ckMainRIFF, NULL, 0) != 0)
return MCIERR_INTERNAL;
TRACE(mciwave, "ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType,
ckMainRIFF.cksize);
if ((ckMainRIFF.ckid != FOURCC_RIFF) ||
(ckMainRIFF.fccType != mmioFOURCC('W', 'A', 'V', 'E')))
return MCIERR_INTERNAL;
mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(MCIWavDev[wDevID].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0)
return MCIERR_INTERNAL;
TRACE(mciwave, "Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
mmckInfo.cksize);
if (mmioRead32(MCIWavDev[wDevID].hFile, (HPSTR) lpWaveFormat,
(long) sizeof(PCMWAVEFORMAT)) != (long) sizeof(PCMWAVEFORMAT))
return MCIERR_INTERNAL;
mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(MCIWavDev[wDevID].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0)
return MCIERR_INTERNAL;
TRACE(mciwave,"Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
mmckInfo.cksize);
TRACE(mciwave, "nChannels=%d nSamplesPerSec=%ld\n",
lpWaveFormat->wf.nChannels, lpWaveFormat->wf.nSamplesPerSec);
lpWaveFormat->wBitsPerSample = 0;
}
lpWaveFormat->wf.nAvgBytesPerSec =
lpWaveFormat->wf.nSamplesPerSec * lpWaveFormat->wf.nBlockAlign;
waveDesc.lpFormat = (LPWAVEFORMAT)lpWaveFormat;
/*
By default the device will be opened for output, the MCI_CUE function is there to
change from output to input and back
*/
dwRet=wodMessage(wDevID,WODM_OPEN,0,(DWORD)&waveDesc,CALLBACK_NULL);
return 0;
}
/**************************************************************************
* WAVE_mciCue [internal]
*/
static DWORD WAVE_mciCue(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
{
/*
FIXME
This routine is far from complete. At the moment only a check is done on the
MCI_WAVE_INPUT flag. No explicit check on MCI_WAVE_OUTPUT is done since that
is the default.
The flags MCI_NOTIFY (and the callback parameter in lpParms) and MCI_WAIT
are ignored
*/
DWORD dwRet;
WAVEOPENDESC waveDesc;
TRACE(mciwave,"(%u, %08lX, %p);\n", wDevID, dwParam, lpParms);
/* always close elements ? */
if (MCIWavDev[wDevID].hFile != 0) {
mmioClose32(MCIWavDev[wDevID].hFile, 0);
MCIWavDev[wDevID].hFile = 0;
}
dwRet = MMSYSERR_NOERROR; /* assume success */
if ((dwParam & MCI_WAVE_INPUT) && !MCIWavDev[wDevID].fInput) {
/* FIXME this is just a hack WOutDev should be hidden here */
memcpy(&waveDesc,&WOutDev[wDevID].waveDesc,sizeof(WAVEOPENDESC));
dwRet = wodMessage(wDevID, WODM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
dwRet = widMessage(wDevID, WIDM_OPEN, 0, (DWORD)&waveDesc, CALLBACK_NULL);
MCIWavDev[wDevID].fInput = TRUE;
}
else if (MCIWavDev[wDevID].fInput) {
/* FIXME this is just a hack WInDev should be hidden here */
memcpy(&waveDesc,&WInDev[wDevID].waveDesc,sizeof(WAVEOPENDESC));
dwRet = widMessage(wDevID, WIDM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
dwRet = wodMessage(wDevID, WODM_OPEN, 0, (DWORD)&waveDesc, CALLBACK_NULL);
MCIWavDev[wDevID].fInput = FALSE;
}
return dwRet;
}
/**************************************************************************
* WAVE_mciClose [internal]
*/
static DWORD WAVE_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
{
DWORD dwRet;
TRACE(mciwave, "(%u, %08lX, %p);\n", wDevID, dwParam, lpParms);
MCIWavDev[wDevID].nUseCount--;
if (MCIWavDev[wDevID].nUseCount == 0) {
if (MCIWavDev[wDevID].hFile != 0) {
mmioClose32(MCIWavDev[wDevID].hFile, 0);
MCIWavDev[wDevID].hFile = 0;
}
if (MCIWavDev[wDevID].fInput)
dwRet = widMessage(wDevID, WIDM_CLOSE, 0, 0L, 0L);
else
dwRet = wodMessage(wDevID, WODM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
}
return 0;
}
/**************************************************************************
* WAVE_mciPlay [internal]
*/
static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
{
int start, end;
LONG bufsize, count;
HGLOBAL16 hData;
LPWAVEHDR lpWaveHdr;
DWORD dwRet;
TRACE(mciwave, "(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (MCIWavDev[wDevID].fInput) {
WARN(mciwave, "cannot play on input device\n");
return MCIERR_NONAPPLICABLE_FUNCTION;
}
if (MCIWavDev[wDevID].hFile == 0) {
WARN(mciwave, "can't find file='%08lx' !\n",
MCIWavDev[wDevID].openParms.lpstrElementName);
return MCIERR_FILE_NOT_FOUND;
}
start = 1; end = 99999;
if (dwFlags & MCI_FROM) {
start = lpParms->dwFrom;
TRACE(mciwave, "MCI_FROM=%d \n", start);
}
if (dwFlags & MCI_TO) {
end = lpParms->dwTo;
TRACE(mciwave,"MCI_TO=%d \n", end);
}
#if 0
if (dwFlags & MCI_NOTIFY) {
TRACE(mciwave, "MCI_NOTIFY %08lX !\n", lpParms->dwCallback);
switch(fork()) {
case -1:
WARN(mciwave, "Can't 'fork' process !\n");
break;
case 0:
break;
default:
TRACE(mciwave,"process started ! return to caller...\n");
return 0;
}
}
#endif
bufsize = 64000;
lpWaveHdr = &MCIWavDev[wDevID].WaveHdr;
hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
lpWaveHdr->lpData = (LPSTR) GlobalLock16(hData);
lpWaveHdr->dwUser = 0L;
lpWaveHdr->dwFlags = 0L;
lpWaveHdr->dwLoops = 0L;
dwRet=wodMessage(wDevID,WODM_PREPARE,0,(DWORD)lpWaveHdr,sizeof(WAVEHDR));
while(TRUE) {
count = mmioRead32(MCIWavDev[wDevID].hFile, lpWaveHdr->lpData, bufsize);
TRACE(mciwave,"mmioRead bufsize=%ld count=%ld\n", bufsize, count);
if (count < 1) break;
lpWaveHdr->dwBufferLength = count;
/* lpWaveHdr->dwBytesRecorded = count; */
TRACE(mciwave,"before WODM_WRITE lpWaveHdr=%p dwBufferLength=%lu dwBytesRecorded=%lu\n",
lpWaveHdr, lpWaveHdr->dwBufferLength, lpWaveHdr->dwBytesRecorded);
dwRet=wodMessage(wDevID,WODM_WRITE,0,(DWORD)lpWaveHdr,sizeof(WAVEHDR));
}
dwRet = wodMessage(wDevID,WODM_UNPREPARE,0,(DWORD)lpWaveHdr,sizeof(WAVEHDR));
if (lpWaveHdr->lpData != NULL) {
GlobalUnlock16(hData);
GlobalFree16(hData);
lpWaveHdr->lpData = NULL;
}
if (dwFlags & MCI_NOTIFY) {
TRACE(mciwave,"MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
}
/**************************************************************************
* WAVE_mciRecord [internal]
*/
static DWORD WAVE_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms)
{
int start, end;
LONG bufsize;
HGLOBAL16 hData;
LPWAVEHDR lpWaveHdr;
DWORD dwRet;
TRACE(mciwave, "(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (!MCIWavDev[wDevID].fInput) {
WARN(mciwave, "cannot record on output device\n");
return MCIERR_NONAPPLICABLE_FUNCTION;
}
if (MCIWavDev[wDevID].hFile == 0) {
WARN(mciwave, "can't find file='%08lx' !\n",
MCIWavDev[wDevID].openParms.lpstrElementName);
return MCIERR_FILE_NOT_FOUND;
}
start = 1; end = 99999;
if (dwFlags & MCI_FROM) {
start = lpParms->dwFrom;
TRACE(mciwave, "MCI_FROM=%d \n", start);
}
if (dwFlags & MCI_TO) {
end = lpParms->dwTo;
TRACE(mciwave,"MCI_TO=%d \n", end);
}
bufsize = 64000;
lpWaveHdr = &MCIWavDev[wDevID].WaveHdr;
hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
lpWaveHdr->lpData = (LPSTR)GlobalLock16(hData);
lpWaveHdr->dwBufferLength = bufsize;
lpWaveHdr->dwUser = 0L;
lpWaveHdr->dwFlags = 0L;
lpWaveHdr->dwLoops = 0L;
dwRet=widMessage(wDevID,WIDM_PREPARE,0,(DWORD)lpWaveHdr,sizeof(WAVEHDR));
TRACE(mciwave,"after WIDM_PREPARE \n");
while(TRUE) {
lpWaveHdr->dwBytesRecorded = 0;
dwRet = widMessage(wDevID, WIDM_START, 0, 0L, 0L);
TRACE(mciwave, "after WIDM_START lpWaveHdr=%p dwBytesRecorded=%lu\n",
lpWaveHdr, lpWaveHdr->dwBytesRecorded);
if (lpWaveHdr->dwBytesRecorded == 0) break;
}
TRACE(mciwave,"before WIDM_UNPREPARE \n");
dwRet = widMessage(wDevID,WIDM_UNPREPARE,0,(DWORD)lpWaveHdr,sizeof(WAVEHDR));
TRACE(mciwave,"after WIDM_UNPREPARE \n");
if (lpWaveHdr->lpData != NULL) {
GlobalUnlock16(hData);
GlobalFree16(hData);
lpWaveHdr->lpData = NULL;
}
if (dwFlags & MCI_NOTIFY) {
TRACE(mciwave,"MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
}
/**************************************************************************
* WAVE_mciStop [internal]
*/
static DWORD WAVE_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
DWORD dwRet;
TRACE(mciwave, "(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (MCIWavDev[wDevID].fInput)
dwRet = widMessage(wDevID, WIDM_STOP, 0, dwFlags, (DWORD)lpParms);
else
dwRet = wodMessage(wDevID, WODM_STOP, 0, dwFlags, (DWORD)lpParms);
return dwRet;
}
/**************************************************************************
* WAVE_mciPause [internal]
*/
static DWORD WAVE_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
DWORD dwRet;
TRACE(mciwave, "(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (MCIWavDev[wDevID].fInput)
dwRet = widMessage(wDevID, WIDM_PAUSE, 0, dwFlags, (DWORD)lpParms);
else
dwRet = wodMessage(wDevID, WODM_PAUSE, 0, dwFlags, (DWORD)lpParms);
return dwRet;
}
/**************************************************************************
* WAVE_mciResume [internal]
*/
static DWORD WAVE_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
TRACE(mciwave, "(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
return 0;
}
/**************************************************************************
* WAVE_mciSet [internal]
*/
static DWORD WAVE_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
{
TRACE(mciwave, "(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
TRACE(mciwave, "dwTimeFormat=%08lX\n", lpParms->dwTimeFormat);
TRACE(mciwave, "dwAudio=%08lX\n", lpParms->dwAudio);
if (dwFlags & MCI_SET_TIME_FORMAT) {
switch (lpParms->dwTimeFormat) {
case MCI_FORMAT_MILLISECONDS:
TRACE(mciwave, "MCI_FORMAT_MILLISECONDS !\n");
break;
case MCI_FORMAT_BYTES:
TRACE(mciwave, "MCI_FORMAT_BYTES !\n");
break;
case MCI_FORMAT_SAMPLES:
TRACE(mciwave, "MCI_FORMAT_SAMPLES !\n");
break;
default:
WARN(mciwave, "bad time format !\n");
return MCIERR_BAD_TIME_FORMAT;
}
}
if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION;
if (dwFlags & MCI_SET_DOOR_OPEN) return MCIERR_UNSUPPORTED_FUNCTION;
if (dwFlags & MCI_SET_DOOR_CLOSED) return MCIERR_UNSUPPORTED_FUNCTION;
if (dwFlags & MCI_SET_AUDIO)
TRACE(mciwave,"MCI_SET_AUDIO !\n");
if (dwFlags && MCI_SET_ON) {
TRACE(mciwave,"MCI_SET_ON !\n");
if (dwFlags && MCI_SET_AUDIO_LEFT)
TRACE(mciwave,"MCI_SET_AUDIO_LEFT !\n");
if (dwFlags && MCI_SET_AUDIO_RIGHT)
TRACE(mciwave,"MCI_SET_AUDIO_RIGHT !\n");
}
if (dwFlags & MCI_SET_OFF)
TRACE(mciwave,"MCI_SET_OFF !\n");
if (dwFlags & MCI_WAVE_INPUT)
TRACE(mciwave,"MCI_WAVE_INPUT !\n");
if (dwFlags & MCI_WAVE_OUTPUT)
TRACE(mciwave,"MCI_WAVE_OUTPUT !\n");
if (dwFlags & MCI_WAVE_SET_ANYINPUT)
TRACE(mciwave,"MCI_WAVE_SET_ANYINPUT !\n");
if (dwFlags & MCI_WAVE_SET_ANYOUTPUT)
TRACE(mciwave,"MCI_WAVE_SET_ANYOUTPUT !\n");
if (dwFlags & MCI_WAVE_SET_AVGBYTESPERSEC)
TRACE(mciwave, "MCI_WAVE_SET_AVGBYTESPERSEC !\n");
if (dwFlags & MCI_WAVE_SET_BITSPERSAMPLE)
TRACE(mciwave, "MCI_WAVE_SET_BITSPERSAMPLE !\n");
if (dwFlags & MCI_WAVE_SET_BLOCKALIGN)
TRACE(mciwave,"MCI_WAVE_SET_BLOCKALIGN !\n");
if (dwFlags & MCI_WAVE_SET_CHANNELS)
TRACE(mciwave,"MCI_WAVE_SET_CHANNELS !\n");
if (dwFlags & MCI_WAVE_SET_FORMATTAG)
TRACE(mciwave,"MCI_WAVE_SET_FORMATTAG !\n");
if (dwFlags & MCI_WAVE_SET_SAMPLESPERSEC)
TRACE(mciwave, "MCI_WAVE_SET_SAMPLESPERSEC !\n");
return 0;
}
/**************************************************************************
* WAVE_mciStatus [internal]
*/
static DWORD WAVE_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
{
TRACE(mciwave, "(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (dwFlags & MCI_STATUS_ITEM) {
switch(lpParms->dwItem) {
case MCI_STATUS_CURRENT_TRACK:
lpParms->dwReturn = 1;
break;
case MCI_STATUS_LENGTH:
lpParms->dwReturn = 5555;
if (dwFlags & MCI_TRACK) {
lpParms->dwTrack = 1;
lpParms->dwReturn = 2222;
}
break;
case MCI_STATUS_MODE:
lpParms->dwReturn = MCI_MODE_STOP;
break;
case MCI_STATUS_MEDIA_PRESENT:
TRACE(mciwave,"MCI_STATUS_MEDIA_PRESENT !\n");
lpParms->dwReturn = TRUE;
break;
case MCI_STATUS_NUMBER_OF_TRACKS:
lpParms->dwReturn = 1;
break;
case MCI_STATUS_POSITION:
lpParms->dwReturn = 3333;
if (dwFlags & MCI_STATUS_START)
lpParms->dwItem = 1;
if (dwFlags & MCI_TRACK) {
lpParms->dwTrack = 1;
lpParms->dwReturn = 777;
}
break;
case MCI_STATUS_READY:
TRACE(mciwave,"MCI_STATUS_READY !\n");
lpParms->dwReturn = TRUE;
break;
case MCI_STATUS_TIME_FORMAT:
TRACE(mciwave,"MCI_STATUS_TIME_FORMAT !\n");
lpParms->dwReturn = MCI_FORMAT_MILLISECONDS;
break;
case MCI_WAVE_INPUT:
TRACE(mciwave,"MCI_WAVE_INPUT !\n");
lpParms->dwReturn = 0;
break;
case MCI_WAVE_OUTPUT:
TRACE(mciwave,"MCI_WAVE_OUTPUT !\n");
lpParms->dwReturn = 0;
break;
case MCI_WAVE_STATUS_AVGBYTESPERSEC:
TRACE(mciwave,"MCI_WAVE_STATUS_AVGBYTESPERSEC !\n");
lpParms->dwReturn = 22050;
break;
case MCI_WAVE_STATUS_BITSPERSAMPLE:
TRACE(mciwave,"MCI_WAVE_STATUS_BITSPERSAMPLE !\n");
lpParms->dwReturn = 8;
break;
case MCI_WAVE_STATUS_BLOCKALIGN:
TRACE(mciwave,"MCI_WAVE_STATUS_BLOCKALIGN !\n");
lpParms->dwReturn = 1;
break;
case MCI_WAVE_STATUS_CHANNELS:
TRACE(mciwave,"MCI_WAVE_STATUS_CHANNELS !\n");
lpParms->dwReturn = 1;
break;
case MCI_WAVE_STATUS_FORMATTAG:
TRACE(mciwave,"MCI_WAVE_FORMATTAG !\n");
lpParms->dwReturn = WAVE_FORMAT_PCM;
break;
case MCI_WAVE_STATUS_LEVEL:
TRACE(mciwave,"MCI_WAVE_STATUS_LEVEL !\n");
lpParms->dwReturn = 0xAAAA5555;
break;
case MCI_WAVE_STATUS_SAMPLESPERSEC:
TRACE(mciwave,"MCI_WAVE_STATUS_SAMPLESPERSEC !\n");
lpParms->dwReturn = 22050;
break;
default:
WARN(mciwave,"unknown command %08lX !\n", lpParms->dwItem);
return MCIERR_UNRECOGNIZED_COMMAND;
}
}
if (dwFlags & MCI_NOTIFY) {
TRACE(mciwave,"MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
}
/**************************************************************************
* WAVE_mciGetDevCaps [internal]
*/
static DWORD WAVE_mciGetDevCaps(UINT16 wDevID, DWORD dwFlags,
LPMCI_GETDEVCAPS_PARMS lpParms)
{
TRACE(mciwave, "(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (dwFlags & MCI_GETDEVCAPS_ITEM) {
switch(lpParms->dwItem) {
case MCI_GETDEVCAPS_CAN_RECORD:
lpParms->dwReturn = TRUE;
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_WAVEFORM_AUDIO;
break;
case MCI_GETDEVCAPS_USES_FILES:
lpParms->dwReturn = TRUE;
break;
case MCI_GETDEVCAPS_COMPOUND_DEVICE:
lpParms->dwReturn = TRUE;
break;
case MCI_GETDEVCAPS_CAN_EJECT:
lpParms->dwReturn = FALSE;
break;
case MCI_GETDEVCAPS_CAN_PLAY:
lpParms->dwReturn = TRUE;
break;
case MCI_GETDEVCAPS_CAN_SAVE:
lpParms->dwReturn = TRUE;
break;
case MCI_WAVE_GETDEVCAPS_INPUTS:
lpParms->dwReturn = 1;
break;
case MCI_WAVE_GETDEVCAPS_OUTPUTS:
lpParms->dwReturn = 1;
break;
default:
return MCIERR_UNRECOGNIZED_COMMAND;
}
}
return 0;
}
/**************************************************************************
* WAVE_mciInfo [internal]
*/
static DWORD WAVE_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS16 lpParms)
{
TRACE(mciwave, "(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
lpParms->lpstrReturn = NULL;
switch(dwFlags) {
case MCI_INFO_PRODUCT:
lpParms->lpstrReturn = "Open Sound System 0.5";
break;
case MCI_INFO_FILE:
lpParms->lpstrReturn =
(LPSTR)MCIWavDev[wDevID].openParms.lpstrElementName;
break;
case MCI_WAVE_INPUT:
lpParms->lpstrReturn = "Open Sound System 0.5";
break;
case MCI_WAVE_OUTPUT:
lpParms->lpstrReturn = "Open Sound System 0.5";
break;
default:
return MCIERR_UNRECOGNIZED_COMMAND;
}
if (lpParms->lpstrReturn != NULL)
lpParms->dwRetSize = strlen(lpParms->lpstrReturn);
else
lpParms->dwRetSize = 0;
return 0;
}
/*-----------------------------------------------------------------------*/
/**************************************************************************
* wodGetDevCaps [internal]
*/
......@@ -764,7 +138,7 @@ static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPS16 lpCaps, DWORD dwSize)
int dsp_stereo = 1;
int bytespersmpl;
TRACE(mciwave, "(%u, %p, %lu);\n", wDevID, lpCaps, dwSize);
TRACE(wave, "(%u, %p, %lu);\n", wDevID, lpCaps, dwSize);
if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
if (access(SOUND_DEV,0) != 0) return MMSYSERR_NOTENABLED;
audio = open (SOUND_DEV, O_WRONLY, 0);
......@@ -822,7 +196,7 @@ static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPS16 lpCaps, DWORD dwSize)
}
}
close(audio);
TRACE(mciwave, "dwFormats = %08lX\n", lpCaps->dwFormats);
TRACE(wave, "dwFormats = %08lX\n", lpCaps->dwFormats);
return MMSYSERR_NOERROR;
}
......@@ -835,43 +209,43 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
int audio,abuf_size,smplrate,samplesize,dsp_stereo;
LPWAVEFORMAT lpFormat;
TRACE(mciwave, "(%u, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
TRACE(wave, "(%u, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
if (lpDesc == NULL) {
WARN(mciwave, "Invalid Parameter !\n");
WARN(wave, "Invalid Parameter !\n");
return MMSYSERR_INVALPARAM;
}
if (wDevID >= MAX_WAVOUTDRV) {
TRACE(mciwave,"MAX_WAVOUTDRV reached !\n");
if (wDevID >= MAX_WAVEOUTDRV) {
TRACE(wave,"MAX_WAVOUTDRV reached !\n");
return MMSYSERR_ALLOCATED;
}
WOutDev[wDevID].unixdev = 0;
if (access(SOUND_DEV,0) != 0) return MMSYSERR_NOTENABLED;
audio = open (SOUND_DEV, O_WRONLY, 0);
if (audio == -1) {
WARN(mciwave, "can't open !\n");
WARN(wave, "can't open !\n");
return MMSYSERR_ALLOCATED ;
}
IOCTL(audio, SNDCTL_DSP_GETBLKSIZE, abuf_size);
if (abuf_size < 1024 || abuf_size > 65536) {
if (abuf_size == -1)
WARN(mciwave, "IOCTL can't 'SNDCTL_DSP_GETBLKSIZE' !\n");
WARN(wave, "IOCTL can't 'SNDCTL_DSP_GETBLKSIZE' !\n");
else
WARN(mciwave, "SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n");
WARN(wave, "SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n");
return MMSYSERR_NOTENABLED;
}
WOutDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(WOutDev[wDevID].wFlags) {
case DCB_NULL:
TRACE(mciwave, "CALLBACK_NULL !\n");
TRACE(wave, "CALLBACK_NULL !\n");
break;
case DCB_WINDOW:
TRACE(mciwave, "CALLBACK_WINDOW !\n");
TRACE(wave, "CALLBACK_WINDOW !\n");
break;
case DCB_TASK:
TRACE(mciwave, "CALLBACK_TASK !\n");
TRACE(wave, "CALLBACK_TASK !\n");
break;
case DCB_FUNCTION:
TRACE(mciwave, "CALLBACK_FUNCTION !\n");
TRACE(wave, "CALLBACK_FUNCTION !\n");
break;
}
WOutDev[wDevID].lpQueueHdr = NULL;
......@@ -880,23 +254,19 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
WOutDev[wDevID].bufsize = abuf_size;
/* FIXME: copy lpFormat too? */
memcpy(&WOutDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
TRACE(mciwave,"lpDesc->lpFormat = %p\n",lpDesc->lpFormat);
TRACE(wave,"lpDesc->lpFormat = %p\n",lpDesc->lpFormat);
lpFormat = lpDesc->lpFormat;
TRACE(mciwave,"lpFormat = %p\n",lpFormat);
TRACE(wave,"lpFormat = %p\n",lpFormat);
if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
WARN(mciwave,"Bad format %04X !\n",
lpFormat->wFormatTag);
WARN(mciwave,"Bad nChannels %d !\n",
lpFormat->nChannels);
WARN(mciwave,"Bad nSamplesPerSec %ld !\n",
lpFormat->nSamplesPerSec);
WARN(wave,"Bad format %04X !\n", lpFormat->wFormatTag);
WARN(wave,"Bad nChannels %d !\n", lpFormat->nChannels);
WARN(wave,"Bad nSamplesPerSec %ld !\n", lpFormat->nSamplesPerSec);
return WAVERR_BADFORMAT;
}
memcpy(&WOutDev[wDevID].Format, lpFormat, sizeof(PCMWAVEFORMAT));
if (WOutDev[wDevID].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
if (WOutDev[wDevID].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
TRACE(mciwave,"wBitsPerSample=%u !\n",
WOutDev[wDevID].Format.wBitsPerSample);
TRACE(wave,"wBitsPerSample=%u !\n", WOutDev[wDevID].Format.wBitsPerSample);
if (WOutDev[wDevID].Format.wBitsPerSample == 0) {
WOutDev[wDevID].Format.wBitsPerSample = 8 *
(WOutDev[wDevID].Format.wf.nAvgBytesPerSec /
......@@ -912,16 +282,12 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo);
IOCTL(audio, SNDCTL_DSP_SPEED, smplrate);
TRACE(mciwave,"wBitsPerSample=%u !\n",
WOutDev[wDevID].Format.wBitsPerSample);
TRACE(mciwave,"nAvgBytesPerSec=%lu !\n",
WOutDev[wDevID].Format.wf.nAvgBytesPerSec);
TRACE(mciwave,"nSamplesPerSec=%lu !\n",
WOutDev[wDevID].Format.wf.nSamplesPerSec);
TRACE(mciwave,"nChannels=%u !\n",
WOutDev[wDevID].Format.wf.nChannels);
TRACE(wave,"wBitsPerSample=%u !\n", WOutDev[wDevID].Format.wBitsPerSample);
TRACE(wave,"nAvgBytesPerSec=%lu !\n", WOutDev[wDevID].Format.wf.nAvgBytesPerSec);
TRACE(wave,"nSamplesPerSec=%lu !\n", WOutDev[wDevID].Format.wf.nSamplesPerSec);
TRACE(wave,"nChannels=%u !\n", WOutDev[wDevID].Format.wf.nChannels);
if (WAVE_NotifyClient(wDevID, WOM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) {
WARN(mciwave, "can't notify client !\n");
WARN(wave, "can't notify client !\n");
return MMSYSERR_INVALPARAM;
}
return MMSYSERR_NOERROR;
......@@ -932,14 +298,15 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
*/
static DWORD wodClose(WORD wDevID)
{
TRACE(mciwave,"(%u);\n", wDevID);
if (wDevID > MAX_WAVOUTDRV) return MMSYSERR_INVALPARAM;
TRACE(wave,"(%u);\n", wDevID);
if (wDevID > MAX_WAVEOUTDRV) return MMSYSERR_INVALPARAM;
if (WOutDev[wDevID].unixdev == 0) {
WARN(mciwave, "can't close !\n");
WARN(wave, "can't close !\n");
return MMSYSERR_NOTENABLED;
}
if (WOutDev[wDevID].lpQueueHdr != NULL) {
WARN(mciwave, "still buffers open !\n");
WARN(wave, "still buffers open !\n");
/* Don't care. Who needs those buffers anyway */
/*return WAVERR_STILLPLAYING; */
}
......@@ -948,7 +315,7 @@ static DWORD wodClose(WORD wDevID)
WOutDev[wDevID].bufsize = 0;
WOutDev[wDevID].lpQueueHdr = NULL;
if (WAVE_NotifyClient(wDevID, WOM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
WARN(mciwave, "can't notify client !\n");
WARN(wave, "can't notify client !\n");
return MMSYSERR_INVALPARAM;
}
return MMSYSERR_NOERROR;
......@@ -965,9 +332,9 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
LPSTR lpData;
LPWAVEHDR xwavehdr;
TRACE(mciwave,"(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
TRACE(wave,"(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WOutDev[wDevID].unixdev == 0) {
WARN(mciwave, "can't play !\n");
WARN(wave, "can't play !\n");
return MMSYSERR_NOTENABLED;
}
if (lpWaveHdr->lpData == NULL) return WAVERR_UNPREPARED;
......@@ -975,15 +342,13 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
if (lpWaveHdr->dwFlags & WHDR_INQUEUE) return WAVERR_STILLPLAYING;
lpWaveHdr->dwFlags &= ~WHDR_DONE;
lpWaveHdr->dwFlags |= WHDR_INQUEUE;
TRACE(mciwave, "dwBufferLength %lu !\n",
lpWaveHdr->dwBufferLength);
TRACE(mciwave, "WOutDev[%u].unixdev %u !\n",
wDevID, WOutDev[wDevID].unixdev);
TRACE(wave, "dwBufferLength %lu !\n", lpWaveHdr->dwBufferLength);
TRACE(wave, "WOutDev[%u].unixdev %u !\n", wDevID, WOutDev[wDevID].unixdev);
lpData = lpWaveHdr->lpData;
count = write (WOutDev[wDevID].unixdev, lpData, lpWaveHdr->dwBufferLength);
TRACE(mciwave,"write returned count %u !\n",count);
TRACE(wave,"write returned count %u !\n",count);
if (count != lpWaveHdr->dwBufferLength) {
WARN(mciwave, " error writting !\n");
WARN(wave, " error writting !\n");
return MMSYSERR_NOTENABLED;
}
WOutDev[wDevID].dwTotalPlayed += count;
......@@ -995,14 +360,14 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
memcpy(xwavehdr,lpWaveHdr,sizeof(WAVEHDR));
xwavehdr->lpData = (LPBYTE)xwavehdr->reserved;
if (WAVE_NotifyClient(wDevID, WOM_DONE, (DWORD)SEGPTR_GET(xwavehdr), count) != MMSYSERR_NOERROR) {
WARN(mciwave, "can't notify client !\n");
WARN(wave, "can't notify client !\n");
SEGPTR_FREE(xwavehdr);
return MMSYSERR_INVALPARAM;
}
SEGPTR_FREE(xwavehdr);
} else {
if (WAVE_NotifyClient(wDevID, WOM_DONE, (DWORD)lpWaveHdr, count) != MMSYSERR_NOERROR) {
WARN(mciwave, "can't notify client !\n");
WARN(wave, "can't notify client !\n");
return MMSYSERR_INVALPARAM;
}
}
......@@ -1014,9 +379,9 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/
static DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{
TRACE(mciwave, "(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
TRACE(wave, "(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WOutDev[wDevID].unixdev == 0) {
WARN(mciwave, "can't prepare !\n");
WARN(wave, "can't prepare !\n");
return MMSYSERR_NOTENABLED;
}
/* don't append to queue, wodWrite does that */
......@@ -1033,9 +398,9 @@ static DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/
static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{
TRACE(mciwave, "(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
TRACE(wave, "(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WOutDev[wDevID].unixdev == 0) {
WARN(mciwave, "can't unprepare !\n");
WARN(wave, "can't unprepare !\n");
return MMSYSERR_NOTENABLED;
}
if (lpWaveHdr->dwFlags & WHDR_INQUEUE)
......@@ -1043,7 +408,7 @@ static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
lpWaveHdr->dwFlags &= ~WHDR_PREPARED;
lpWaveHdr->dwFlags |= WHDR_DONE;
TRACE(mciwave, "all headers unprepared !\n");
TRACE(wave, "all headers unprepared !\n");
return MMSYSERR_NOERROR;
}
......@@ -1052,15 +417,15 @@ static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/
static DWORD wodRestart(WORD wDevID)
{
TRACE(mciwave,"(%u);\n", wDevID);
TRACE(wave,"(%u);\n", wDevID);
if (WOutDev[wDevID].unixdev == 0) {
WARN(mciwave, "can't restart !\n");
WARN(wave, "can't restart !\n");
return MMSYSERR_NOTENABLED;
}
/* FIXME: is NotifyClient with WOM_DONE right ? (Comet Busters 1.3.3 needs this notification) */
/* FIXME: Myst crashes with this ... hmm -MM
if (WAVE_NotifyClient(wDevID, WOM_DONE, 0L, 0L) != MMSYSERR_NOERROR) {
WARN(mciwave, "can't notify client !\n");
WARN(wave, "can't notify client !\n");
return MMSYSERR_INVALPARAM;
}
*/
......@@ -1073,9 +438,9 @@ static DWORD wodRestart(WORD wDevID)
*/
static DWORD wodReset(WORD wDevID)
{
TRACE(mciwave,"(%u);\n", wDevID);
TRACE(wave,"(%u);\n", wDevID);
if (WOutDev[wDevID].unixdev == 0) {
WARN(mciwave, "can't reset !\n");
WARN(wave, "can't reset !\n");
return MMSYSERR_NOTENABLED;
}
return MMSYSERR_NOERROR;
......@@ -1088,35 +453,28 @@ static DWORD wodReset(WORD wDevID)
static DWORD wodGetPosition(WORD wDevID, LPMMTIME16 lpTime, DWORD uSize)
{
int time;
TRACE(mciwave,"(%u, %p, %lu);\n", wDevID, lpTime, uSize);
TRACE(wave,"(%u, %p, %lu);\n", wDevID, lpTime, uSize);
if (WOutDev[wDevID].unixdev == 0) {
WARN(mciwave, "can't get pos !\n");
WARN(wave, "can't get pos !\n");
return MMSYSERR_NOTENABLED;
}
if (lpTime == NULL) return MMSYSERR_INVALPARAM;
TRACE(mciwave,"wType=%04X !\n",
lpTime->wType);
TRACE(mciwave,"wBitsPerSample=%u\n",
WOutDev[wDevID].Format.wBitsPerSample);
TRACE(mciwave,"nSamplesPerSec=%lu\n",
WOutDev[wDevID].Format.wf.nSamplesPerSec);
TRACE(mciwave,"nChannels=%u\n",
WOutDev[wDevID].Format.wf.nChannels);
TRACE(mciwave,"nAvgBytesPerSec=%lu\n",
WOutDev[wDevID].Format.wf.nAvgBytesPerSec);
TRACE(wave,"wType=%04X !\n", lpTime->wType);
TRACE(wave,"wBitsPerSample=%u\n", WOutDev[wDevID].Format.wBitsPerSample);
TRACE(wave,"nSamplesPerSec=%lu\n", WOutDev[wDevID].Format.wf.nSamplesPerSec);
TRACE(wave,"nChannels=%u\n", WOutDev[wDevID].Format.wf.nChannels);
TRACE(wave,"nAvgBytesPerSec=%lu\n", WOutDev[wDevID].Format.wf.nAvgBytesPerSec);
switch(lpTime->wType) {
case TIME_BYTES:
lpTime->u.cb = WOutDev[wDevID].dwTotalPlayed;
TRACE(mciwave,"TIME_BYTES=%lu\n", lpTime->u.cb);
TRACE(wave,"TIME_BYTES=%lu\n", lpTime->u.cb);
break;
case TIME_SAMPLES:
TRACE(mciwave,"dwTotalPlayed=%lu\n",
WOutDev[wDevID].dwTotalPlayed);
TRACE(mciwave,"wBitsPerSample=%u\n",
WOutDev[wDevID].Format.wBitsPerSample);
TRACE(wave,"dwTotalPlayed=%lu\n", WOutDev[wDevID].dwTotalPlayed);
TRACE(wave,"wBitsPerSample=%u\n", WOutDev[wDevID].Format.wBitsPerSample);
lpTime->u.sample = WOutDev[wDevID].dwTotalPlayed * 8 /
WOutDev[wDevID].Format.wBitsPerSample;
TRACE(mciwave,"TIME_SAMPLES=%lu\n", lpTime->u.sample);
TRACE(wave,"TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
time = WOutDev[wDevID].dwTotalPlayed /
......@@ -1129,18 +487,17 @@ static DWORD wodGetPosition(WORD wDevID, LPMMTIME16 lpTime, DWORD uSize)
time -= lpTime->u.smpte.sec * 30;
lpTime->u.smpte.frame = time;
lpTime->u.smpte.fps = 30;
TRACE(mciwave,
"wodGetPosition // TIME_SMPTE=%02u:%02u:%02u:%02u\n",
TRACE(wave, "wodGetPosition // TIME_SMPTE=%02u:%02u:%02u:%02u\n",
lpTime->u.smpte.hour, lpTime->u.smpte.min,
lpTime->u.smpte.sec, lpTime->u.smpte.frame);
break;
default:
FIXME(mciwave, "wodGetPosition() format %d not supported ! use TIME_MS !\n",lpTime->wType);
FIXME(wave, "wodGetPosition() format %d not supported ! use TIME_MS !\n",lpTime->wType);
lpTime->wType = TIME_MS;
case TIME_MS:
lpTime->u.ms = WOutDev[wDevID].dwTotalPlayed /
(WOutDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
TRACE(mciwave,"wodGetPosition // TIME_MS=%lu\n", lpTime->u.ms);
TRACE(wave,"wodGetPosition // TIME_MS=%lu\n", lpTime->u.ms);
break;
}
return MMSYSERR_NOERROR;
......@@ -1153,20 +510,20 @@ static DWORD wodGetVolume(WORD wDevID, LPDWORD lpdwVol)
{
int mixer;
int volume, left, right;
TRACE(mciwave,"(%u, %p);\n", wDevID, lpdwVol);
TRACE(wave,"(%u, %p);\n", wDevID, lpdwVol);
if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
if ((mixer = open(MIXER_DEV, O_RDONLY)) < 0) {
WARN(mciwave, "mixer device not available !\n");
WARN(wave, "mixer device not available !\n");
return MMSYSERR_NOTENABLED;
}
if (ioctl(mixer, SOUND_MIXER_READ_PCM, &volume) == -1) {
WARN(mciwave, "unable read mixer !\n");
WARN(wave, "unable read mixer !\n");
return MMSYSERR_NOTENABLED;
}
close(mixer);
left = volume & 0x7F;
right = (volume >> 8) & 0x7F;
TRACE(mciwave,"left=%d right=%d !\n", left, right);
TRACE(wave,"left=%d right=%d !\n", left, right);
*lpdwVol = MAKELONG(left << 9, right << 9);
return MMSYSERR_NOERROR;
}
......@@ -1179,15 +536,15 @@ static DWORD wodSetVolume(WORD wDevID, DWORD dwParam)
{
int mixer;
int volume;
TRACE(mciwave,"(%u, %08lX);\n", wDevID, dwParam);
TRACE(wave,"(%u, %08lX);\n", wDevID, dwParam);
volume = (LOWORD(dwParam) >> 9 & 0x7F) +
((HIWORD(dwParam) >> 9 & 0x7F) << 8);
if ((mixer = open(MIXER_DEV, O_WRONLY)) < 0) {
WARN(mciwave, "mixer device not available !\n");
WARN(wave, "mixer device not available !\n");
return MMSYSERR_NOTENABLED;
}
if (ioctl(mixer, SOUND_MIXER_WRITE_PCM, &volume) == -1) {
WARN(mciwave, "unable set mixer !\n");
WARN(wave, "unable set mixer !\n");
return MMSYSERR_NOTENABLED;
}
close(mixer);
......@@ -1201,7 +558,7 @@ DWORD WINAPI wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
DWORD dwParam1, DWORD dwParam2)
{
int audio;
TRACE(mciwave,"wodMessage(%u, %04X, %08lX, %08lX, %08lX);\n",
TRACE(wave,"wodMessage(%u, %04X, %08lX, %08lX, %08lX);\n",
wDevID, wMsg, dwUser, dwParam1, dwParam2);
switch(wMsg) {
case WODM_OPEN:
......@@ -1253,7 +610,7 @@ DWORD WINAPI wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
case WODM_RESET:
return wodReset(wDevID);
default:
WARN(mciwave,"unknown message !\n");
WARN(wave,"unknown message !\n");
}
return MMSYSERR_NOTSUPPORTED;
}
......@@ -1268,7 +625,7 @@ static DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPS16 lpCaps, DWORD dwSize)
{
int audio,smplrate,samplesize=16,dsp_stereo=1,bytespersmpl;
TRACE(mciwave, "(%u, %p, %lu);\n", wDevID, lpCaps, dwSize);
TRACE(wave, "(%u, %p, %lu);\n", wDevID, lpCaps, dwSize);
if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
if (access(SOUND_DEV,0) != 0) return MMSYSERR_NOTENABLED;
audio = open (SOUND_DEV, O_RDONLY, 0);
......@@ -1319,7 +676,7 @@ static DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPS16 lpCaps, DWORD dwSize)
}
}
close(audio);
TRACE(mciwave, "dwFormats = %08lX\n", lpCaps->dwFormats);
TRACE(wave, "dwFormats = %08lX\n", lpCaps->dwFormats);
return MMSYSERR_NOERROR;
}
......@@ -1332,43 +689,43 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
int audio,abuf_size,smplrate,samplesize,dsp_stereo;
LPWAVEFORMAT lpFormat;
TRACE(mciwave, "(%u, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
TRACE(wave, "(%u, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
if (lpDesc == NULL) {
WARN(mciwave, "Invalid Parameter !\n");
WARN(wave, "Invalid Parameter !\n");
return MMSYSERR_INVALPARAM;
}
if (wDevID >= MAX_WAVINDRV) {
TRACE(mciwave,"MAX_WAVINDRV reached !\n");
if (wDevID >= MAX_WAVEINDRV) {
TRACE(wave,"MAX_WAVINDRV reached !\n");
return MMSYSERR_ALLOCATED;
}
WInDev[wDevID].unixdev = 0;
if (access(SOUND_DEV,0) != 0) return MMSYSERR_NOTENABLED;
audio = open (SOUND_DEV, O_RDONLY, 0);
if (audio == -1) {
WARN(mciwave,"can't open !\n");
WARN(wave,"can't open !\n");
return MMSYSERR_ALLOCATED;
}
IOCTL(audio, SNDCTL_DSP_GETBLKSIZE, abuf_size);
if (abuf_size < 1024 || abuf_size > 65536) {
if (abuf_size == -1)
WARN(mciwave, "IOCTL can't 'SNDCTL_DSP_GETBLKSIZE' !\n");
WARN(wave, "IOCTL can't 'SNDCTL_DSP_GETBLKSIZE' !\n");
else
WARN(mciwave, "SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n");
WARN(wave, "SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n");
return MMSYSERR_NOTENABLED;
}
WInDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(WInDev[wDevID].wFlags) {
case DCB_NULL:
TRACE(mciwave,"CALLBACK_NULL!\n");
TRACE(wave,"CALLBACK_NULL!\n");
break;
case DCB_WINDOW:
TRACE(mciwave,"CALLBACK_WINDOW!\n");
TRACE(wave,"CALLBACK_WINDOW!\n");
break;
case DCB_TASK:
TRACE(mciwave,"CALLBACK_TASK!\n");
TRACE(wave,"CALLBACK_TASK!\n");
break;
case DCB_FUNCTION:
TRACE(mciwave,"CALLBACK_FUNCTION!\n");
TRACE(wave,"CALLBACK_FUNCTION!\n");
break;
}
if (WInDev[wDevID].lpQueueHdr) {
......@@ -1381,7 +738,7 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
memcpy(&WInDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
lpFormat = (LPWAVEFORMAT) lpDesc->lpFormat;
if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
WARN(mciwave, "Bad format %04X !\n",
WARN(wave, "Bad format %04X !\n",
lpFormat->wFormatTag);
return WAVERR_BADFORMAT;
}
......@@ -1401,16 +758,12 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
IOCTL(audio, SNDCTL_DSP_SPEED, smplrate);
IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize);
IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo);
TRACE(mciwave,"wBitsPerSample=%u !\n",
WInDev[wDevID].Format.wBitsPerSample);
TRACE(mciwave,"nSamplesPerSec=%lu !\n",
WInDev[wDevID].Format.wf.nSamplesPerSec);
TRACE(mciwave,"nChannels=%u !\n",
WInDev[wDevID].Format.wf.nChannels);
TRACE(mciwave,"nAvgBytesPerSec=%lu\n",
WInDev[wDevID].Format.wf.nAvgBytesPerSec);
TRACE(wave,"wBitsPerSample=%u !\n", WInDev[wDevID].Format.wBitsPerSample);
TRACE(wave,"nSamplesPerSec=%lu !\n", WInDev[wDevID].Format.wf.nSamplesPerSec);
TRACE(wave,"nChannels=%u !\n", WInDev[wDevID].Format.wf.nChannels);
TRACE(wave,"nAvgBytesPerSec=%lu\n", WInDev[wDevID].Format.wf.nAvgBytesPerSec);
if (WAVE_NotifyClient(wDevID, WIM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) {
WARN(mciwave,"can't notify client !\n");
WARN(wave,"can't notify client !\n");
return MMSYSERR_INVALPARAM;
}
return MMSYSERR_NOERROR;
......@@ -1421,21 +774,21 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
*/
static DWORD widClose(WORD wDevID)
{
TRACE(mciwave,"(%u);\n", wDevID);
if (wDevID > MAX_WAVINDRV) return MMSYSERR_INVALPARAM;
TRACE(wave,"(%u);\n", wDevID);
if (wDevID > MAX_WAVEINDRV) return MMSYSERR_INVALPARAM;
if (WInDev[wDevID].unixdev == 0) {
WARN(mciwave,"can't close !\n");
WARN(wave,"can't close !\n");
return MMSYSERR_NOTENABLED;
}
if (WInDev[wDevID].lpQueueHdr != NULL) {
WARN(mciwave, "still buffers open !\n");
WARN(wave, "still buffers open !\n");
return WAVERR_STILLPLAYING;
}
close(WInDev[wDevID].unixdev);
WInDev[wDevID].unixdev = 0;
WInDev[wDevID].bufsize = 0;
if (WAVE_NotifyClient(wDevID, WIM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
WARN(mciwave,"can't notify client !\n");
WARN(wave,"can't notify client !\n");
return MMSYSERR_INVALPARAM;
}
return MMSYSERR_NOERROR;
......@@ -1449,17 +802,17 @@ static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
int count = 1;
LPWAVEHDR lpWIHdr;
TRACE(mciwave, "(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
TRACE(wave, "(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WInDev[wDevID].unixdev == 0) {
WARN(mciwave,"can't do it !\n");
WARN(wave,"can't do it !\n");
return MMSYSERR_NOTENABLED;
}
if (!(lpWaveHdr->dwFlags & WHDR_PREPARED)) {
TRACE(mciwave, "never been prepared !\n");
TRACE(wave, "never been prepared !\n");
return WAVERR_UNPREPARED;
}
if (lpWaveHdr->dwFlags & WHDR_INQUEUE) {
TRACE(mciwave, "header already in use !\n");
TRACE(wave, "header already in use !\n");
return WAVERR_STILLPLAYING;
}
lpWaveHdr->dwFlags |= WHDR_PREPARED;
......@@ -1478,7 +831,7 @@ static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
lpWaveHdr->lpNext = NULL;
count++;
}
TRACE(mciwave, "buffer added ! (now %u in queue)\n", count);
TRACE(wave, "buffer added ! (now %u in queue)\n", count);
return MMSYSERR_NOERROR;
}
......@@ -1487,9 +840,9 @@ static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/
static DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{
TRACE(mciwave, "(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
TRACE(wave, "(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WInDev[wDevID].unixdev == 0) {
WARN(mciwave,"can't prepare !\n");
WARN(wave,"can't prepare !\n");
return MMSYSERR_NOTENABLED;
}
if (lpWaveHdr->dwFlags & WHDR_INQUEUE)
......@@ -1498,7 +851,7 @@ static DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
lpWaveHdr->dwFlags &= ~WHDR_DONE;
lpWaveHdr->dwBytesRecorded = 0;
TRACE(mciwave,"header prepared !\n");
TRACE(wave,"header prepared !\n");
return MMSYSERR_NOERROR;
}
......@@ -1507,16 +860,16 @@ static DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/
static DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{
TRACE(mciwave, "(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
TRACE(wave, "(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WInDev[wDevID].unixdev == 0) {
WARN(mciwave,"can't unprepare !\n");
WARN(wave,"can't unprepare !\n");
return MMSYSERR_NOTENABLED;
}
lpWaveHdr->dwFlags &= ~WHDR_PREPARED;
lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
lpWaveHdr->dwFlags |= WHDR_DONE;
TRACE(mciwave, "all headers unprepared !\n");
TRACE(wave, "all headers unprepared !\n");
return MMSYSERR_NOERROR;
}
......@@ -1530,22 +883,22 @@ static DWORD widStart(WORD wDevID)
LPWAVEHDR lpWIHdr;
LPWAVEHDR *lpWaveHdr;
TRACE(mciwave,"(%u);\n", wDevID);
TRACE(wave,"(%u);\n", wDevID);
if (WInDev[wDevID].unixdev == 0) {
WARN(mciwave, "can't start recording !\n");
WARN(wave, "can't start recording !\n");
return MMSYSERR_NOTENABLED;
}
lpWaveHdr = &(WInDev[wDevID].lpQueueHdr);
TRACE(mciwave,"lpWaveHdr = %08lx\n",(DWORD)lpWaveHdr);
TRACE(wave,"lpWaveHdr = %08lx\n",(DWORD)lpWaveHdr);
if (!*lpWaveHdr || !(*lpWaveHdr)->lpData) {
TRACE(mciwave,"never been prepared !\n");
TRACE(wave,"never been prepared !\n");
return WAVERR_UNPREPARED;
}
while(*lpWaveHdr != NULL) {
lpWIHdr = *lpWaveHdr;
TRACE(mciwave, "recording buf#%u=%p size=%lu \n",
TRACE(wave, "recording buf#%u=%p size=%lu \n",
count, lpWIHdr->lpData, lpWIHdr->dwBufferLength);
fflush(stddeb);
bytesRead = read (WInDev[wDevID].unixdev,
......@@ -1553,8 +906,7 @@ static DWORD widStart(WORD wDevID)
lpWIHdr->dwBufferLength);
if (bytesRead==-1)
perror("read from audio device");
TRACE(mciwave,"bytesread=%d (%ld)\n",
bytesRead,lpWIHdr->dwBufferLength);
TRACE(wave,"bytesread=%d (%ld)\n", bytesRead, lpWIHdr->dwBufferLength);
lpWIHdr->dwBytesRecorded = bytesRead;
WInDev[wDevID].dwTotalRecorded += lpWIHdr->dwBytesRecorded;
lpWIHdr->dwFlags &= ~WHDR_INQUEUE;
......@@ -1562,14 +914,14 @@ static DWORD widStart(WORD wDevID)
/* FIXME: should pass segmented pointer here, do we need that?*/
if (WAVE_NotifyClient(wDevID, WIM_DATA, (DWORD)lpWaveHdr, lpWIHdr->dwBytesRecorded) != MMSYSERR_NOERROR) {
WARN(mciwave, "can't notify client !\n");
WARN(wave, "can't notify client !\n");
return MMSYSERR_INVALPARAM;
}
/* removes the current block from the queue */
*lpWaveHdr = lpWIHdr->lpNext;
count++;
}
TRACE(mciwave,"end of recording !\n");
TRACE(wave,"end of recording !\n");
fflush(stddeb);
return MMSYSERR_NOERROR;
}
......@@ -1579,9 +931,9 @@ static DWORD widStart(WORD wDevID)
*/
static DWORD widStop(WORD wDevID)
{
TRACE(mciwave,"(%u);\n", wDevID);
TRACE(wave,"(%u);\n", wDevID);
if (WInDev[wDevID].unixdev == 0) {
WARN(mciwave,"can't stop !\n");
WARN(wave,"can't stop !\n");
return MMSYSERR_NOTENABLED;
}
return MMSYSERR_NOERROR;
......@@ -1592,9 +944,9 @@ static DWORD widStop(WORD wDevID)
*/
static DWORD widReset(WORD wDevID)
{
TRACE(mciwave,"(%u);\n", wDevID);
TRACE(wave,"(%u);\n", wDevID);
if (WInDev[wDevID].unixdev == 0) {
WARN(mciwave,"can't reset !\n");
WARN(wave,"can't reset !\n");
return MMSYSERR_NOTENABLED;
}
return MMSYSERR_NOERROR;
......@@ -1607,32 +959,27 @@ static DWORD widGetPosition(WORD wDevID, LPMMTIME16 lpTime, DWORD uSize)
{
int time;
TRACE(mciwave, "(%u, %p, %lu);\n", wDevID, lpTime, uSize);
TRACE(wave, "(%u, %p, %lu);\n", wDevID, lpTime, uSize);
if (WInDev[wDevID].unixdev == 0) {
WARN(mciwave,"can't get pos !\n");
WARN(wave,"can't get pos !\n");
return MMSYSERR_NOTENABLED;
}
if (lpTime == NULL) return MMSYSERR_INVALPARAM;
TRACE(mciwave,"wType=%04X !\n",
lpTime->wType);
TRACE(mciwave,"wBitsPerSample=%u\n",
WInDev[wDevID].Format.wBitsPerSample);
TRACE(mciwave,"nSamplesPerSec=%lu\n",
WInDev[wDevID].Format.wf.nSamplesPerSec);
TRACE(mciwave,"nChannels=%u\n",
WInDev[wDevID].Format.wf.nChannels);
TRACE(mciwave,"nAvgBytesPerSec=%lu\n",
WInDev[wDevID].Format.wf.nAvgBytesPerSec);
TRACE(wave,"wType=%04X !\n", lpTime->wType);
TRACE(wave,"wBitsPerSample=%u\n", WInDev[wDevID].Format.wBitsPerSample);
TRACE(wave,"nSamplesPerSec=%lu\n", WInDev[wDevID].Format.wf.nSamplesPerSec);
TRACE(wave,"nChannels=%u\n", WInDev[wDevID].Format.wf.nChannels);
TRACE(wave,"nAvgBytesPerSec=%lu\n", WInDev[wDevID].Format.wf.nAvgBytesPerSec);
fflush(stddeb);
switch(lpTime->wType) {
case TIME_BYTES:
lpTime->u.cb = WInDev[wDevID].dwTotalRecorded;
TRACE(mciwave,"TIME_BYTES=%lu\n", lpTime->u.cb);
TRACE(wave,"TIME_BYTES=%lu\n", lpTime->u.cb);
break;
case TIME_SAMPLES:
lpTime->u.sample = WInDev[wDevID].dwTotalRecorded * 8 /
WInDev[wDevID].Format.wBitsPerSample;
TRACE(mciwave, "TIME_SAMPLES=%lu\n", lpTime->u.sample);
TRACE(wave, "TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
time = WInDev[wDevID].dwTotalRecorded /
......@@ -1645,18 +992,18 @@ static DWORD widGetPosition(WORD wDevID, LPMMTIME16 lpTime, DWORD uSize)
time -= lpTime->u.smpte.sec * 30;
lpTime->u.smpte.frame = time;
lpTime->u.smpte.fps = 30;
TRACE(mciwave,"TIME_SMPTE=%02u:%02u:%02u:%02u\n",
TRACE(wave,"TIME_SMPTE=%02u:%02u:%02u:%02u\n",
lpTime->u.smpte.hour, lpTime->u.smpte.min,
lpTime->u.smpte.sec, lpTime->u.smpte.frame);
break;
default:
FIXME(mciwave, "format not supported ! use TIME_MS !\n");
lpTime->wType = TIME_MS;
case TIME_MS:
lpTime->u.ms = WInDev[wDevID].dwTotalRecorded /
(WInDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
TRACE(mciwave, "TIME_MS=%lu\n", lpTime->u.ms);
TRACE(wave, "TIME_MS=%lu\n", lpTime->u.ms);
break;
default:
FIXME(wave, "format not supported ! use TIME_MS !\n");
lpTime->wType = TIME_MS;
}
return MMSYSERR_NOERROR;
}
......@@ -1668,7 +1015,7 @@ DWORD WINAPI widMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
DWORD dwParam1, DWORD dwParam2)
{
int audio;
TRACE(mciwave,"widMessage(%u, %04X, %08lX, %08lX, %08lX);\n",
TRACE(wave,"widMessage(%u, %04X, %08lX, %08lX, %08lX);\n",
wDevID, wMsg, dwUser, dwParam1, dwParam2);
switch(wMsg) {
case WIDM_OPEN:
......@@ -1706,7 +1053,7 @@ DWORD WINAPI widMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
case WIDM_STOP:
return widStop(wDevID);
default:
WARN(mciwave,"unknown message !\n");
WARN(wave,"unknown message !\n");
}
return MMSYSERR_NOTSUPPORTED;
}
......@@ -1718,8 +1065,8 @@ DWORD WINAPI widMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
LONG WAVE_DriverProc16(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
DWORD dwParam1, DWORD dwParam2)
{
TRACE(mciwave,"(%08lX, %04X, %04X, %08lX, %08lX)\n",
dwDevID, hDriv, wMsg, dwParam1, dwParam2);
TRACE(wave,"(%08lX, %04X, %04X, %08lX, %08lX)\n", dwDevID, hDriv, wMsg, dwParam1, dwParam2);
switch(wMsg) {
case DRV_LOAD: return 1;
case DRV_FREE: return 1;
......@@ -1731,51 +1078,20 @@ LONG WAVE_DriverProc16(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
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:
case MCI_OPEN: return WAVE_mciOpen(dwDevID, dwParam1, PTR_SEG_TO_LIN(dwParam2), FALSE);
case MCI_CUE: return WAVE_mciCue(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_CLOSE_DRIVER:
case MCI_CLOSE: return WAVE_mciClose(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_PLAY: return WAVE_mciPlay(dwDevID, dwParam1, (LPMCI_PLAY_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_RECORD: return WAVE_mciRecord(dwDevID, dwParam1, (LPMCI_RECORD_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_STOP: return WAVE_mciStop(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_SET: return WAVE_mciSet(dwDevID, dwParam1, (LPMCI_SET_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_PAUSE: return WAVE_mciPause(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_RESUME: return WAVE_mciResume(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_STATUS: return WAVE_mciStatus(dwDevID, dwParam1, (LPMCI_STATUS_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_GETDEVCAPS: return WAVE_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_INFO: return WAVE_mciInfo(dwDevID, dwParam1, (LPMCI_INFO_PARMS16)PTR_SEG_TO_LIN(dwParam2));
case MCI_LOAD: return MMSYSERR_NOTSUPPORTED;
case MCI_SAVE: return MMSYSERR_NOTSUPPORTED;
case MCI_SEEK: return MMSYSERR_NOTSUPPORTED;
case MCI_FREEZE: return MMSYSERR_NOTSUPPORTED;
case MCI_PUT: return MMSYSERR_NOTSUPPORTED;
case MCI_REALIZE: return MMSYSERR_NOTSUPPORTED;
case MCI_UNFREEZE: return MMSYSERR_NOTSUPPORTED;
case MCI_UPDATE: return MMSYSERR_NOTSUPPORTED;
case MCI_WHERE: return MMSYSERR_NOTSUPPORTED;
case MCI_WINDOW: return MMSYSERR_NOTSUPPORTED;
case MCI_STEP: return MMSYSERR_NOTSUPPORTED;
case MCI_SPIN: return MMSYSERR_NOTSUPPORTED;
case MCI_ESCAPE: return MMSYSERR_NOTSUPPORTED;
case MCI_COPY: return MMSYSERR_NOTSUPPORTED;
case MCI_CUT: return MMSYSERR_NOTSUPPORTED;
case MCI_DELETE: return MMSYSERR_NOTSUPPORTED;
case MCI_PASTE: return MMSYSERR_NOTSUPPORTED;
default:
FIXME(wave, "is probably wrong msg=0x%04x\n", wMsg);
return DefDriverProc16(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
}
return MMSYSERR_NOTENABLED;
}
/**************************************************************************
* WAVE_DriverProc32 [sample driver]
*/
LONG WAVE_DriverProc32(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg,
DWORD dwParam1, DWORD dwParam2)
{
TRACE(mciwave,"(%08lX, %04X, %08lX, %08lX, %08lX)\n",
dwDevID, hDriv, wMsg, dwParam1, dwParam2);
TRACE(wave,"(%08lX, %04X, %08lX, %08lX, %08lX)\n", dwDevID, hDriv, wMsg, dwParam1, dwParam2);
switch(wMsg) {
case DRV_LOAD: return 1;
case DRV_FREE: return 1;
......@@ -1787,40 +1103,8 @@ LONG WAVE_DriverProc32(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg,
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:
case MCI_OPEN: return WAVE_mciOpen(dwDevID, dwParam1, (LPMCI_WAVE_OPEN_PARMS32A)dwParam2, TRUE);
case MCI_CUE: return WAVE_mciCue(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
case MCI_CLOSE_DRIVER:
case MCI_CLOSE: return WAVE_mciClose(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
case MCI_PLAY: return WAVE_mciPlay(dwDevID, dwParam1, (LPMCI_PLAY_PARMS)dwParam2);
case MCI_RECORD: return WAVE_mciRecord(dwDevID, dwParam1, (LPMCI_RECORD_PARMS)dwParam2);
case MCI_STOP: return WAVE_mciStop(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
case MCI_SET: return WAVE_mciSet(dwDevID, dwParam1, (LPMCI_SET_PARMS)dwParam2);
case MCI_PAUSE: return WAVE_mciPause(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
case MCI_RESUME: return WAVE_mciResume(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
case MCI_STATUS: return WAVE_mciStatus(dwDevID, dwParam1, (LPMCI_STATUS_PARMS)dwParam2);
case MCI_GETDEVCAPS: return WAVE_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2);
case MCI_INFO: return WAVE_mciInfo(dwDevID, dwParam1, (LPMCI_INFO_PARMS16)dwParam2);
case MCI_LOAD: return MMSYSERR_NOTSUPPORTED;
case MCI_SAVE: return MMSYSERR_NOTSUPPORTED;
case MCI_SEEK: return MMSYSERR_NOTSUPPORTED;
case MCI_FREEZE: return MMSYSERR_NOTSUPPORTED;
case MCI_PUT: return MMSYSERR_NOTSUPPORTED;
case MCI_REALIZE: return MMSYSERR_NOTSUPPORTED;
case MCI_UNFREEZE: return MMSYSERR_NOTSUPPORTED;
case MCI_UPDATE: return MMSYSERR_NOTSUPPORTED;
case MCI_WHERE: return MMSYSERR_NOTSUPPORTED;
case MCI_WINDOW: return MMSYSERR_NOTSUPPORTED;
case MCI_STEP: return MMSYSERR_NOTSUPPORTED;
case MCI_SPIN: return MMSYSERR_NOTSUPPORTED;
case MCI_ESCAPE: return MMSYSERR_NOTSUPPORTED;
case MCI_COPY: return MMSYSERR_NOTSUPPORTED;
case MCI_CUT: return MMSYSERR_NOTSUPPORTED;
case MCI_DELETE: return MMSYSERR_NOTSUPPORTED;
case MCI_PASTE: return MMSYSERR_NOTSUPPORTED;
default:
FIXME(mciwave, "is probably wrong\n");
FIXME(wave, "is probably wrong msg=0x%04lx\n", wMsg);
return DefDriverProc32(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
}
return MMSYSERR_NOTENABLED;
......@@ -1834,8 +1118,7 @@ LONG WAVE_DriverProc32(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg,
DWORD WINAPI wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
DWORD dwParam1, DWORD dwParam2)
{
FIXME(mciwave,"(%u, %04X, %08lX, %08lX, %08lX):stub\n",
wDevID, wMsg, dwUser, dwParam1, dwParam2);
FIXME(wave,"(%u, %04X, %08lX, %08lX, %08lX):stub\n", wDevID, wMsg, dwUser, dwParam1, dwParam2);
return MMSYSERR_NOTENABLED;
}
......@@ -1845,8 +1128,7 @@ DWORD WINAPI wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
DWORD WINAPI widMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
DWORD dwParam1, DWORD dwParam2)
{
FIXME(mciwave,"(%u, %04X, %08lX, %08lX, %08lX):stub\n",
wDevID, wMsg, dwUser, dwParam1, dwParam2);
FIXME(wave,"(%u, %04X, %08lX, %08lX, %08lX):stub\n", wDevID, wMsg, dwUser, dwParam1, dwParam2);
return MMSYSERR_NOTENABLED;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment