Fixed forwarding and handling messages directed to the mappers.
This commit is contained in:
parent
61206bd8a0
commit
31a1933aa5
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue