Emmanuel Maillard : winecoreaudio: Initial implementation of MIX_GetLineControls.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 14 10:52:50 CDT 2007


Module: wine
Branch: master
Commit: 33e24d7ecca02b1f8d8d01ae9459e32389035041
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=33e24d7ecca02b1f8d8d01ae9459e32389035041

Author: Emmanuel Maillard <mahanuu at free.fr>
Date:   Sun May 13 22:12:49 2007 +0200

winecoreaudio: Initial implementation of MIX_GetLineControls.

---

 dlls/winecoreaudio.drv/mixer.c |   86 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 86 insertions(+), 0 deletions(-)

diff --git a/dlls/winecoreaudio.drv/mixer.c b/dlls/winecoreaudio.drv/mixer.c
index 5a9f724..01c35a1 100644
--- a/dlls/winecoreaudio.drv/mixer.c
+++ b/dlls/winecoreaudio.drv/mixer.c
@@ -616,6 +616,91 @@ static DWORD MIX_GetLineInfo(WORD wDevID, LPMIXERLINEW lpMl, DWORD_PTR fdwInfo)
 }
 
 /**************************************************************************
+* 				MIX_GetLineControls		[internal]
+*/
+static DWORD MIX_GetLineControls(WORD wDevID, LPMIXERLINECONTROLSW lpMlc, DWORD_PTR flags)
+{
+    DWORD ret = MMSYSERR_NOTENABLED;
+    int ctrl = 0;
+    TRACE("%04X, %p, %08lX\n", wDevID, lpMlc, flags);
+
+    if (lpMlc == NULL) {
+        WARN("invalid parameter: lpMlc == NULL\n");
+        return MMSYSERR_INVALPARAM;
+    }
+
+    if (lpMlc->cbStruct < sizeof(*lpMlc)) {
+        WARN("invalid parameter: lpMlc->cbStruct = %d\n", lpMlc->cbStruct);
+	return MMSYSERR_INVALPARAM;
+    }
+
+    if (lpMlc->cbmxctrl < sizeof(MIXERCONTROLW)) {
+        WARN("invalid parameter: lpMlc->cbmxctrl = %d\n", lpMlc->cbmxctrl);
+	return MMSYSERR_INVALPARAM;
+    }
+
+    if (wDevID >= numMixers) {
+        WARN("bad device ID: %04X\n", wDevID);
+        return MMSYSERR_BADDEVICEID;
+    }
+
+    switch (flags & MIXER_GETLINECONTROLSF_QUERYMASK)
+    {
+        case MIXER_GETLINECONTROLSF_ALL:
+            FIXME("dwLineID=%d MIXER_GETLINECONTROLSF_ALL (%d)\n", lpMlc->dwLineID, lpMlc->cControls);
+            if (lpMlc->cControls != ControlsPerLine)
+            {
+                WARN("invalid parameter lpMlc->cControls %d\n", lpMlc->cControls);
+                ret = MMSYSERR_INVALPARAM;
+	    }
+            else
+            {
+                if ( (lpMlc->dwLineID >= 0) && (lpMlc->dwLineID < mixer.caps.cDestinations) )
+                {
+                    int i;
+                    for (i = 0; i < lpMlc->cControls; i++)
+                    {
+                        lpMlc->pamxctrl[i] = mixer.mixerCtrls[lpMlc->dwLineID * i].ctrl;
+                    }
+                    ret = MMSYSERR_NOERROR;
+                }
+                else ret = MIXERR_INVALLINE;
+            }
+            break;
+        case MIXER_GETLINECONTROLSF_ONEBYID:
+            TRACE("dwLineID=%d MIXER_GETLINECONTROLSF_ONEBYID (%d)\n", lpMlc->dwLineID, lpMlc->u.dwControlID);
+            if ( lpMlc->u.dwControlID >= 0 && lpMlc->u.dwControlID < mixer.numCtrl )
+            {
+                lpMlc->pamxctrl[0] = mixer.mixerCtrls[lpMlc->u.dwControlID].ctrl;
+                ret = MMSYSERR_NOERROR;
+            }
+            else ret = MIXERR_INVALVALUE;
+            break;
+        case MIXER_GETLINECONTROLSF_ONEBYTYPE:
+            TRACE("dwLineID=%d MIXER_GETLINECONTROLSF_ONEBYTYPE (%s)\n", lpMlc->dwLineID, getControlType(lpMlc->u.dwControlType));
+            if (lpMlc->u.dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
+            {
+                ctrl = (lpMlc->dwLineID * ControlsPerLine) + IDControlVolume;
+                lpMlc->pamxctrl[0] = mixer.mixerCtrls[ctrl].ctrl;
+                ret = MMSYSERR_NOERROR;
+            }
+            else
+                if (lpMlc->u.dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE)
+                {
+                    ctrl = (lpMlc->dwLineID * ControlsPerLine) + IDControlMute;
+                    lpMlc->pamxctrl[0] = mixer.mixerCtrls[ctrl].ctrl;
+                    ret = MMSYSERR_NOERROR;
+                }
+                break;
+        default:
+            ERR("Unknown flag %08lx\n", flags & MIXER_GETLINECONTROLSF_QUERYMASK);
+            ret = MMSYSERR_INVALPARAM;
+    }
+
+    return ret;
+}
+
+/**************************************************************************
 * 				mxdMessage
 */
 DWORD WINAPI CoreAudio_mxdMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser,
@@ -643,6 +728,7 @@ DWORD WINAPI CoreAudio_mxdMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser,
         case MXDM_GETLINEINFO:
             return MIX_GetLineInfo(wDevID, (LPMIXERLINEW)dwParam1, dwParam2);
         case MXDM_GETLINECONTROLS:
+            return MIX_GetLineControls(wDevID, (LPMIXERLINECONTROLSW)dwParam1, dwParam2);
         case MXDM_GETCONTROLDETAILS:
         case MXDM_SETCONTROLDETAILS:
         default:




More information about the wine-cvs mailing list