Skip to content
Snippets Groups Projects
Commit 31a1933a authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard
Browse files

Fixed forwarding and handling messages directed to the mappers.

parent 61206bd8
No related merge requests found
......@@ -392,7 +392,7 @@ static MMDRV_MapType MMDRV_MidiOut_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPD
case MODM_CACHEPATCHES:
case MODM_CACHEDRUMPATCHES:
default:
FIXME("NIY: no conversion yet for %u\n", wMsg);
FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
break;
}
return ret;
......@@ -443,7 +443,7 @@ static MMDRV_MapType MMDRV_MidiOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPD
case MODM_CACHEPATCHES:
case MODM_CACHEDRUMPATCHES:
default:
FIXME("NIY: no conversion yet for %u\n", wMsg);
FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
break;
}
return ret;
......@@ -487,7 +487,7 @@ static MMDRV_MapType MMDRV_MidiOut_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPD
case MODM_CACHEPATCHES:
case MODM_CACHEDRUMPATCHES:
default:
FIXME("NIY: no conversion yet for %u\n", wMsg);
FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
break;
}
return ret;
......@@ -537,7 +537,7 @@ static MMDRV_MapType MMDRV_MidiOut_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPD
case MODM_CACHEPATCHES:
case MODM_CACHEDRUMPATCHES:
default:
FIXME("NIY: no conversion yet for %u\n", wMsg);
FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
break;
}
return ret;
......@@ -678,7 +678,8 @@ static MMDRV_MapType MMDRV_WaveIn_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDW
}
break;
default:
FIXME("NIY: no conversion yet for %u\n", wMsg);
FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
break;
}
return ret;
......@@ -749,7 +750,7 @@ static MMDRV_MapType MMDRV_WaveIn_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDW
}
break;
default:
FIXME("NIY: no conversion yet for %u\n", wMsg);
FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
break;
}
return ret;
......@@ -901,7 +902,7 @@ static MMDRV_MapType MMDRV_WaveIn_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDW
}
break;
default:
FIXME("NIY: no conversion yet for %u\n", wMsg);
FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
break;
}
return ret;
......@@ -993,7 +994,7 @@ static MMDRV_MapType MMDRV_WaveIn_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDW
}
break;
default:
FIXME("NIY: no conversion yet for %u\n", wMsg);
FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
break;
}
return ret;
......@@ -1145,7 +1146,7 @@ static MMDRV_MapType MMDRV_WaveOut_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPD
}
break;
default:
FIXME("NIY: no conversion yet for %u\n", wMsg);
FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
break;
}
return ret;
......@@ -1227,7 +1228,7 @@ static MMDRV_MapType MMDRV_WaveOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPD
}
break;
default:
FIXME("NIY: no conversion yet for %u\n", wMsg);
FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
break;
}
return ret;
......@@ -1764,7 +1765,7 @@ DWORD MMDRV_Open(LPWINE_MLD mld, UINT wMsg, DWORD dwParam1, DWORD dwFlags)
}
}
} else {
mld->uDeviceID = (UINT16)0/*-1*/;
mld->uDeviceID = (UINT16)-1;
mld->mmdIndex = llType->lpMlds[-1].mmdIndex;
TRACE("Setting mmdIndex to %u\n", mld->mmdIndex);
dwRet = MMDRV_Message(mld, wMsg, dwParam1, dwFlags, TRUE);
......@@ -1791,12 +1792,15 @@ DWORD MMDRV_Close(LPWINE_MLD mld, UINT wMsg)
}
/**************************************************************************
* MMDRV_GetVByID [internal]
* MMDRV_GetByID [internal]
*/
LPWINE_MLD MMDRV_GetByID(UINT uDevID, UINT type)
{
return (uDevID < llTypes[type].wMaxId) ?
&llTypes[type].lpMlds[uDevID] : NULL;
if (uDevID < llTypes[type].wMaxId)
return &llTypes[type].lpMlds[uDevID];
if ((uDevID == (UINT16)-1 || uDevID == (UINT)-1) && llTypes[type].nMapper != -1)
return &llTypes[type].lpMlds[-1];
return NULL;
}
/**************************************************************************
......@@ -1811,8 +1815,9 @@ LPWINE_MLD MMDRV_Get(HANDLE hndl, UINT type, BOOL bCanBeID)
if ((UINT)hndl >= llTypes[type].wMaxId) {
mld = (LPWINE_MLD)USER_HEAP_LIN_ADDR(hndl);
if (mld && mld->type != type) mld = NULL;
} else if (bCanBeID) {
if (!IsBadWritePtr(mld, sizeof(*mld)) && mld->type != type) mld = NULL;
}
if (mld == NULL && bCanBeID) {
mld = MMDRV_GetByID((UINT)hndl, type);
}
return mld;
......@@ -1846,23 +1851,23 @@ UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1,
/* all those function calls are undocumented */
switch (uMsg) {
case 0x801:
case 0x801: /* DRV_QUERYDRVENTRY */
strncpy((LPSTR)dwParam1, lpDrv->name, LOWORD(dwParam2));
break;
case 0x802:
case 0x802: /* DRV_QUERYDEVNODE */
*(LPDWORD)dwParam1 = 0L; /* should be DevNode */
break;
case 0x803: /* dont know */
case 0x803: /* DRV_QUERYNAME */
WARN("NIY 0x803\n");
break;
case 0x804:
case 0x804: /* DRV_QUERYDRIVERIDS */
WARN("NIY call VxD\n");
/* should call VxD MMDEVLDR with (DevNode, dwParam1 and dwParam2) as pmts
* dwParam1 is buffer and dwParam2 is sizeof buffer
* I don't know where the result is stored though
*/
break;
case 0x805:
case 0x805: /* DRV_QUERYMAPPABLE */
return (lpDrv->bIsMapper) ? 2 : 0;
default:
WARN("Unknown call %04x\n", uMsg);
......@@ -1937,7 +1942,7 @@ static BOOL MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT num,
/* re-build the translation table */
if (llTypes[type].nMapper != -1) {
TRACE("%s:Trans[%d] -> %s\n", llTypes[type].name, -1, MMDrvs[llTypes[type].nMapper].name);
llTypes[type].lpMlds[-1].uDeviceID = -1;
llTypes[type].lpMlds[-1].uDeviceID = (UINT16)-1;
llTypes[type].lpMlds[-1].type = type;
llTypes[type].lpMlds[-1].mmdIndex = llTypes[type].nMapper;
llTypes[type].lpMlds[-1].dwDriverInstance = 0;
......
......@@ -13,9 +13,15 @@
DEFAULT_DEBUG_CHANNEL(msacm)
typedef struct tagMIDIMAPDATA {
struct tagMIDIMAPDATA* self;
HMIDI hMidi;
} MIDIMAPDATA;
static BOOL MIDIMAP_IsData(MIDIMAPDATA* mm)
{
return (!IsBadReadPtr(mm, sizeof(MIDIMAPDATA)) && mm->self == mm);
}
/*======================================================================*
* MIDI OUT part *
*======================================================================*/
......@@ -68,19 +74,41 @@ static DWORD modUnprepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD dwParam2)
return midiOutUnprepareHeader(mom->hMidi, lpMidiHdr, dwParam2);
}
static DWORD modGetDevCaps(MIDIMAPDATA* mom, LPMIDIOUTCAPSA lpMidiCaps, DWORD dwParam2)
static DWORD modGetDevCaps(UINT wDevID, MIDIMAPDATA* mom, LPMIDIOUTCAPSA lpMidiCaps, DWORD dwParam2)
{
return midiOutGetDevCapsA(mom->hMidi, lpMidiCaps, dwParam2);
/* if opened low driver, forward message */
if (MIDIMAP_IsData(mom))
return midiOutGetDevCapsA(mom->hMidi, lpMidiCaps, dwParam2);
/* otherwise, return caps of mapper itself */
if (wDevID == (UINT)-1 || wDevID == (UINT16)-1) {
lpMidiCaps->wMid = 0x00FF;
lpMidiCaps->wPid = 0x0001;
lpMidiCaps->vDriverVersion = 0x0100;
strcpy(lpMidiCaps->szPname, "Wine midi out mapper");
lpMidiCaps->wTechnology = MOD_MAPPER;
lpMidiCaps->wVoices = 0;
lpMidiCaps->wNotes = 0;
lpMidiCaps->wChannelMask = 0xFFFF;
lpMidiCaps->dwSupport = MIDICAPS_LRVOLUME | MIDICAPS_VOLUME;
return MMSYSERR_NOERROR;
}
ERR("This shouldn't happen\n");
return MMSYSERR_ERROR;
}
static DWORD modGetVolume(MIDIMAPDATA* mom, LPDWORD lpVol)
static DWORD modGetVolume(UINT wDevID, MIDIMAPDATA* mom, LPDWORD lpVol)
{
return midiOutGetVolume(mom->hMidi, lpVol);
if (MIDIMAP_IsData(mom))
return midiOutGetVolume(mom->hMidi, lpVol);
return MMSYSERR_ERROR;
}
static DWORD modSetVolume(MIDIMAPDATA* mom, DWORD vol)
static DWORD modSetVolume(UINT wDevID, MIDIMAPDATA* mom, DWORD vol)
{
return midiOutSetVolume(mom->hMidi, vol);
if (MIDIMAP_IsData(mom))
return midiOutSetVolume(mom->hMidi, vol);
return MMSYSERR_ERROR;
}
static DWORD modReset(MIDIMAPDATA* mom)
......@@ -113,10 +141,10 @@ DWORD WINAPI MIDIMAP_modMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
case MODM_PREPARE: return modPrepare ((MIDIMAPDATA*)dwUser, (LPMIDIHDR)dwParam1, dwParam2);
case MODM_UNPREPARE: return modUnprepare ((MIDIMAPDATA*)dwUser, (LPMIDIHDR)dwParam1, dwParam2);
case MODM_GETDEVCAPS: return modGetDevCaps ((MIDIMAPDATA*)dwUser, (LPMIDIOUTCAPSA)dwParam1,dwParam2);
case MODM_GETDEVCAPS: return modGetDevCaps (wDevID, (MIDIMAPDATA*)dwUser, (LPMIDIOUTCAPSA)dwParam1,dwParam2);
case MODM_GETNUMDEVS: return 1;
case MODM_GETVOLUME: return modGetVolume ((MIDIMAPDATA*)dwUser, (LPDWORD)dwParam1);
case MODM_SETVOLUME: return modSetVolume ((MIDIMAPDATA*)dwUser, dwParam1);
case MODM_GETVOLUME: return modGetVolume (wDevID, (MIDIMAPDATA*)dwUser, (LPDWORD)dwParam1);
case MODM_SETVOLUME: return modSetVolume (wDevID, (MIDIMAPDATA*)dwUser, dwParam1);
case MODM_RESET: return modReset ((MIDIMAPDATA*)dwUser);
default:
FIXME("unknown message %d!\n", wMsg);
......@@ -132,63 +160,77 @@ static DWORD midOpen(LPDWORD lpdwUser, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
{
UINT nd = midiInGetNumDevs();
UINT i;
MIDIMAPDATA* wim = HeapAlloc(GetProcessHeap(), 0, sizeof(MIDIMAPDATA));
MIDIMAPDATA* mim = HeapAlloc(GetProcessHeap(), 0, sizeof(MIDIMAPDATA));
TRACE("(%p %p %08lx\n", lpdwUser, lpDesc, dwFlags);
for (i = 0; i < nd; i++) {
if (midiInOpen(&wim->hMidi, i, lpDesc->dwCallback,
if (midiInOpen(&mim->hMidi, i, lpDesc->dwCallback,
lpDesc->dwInstance, dwFlags) == MMSYSERR_NOERROR) {
lpDesc->hMidi = wim->hMidi;
*lpdwUser = (DWORD)wim;
lpDesc->hMidi = mim->hMidi;
*lpdwUser = (DWORD)mim;
return MMSYSERR_NOERROR;
}
}
HeapFree(GetProcessHeap(), 0, wim);
HeapFree(GetProcessHeap(), 0, mim);
return MMSYSERR_ALLOCATED;
}
static DWORD midClose(MIDIMAPDATA* wim)
static DWORD midClose(MIDIMAPDATA* mim)
{
DWORD ret = midiInClose(wim->hMidi);
DWORD ret = midiInClose(mim->hMidi);
if (ret == MMSYSERR_NOERROR)
HeapFree(GetProcessHeap(), 0, wim);
HeapFree(GetProcessHeap(), 0, mim);
return ret;
}
static DWORD midAddBuffer(MIDIMAPDATA* wim, LPMIDIHDR lpMidiHdr, DWORD dwParam2)
static DWORD midAddBuffer(MIDIMAPDATA* mim, LPMIDIHDR lpMidiHdr, DWORD dwParam2)
{
return midiInAddBuffer(wim->hMidi, lpMidiHdr, dwParam2);
return midiInAddBuffer(mim->hMidi, lpMidiHdr, dwParam2);
}
static DWORD midPrepare(MIDIMAPDATA* wim, LPMIDIHDR lpMidiHdr, DWORD dwParam2)
static DWORD midPrepare(MIDIMAPDATA* mim, LPMIDIHDR lpMidiHdr, DWORD dwParam2)
{
return midiInPrepareHeader(wim->hMidi, lpMidiHdr, dwParam2);
return midiInPrepareHeader(mim->hMidi, lpMidiHdr, dwParam2);
}
static DWORD midUnprepare(MIDIMAPDATA* wim, LPMIDIHDR lpMidiHdr, DWORD dwParam2)
static DWORD midUnprepare(MIDIMAPDATA* mim, LPMIDIHDR lpMidiHdr, DWORD dwParam2)
{
return midiInUnprepareHeader(wim->hMidi, lpMidiHdr, dwParam2);
return midiInUnprepareHeader(mim->hMidi, lpMidiHdr, dwParam2);
}
static DWORD midGetDevCaps(MIDIMAPDATA* wim, LPMIDIINCAPSA lpMidiCaps, DWORD dwParam2)
static DWORD midGetDevCaps(UINT wDevID, MIDIMAPDATA* mim, LPMIDIINCAPSA lpMidiCaps, DWORD dwParam2)
{
return midiInGetDevCapsA(wim->hMidi, lpMidiCaps, dwParam2);
/* if opened low driver, forward message */
if (MIDIMAP_IsData(mim))
return midiInGetDevCapsA(mim->hMidi, lpMidiCaps, dwParam2);
/* otherwise, return caps of mapper itself */
if (wDevID == (UINT)-1 || wDevID == (UINT16)-1) {
lpMidiCaps->wMid = 0x00FF;
lpMidiCaps->wPid = 0x0001;
lpMidiCaps->vDriverVersion = 0x0100;
strcpy(lpMidiCaps->szPname, "Wine midi int mapper");
lpMidiCaps->dwSupport = 0;
return MMSYSERR_NOERROR;
}
ERR("This shouldn't happen\n");
return MMSYSERR_ERROR;
}
static DWORD midStop(MIDIMAPDATA* wim)
static DWORD midStop(MIDIMAPDATA* mim)
{
return midiInStop(wim->hMidi);
return midiInStop(mim->hMidi);
}
static DWORD midStart(MIDIMAPDATA* wim)
static DWORD midStart(MIDIMAPDATA* mim)
{
return midiInStart(wim->hMidi);
return midiInStart(mim->hMidi);
}
static DWORD midReset(MIDIMAPDATA* wim)
static DWORD midReset(MIDIMAPDATA* mim)
{
return midiInReset(wim->hMidi);
return midiInReset(mim->hMidi);
}
/**************************************************************************
......@@ -214,7 +256,7 @@ DWORD WINAPI MIDIMAP_midMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
case MIDM_ADDBUFFER: return midAddBuffer ((MIDIMAPDATA*)dwUser, (LPMIDIHDR)dwParam1, dwParam2);
case MIDM_PREPARE: return midPrepare ((MIDIMAPDATA*)dwUser, (LPMIDIHDR)dwParam1, dwParam2);
case MIDM_UNPREPARE: return midUnprepare ((MIDIMAPDATA*)dwUser, (LPMIDIHDR)dwParam1, dwParam2);
case MIDM_GETDEVCAPS: return midGetDevCaps ((MIDIMAPDATA*)dwUser, (LPMIDIINCAPSA)dwParam1, dwParam2);
case MIDM_GETDEVCAPS: return midGetDevCaps (wDevID, (MIDIMAPDATA*)dwUser, (LPMIDIINCAPSA)dwParam1, dwParam2);
case MIDM_GETNUMDEVS: return 1;
case MIDM_RESET: return midReset ((MIDIMAPDATA*)dwUser);
case MIDM_START: return midStart ((MIDIMAPDATA*)dwUser);
......
......@@ -20,6 +20,7 @@
DEFAULT_DEBUG_CHANNEL(msacm)
typedef struct tagWAVEMAPDATA {
struct tagWAVEMAPDATA* self;
HWAVE hWave;
HACMSTREAM hAcmStream;
/* needed data to filter callbacks. Only needed when hAcmStream is not 0 */
......@@ -34,6 +35,11 @@ typedef struct tagWAVEMAPDATA {
MMRESULT (WINAPI *acmStreamUnprepareHeader)(HACMSTREAM, PACMSTREAMHEADER, DWORD);
} WAVEMAPDATA;
static BOOL WAVEMAP_IsData(WAVEMAPDATA* wm)
{
return (!IsBadReadPtr(wm, sizeof(WAVEMAPDATA)) && wm->self == wm);
}
/*======================================================================*
* WAVE OUT part *
*======================================================================*/
......@@ -97,6 +103,8 @@ static DWORD wodOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
if (!wom)
return MMSYSERR_NOMEM;
wom->self = wom;
for (i = 0; i < nd; i++) {
/* if no ACM stuff is involved, no need to handle callbacks at this
* level, this will be done transparently
......@@ -265,19 +273,42 @@ static DWORD wodGetPosition(WAVEMAPDATA* wom, LPMMTIME lpTime, DWORD dwParam2)
return waveOutGetPosition(wom->hWave, lpTime, dwParam2);
}
static DWORD wodGetDevCaps(WAVEMAPDATA* wom, LPWAVEOUTCAPSA lpWaveCaps, DWORD dwParam2)
static DWORD wodGetDevCaps(UINT wDevID, WAVEMAPDATA* wom, LPWAVEOUTCAPSA lpWaveCaps, DWORD dwParam2)
{
return waveOutGetDevCapsA(wom->hWave, lpWaveCaps, dwParam2);
/* if opened low driver, forward message */
if (WAVEMAP_IsData(wom))
return waveOutGetDevCapsA(wom->hWave, lpWaveCaps, dwParam2);
/* otherwise, return caps of mapper itself */
if (wDevID == (UINT)-1 || wDevID == (UINT16)-1) {
lpWaveCaps->wMid = 0x00FF;
lpWaveCaps->wPid = 0x0001;
lpWaveCaps->vDriverVersion = 0x0100;
strcpy(lpWaveCaps->szPname, "Wine wave out mapper");
lpWaveCaps->dwFormats =
WAVE_FORMAT_4M08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_4M16 | WAVE_FORMAT_4S16 |
WAVE_FORMAT_2M08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_2M16 | WAVE_FORMAT_2S16 |
WAVE_FORMAT_1M08 | WAVE_FORMAT_1S08 | WAVE_FORMAT_1M16 | WAVE_FORMAT_1S16;
lpWaveCaps->wChannels = 2;
lpWaveCaps->dwSupport = WAVECAPS_VOLUME | WAVECAPS_LRVOLUME;
return MMSYSERR_NOERROR;
}
ERR("This shouldn't happen\n");
return MMSYSERR_ERROR;
}
static DWORD wodGetVolume(WAVEMAPDATA* wom, LPDWORD lpVol)
static DWORD wodGetVolume(UINT wDevID, WAVEMAPDATA* wom, LPDWORD lpVol)
{
return waveOutGetVolume(wom->hWave, lpVol);
if (WAVEMAP_IsData(wom))
return waveOutGetVolume(wom->hWave, lpVol);
return MMSYSERR_NOERROR;
}
static DWORD wodSetVolume(WAVEMAPDATA* wom, DWORD vol)
static DWORD wodSetVolume(UINT wDevID, WAVEMAPDATA* wom, DWORD vol)
{
return waveOutSetVolume(wom->hWave, vol);
if (WAVEMAP_IsData(wom))
return waveOutSetVolume(wom->hWave, vol);
return MMSYSERR_NOERROR;
}
static DWORD wodPause(WAVEMAPDATA* wom)
......@@ -319,14 +350,14 @@ DWORD WINAPI WAVEMAP_wodMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
case WODM_BREAKLOOP: return MMSYSERR_NOTSUPPORTED;
case WODM_PREPARE: return wodPrepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2);
case WODM_UNPREPARE: return wodUnprepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2);
case WODM_GETDEVCAPS: return wodGetDevCaps ((WAVEMAPDATA*)dwUser, (LPWAVEOUTCAPSA)dwParam1,dwParam2);
case WODM_GETDEVCAPS: return wodGetDevCaps (wDevID, (WAVEMAPDATA*)dwUser, (LPWAVEOUTCAPSA)dwParam1,dwParam2);
case WODM_GETNUMDEVS: return 1;
case WODM_GETPITCH: return MMSYSERR_NOTSUPPORTED;
case WODM_SETPITCH: return MMSYSERR_NOTSUPPORTED;
case WODM_GETPLAYBACKRATE: return MMSYSERR_NOTSUPPORTED;
case WODM_SETPLAYBACKRATE: return MMSYSERR_NOTSUPPORTED;
case WODM_GETVOLUME: return wodGetVolume ((WAVEMAPDATA*)dwUser, (LPDWORD)dwParam1);
case WODM_SETVOLUME: return wodSetVolume ((WAVEMAPDATA*)dwUser, dwParam1);
case WODM_GETVOLUME: return wodGetVolume (wDevID, (WAVEMAPDATA*)dwUser, (LPDWORD)dwParam1);
case WODM_SETVOLUME: return wodSetVolume (wDevID, (WAVEMAPDATA*)dwUser, dwParam1);
case WODM_RESTART: return wodRestart ((WAVEMAPDATA*)dwUser);
case WODM_RESET: return wodReset ((WAVEMAPDATA*)dwUser);
default:
......@@ -347,6 +378,8 @@ static DWORD widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
TRACE("(%p %p %08lx\n", lpdwUser, lpDesc, dwFlags);
wim->self = wim;
for (i = 0; i < nd; i++) {
if (waveInOpen(&wim->hWave, i, lpDesc->lpFormat, lpDesc->dwCallback,
lpDesc->dwInstance, dwFlags) == MMSYSERR_NOERROR) {
......@@ -387,9 +420,26 @@ static DWORD widGetPosition(WAVEMAPDATA* wim, LPMMTIME lpTime, DWORD dwParam2)
return waveInGetPosition(wim->hWave, lpTime, dwParam2);
}
static DWORD widGetDevCaps(WAVEMAPDATA* wim, LPWAVEINCAPSA lpWaveCaps, DWORD dwParam2)
static DWORD widGetDevCaps(UINT wDevID, WAVEMAPDATA* wim, LPWAVEINCAPSA lpWaveCaps, DWORD dwParam2)
{
return waveInGetDevCapsA(wim->hWave, lpWaveCaps, dwParam2);
/* if opened low driver, forward message */
if (WAVEMAP_IsData(wim))
return waveInGetDevCapsA(wim->hWave, lpWaveCaps, dwParam2);
/* otherwise, return caps of mapper itself */
if (wDevID == (UINT)-1 || wDevID == (UINT16)-1) {
lpWaveCaps->wMid = 0x00FF;
lpWaveCaps->wPid = 0x0001;
lpWaveCaps->vDriverVersion = 0x0001;
strcpy(lpWaveCaps->szPname, "Wine wave in mapper");
lpWaveCaps->dwFormats =
WAVE_FORMAT_4M08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_4M16 | WAVE_FORMAT_4S16 |
WAVE_FORMAT_2M08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_2M16 | WAVE_FORMAT_2S16 |
WAVE_FORMAT_1M08 | WAVE_FORMAT_1S08 | WAVE_FORMAT_1M16 | WAVE_FORMAT_1S16;
lpWaveCaps->wChannels = 2;
return MMSYSERR_NOERROR;
}
ERR("This shouldn't happen\n");
return MMSYSERR_ERROR;
}
static DWORD widStop(WAVEMAPDATA* wim)
......@@ -430,7 +480,7 @@ DWORD WINAPI WAVEMAP_widMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
case WIDM_ADDBUFFER: return widAddBuffer ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2);
case WIDM_PREPARE: return widPrepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2);
case WIDM_UNPREPARE: return widUnprepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2);
case WIDM_GETDEVCAPS: return widGetDevCaps ((WAVEMAPDATA*)dwUser, (LPWAVEINCAPSA)dwParam1, dwParam2);
case WIDM_GETDEVCAPS: return widGetDevCaps (wDevID, (WAVEMAPDATA*)dwUser, (LPWAVEINCAPSA)dwParam1, dwParam2);
case WIDM_GETNUMDEVS: return 1;
case WIDM_GETPOS: return widGetPosition ((WAVEMAPDATA*)dwUser, (LPMMTIME)dwParam1, dwParam2);
case WIDM_RESET: return widReset ((WAVEMAPDATA*)dwUser);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment