Emmanuel Maillard : winecoreaudio:
Initial implementation of MIX_GetLineInfo.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon May 14 10:52:49 CDT 2007
Module: wine
Branch: master
Commit: 7f5a322e259757f406dbcac1461197ada8795875
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7f5a322e259757f406dbcac1461197ada8795875
Author: Emmanuel Maillard <mahanuu at free.fr>
Date: Sun May 13 22:02:26 2007 +0200
winecoreaudio: Initial implementation of MIX_GetLineInfo.
---
dlls/winecoreaudio.drv/mixer.c | 121 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 121 insertions(+), 0 deletions(-)
diff --git a/dlls/winecoreaudio.drv/mixer.c b/dlls/winecoreaudio.drv/mixer.c
index 7cecda2..5a9f724 100644
--- a/dlls/winecoreaudio.drv/mixer.c
+++ b/dlls/winecoreaudio.drv/mixer.c
@@ -496,6 +496,126 @@ static DWORD MIX_GetDevCaps(WORD wDevID, LPMIXERCAPSW lpCaps, DWORD_PTR dwSize)
}
/**************************************************************************
+* MIX_GetLineInfo [internal]
+*/
+static DWORD MIX_GetLineInfo(WORD wDevID, LPMIXERLINEW lpMl, DWORD_PTR fdwInfo)
+{
+ int i;
+ DWORD ret = MMSYSERR_ERROR;
+ MixerLine *line = NULL;
+
+ TRACE("%04X, %p, %08lx\n", wDevID, lpMl, fdwInfo);
+
+ if (lpMl == NULL) {
+ WARN("invalid parameter: lpMl = NULL\n");
+ return MMSYSERR_INVALPARAM;
+ }
+
+ if (lpMl->cbStruct != sizeof(*lpMl)) {
+ WARN("invalid parameter: lpMl->cbStruct\n");
+ return MMSYSERR_INVALPARAM;
+ }
+
+ if (wDevID >= numMixers) {
+ WARN("bad device ID: %04X\n", wDevID);
+ return MMSYSERR_BADDEVICEID;
+ }
+
+ /* FIXME: set all the variables correctly... the lines below
+ * are very wrong...
+ */
+ lpMl->dwUser = 0;
+
+ switch (fdwInfo & MIXER_GETLINEINFOF_QUERYMASK)
+ {
+ case MIXER_GETLINEINFOF_DESTINATION:
+ TRACE("MIXER_GETLINEINFOF_DESTINATION %d\n", lpMl->dwDestination);
+ if ( (lpMl->dwDestination >= 0) && (lpMl->dwDestination < mixer.caps.cDestinations) )
+ {
+ lpMl->dwLineID = lpMl->dwDestination;
+ line = &mixer.lines[lpMl->dwDestination];
+ }
+ else ret = MIXERR_INVALLINE;
+ break;
+ case MIXER_GETLINEINFOF_COMPONENTTYPE:
+ TRACE("MIXER_GETLINEINFOF_COMPONENTTYPE %s\n", getComponentType(lpMl->dwComponentType));
+ for (i = 0; i < mixer.caps.cDestinations; i++)
+ {
+ if (mixer.lines[i].componentType == lpMl->dwComponentType)
+ {
+ lpMl->dwDestination = lpMl->dwLineID = i;
+ line = &mixer.lines[i];
+ break;
+ }
+ }
+ if (line == NULL)
+ {
+ WARN("can't find component type %s\n", getComponentType(lpMl->dwComponentType));
+ ret = MIXERR_INVALVALUE;
+ }
+ break;
+ case MIXER_GETLINEINFOF_SOURCE:
+ FIXME("MIXER_GETLINEINFOF_SOURCE %d dst=%d\n", lpMl->dwSource, lpMl->dwDestination);
+ break;
+ case MIXER_GETLINEINFOF_LINEID:
+ TRACE("MIXER_GETLINEINFOF_LINEID %d\n", lpMl->dwLineID);
+ if ( (lpMl->dwLineID >= 0) && (lpMl->dwLineID < mixer.caps.cDestinations) )
+ {
+ lpMl->dwDestination = lpMl->dwLineID;
+ line = &mixer.lines[lpMl->dwLineID];
+ }
+ else ret = MIXERR_INVALLINE;
+ break;
+ case MIXER_GETLINEINFOF_TARGETTYPE:
+ FIXME("MIXER_GETLINEINFOF_TARGETTYPE (%s)\n", getTargetType(lpMl->Target.dwType));
+ switch (lpMl->Target.dwType) {
+ case MIXERLINE_TARGETTYPE_UNDEFINED:
+ case MIXERLINE_TARGETTYPE_WAVEOUT:
+ case MIXERLINE_TARGETTYPE_WAVEIN:
+ case MIXERLINE_TARGETTYPE_MIDIOUT:
+ case MIXERLINE_TARGETTYPE_MIDIIN:
+ case MIXERLINE_TARGETTYPE_AUX:
+ default:
+ FIXME("Unhandled target type (%s)\n",
+ getTargetType(lpMl->Target.dwType));
+ return MMSYSERR_INVALPARAM;
+ }
+ break;
+ default:
+ WARN("Unknown flag (%08lx)\n", fdwInfo & MIXER_GETLINEINFOF_QUERYMASK);
+ break;
+ }
+
+ if (line)
+ {
+ lpMl->dwComponentType = line->componentType;
+ lpMl->cChannels = line->numChannels;
+ lpMl->cControls = ControlsPerLine;
+
+ /* FIXME check there with CoreAudio */
+ lpMl->cConnections = 1;
+ lpMl->fdwLine = MIXERLINE_LINEF_ACTIVE;
+
+ MultiByteToWideChar(CP_ACP, 0, line->name, -1, lpMl->szShortName, sizeof(lpMl->szShortName) / sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, line->name, -1, lpMl->szName, sizeof(lpMl->szName) / sizeof(WCHAR));
+
+ if ( IsInput(line->direction) )
+ lpMl->Target.dwType = MIXERLINE_TARGETTYPE_WAVEIN;
+ else
+ lpMl->Target.dwType = MIXERLINE_TARGETTYPE_WAVEOUT;
+
+ lpMl->Target.dwDeviceID = line->deviceID;
+ lpMl->Target.wMid = mixer.caps.wMid;
+ lpMl->Target.wPid = mixer.caps.wPid;
+ lpMl->Target.vDriverVersion = mixer.caps.vDriverVersion;
+
+ MultiByteToWideChar(CP_ACP, 0, WINE_MIXER_NAME, -1, lpMl->Target.szPname, sizeof(lpMl->Target.szPname) / sizeof(WCHAR));
+ ret = MMSYSERR_NOERROR;
+ }
+ return ret;
+}
+
+/**************************************************************************
* mxdMessage
*/
DWORD WINAPI CoreAudio_mxdMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser,
@@ -521,6 +641,7 @@ DWORD WINAPI CoreAudio_mxdMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser,
case MXDM_GETDEVCAPS:
return MIX_GetDevCaps(wDevID, (LPMIXERCAPSW)dwParam1, dwParam2);
case MXDM_GETLINEINFO:
+ return MIX_GetLineInfo(wDevID, (LPMIXERLINEW)dwParam1, dwParam2);
case MXDM_GETLINECONTROLS:
case MXDM_GETCONTROLDETAILS:
case MXDM_SETCONTROLDETAILS:
More information about the wine-cvs
mailing list