Andrew Eikum : winmm: Allow HMIXEROBJ handles in place of device IDs in mixerGetDevCaps.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jan 27 16:23:59 CST 2015


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

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Tue Jan 27 09:02:50 2015 -0600

winmm: Allow HMIXEROBJ handles in place of device IDs in mixerGetDevCaps.

---

 dlls/winmm/tests/mixer.c | 16 ++++++++++++++++
 dlls/winmm/waveform.c    | 17 ++++++++++++-----
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/dlls/winmm/tests/mixer.c b/dlls/winmm/tests/mixer.c
index 982cf8b..82eb338 100644
--- a/dlls/winmm/tests/mixer.c
+++ b/dlls/winmm/tests/mixer.c
@@ -395,6 +395,14 @@ static void mixer_test_deviceA(int device)
     ok(rc==MMSYSERR_NOERROR,
        "mixerOpen: MMSYSERR_NOERROR expected, got %s\n",mmsys_error(rc));
     if (rc==MMSYSERR_NOERROR) {
+        MIXERCAPSA capsA2;
+
+        rc=mixerGetDevCapsA((UINT_PTR)mix,&capsA2,sizeof(capsA2));
+        ok(rc==MMSYSERR_NOERROR,
+           "mixerGetDevCapsA: MMSYSERR_NOERROR expected, got %s\n",
+           mmsys_error(rc));
+        ok(!strcmp(capsA2.szPname, capsA.szPname), "Got wrong device caps\n");
+
         for (d=0;d<capsA.cDestinations;d++) {
             MIXERLINEA mixerlineA;
             mixerlineA.cbStruct = 0;
@@ -771,6 +779,14 @@ static void mixer_test_deviceW(int device)
     ok(rc==MMSYSERR_NOERROR,
        "mixerOpen: MMSYSERR_NOERROR expected, got %s\n",mmsys_error(rc));
     if (rc==MMSYSERR_NOERROR) {
+        MIXERCAPSW capsW2;
+
+        rc=mixerGetDevCapsW((UINT_PTR)mix,&capsW2,sizeof(capsW2));
+        ok(rc==MMSYSERR_NOERROR,
+           "mixerGetDevCapsW: MMSYSERR_NOERROR expected, got %s\n",
+           mmsys_error(rc));
+        ok(!lstrcmpW(capsW2.szPname, capsW.szPname), "Got wrong device caps\n");
+
         for (d=0;d<capsW.cDestinations;d++) {
             MIXERLINEW mixerlineW;
             mixerlineW.cbStruct = 0;
diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c
index f381c16..ba74e02 100644
--- a/dlls/winmm/waveform.c
+++ b/dlls/winmm/waveform.c
@@ -122,6 +122,7 @@ struct _WINMM_MMDevice {
     WAVEOUTCAPSW out_caps; /* must not be modified outside of WINMM_InitMMDevices*/
     WAVEINCAPSW in_caps; /* must not be modified outside of WINMM_InitMMDevices*/
     WCHAR *dev_id;
+    EDataFlow dataflow;
 
     ISimpleAudioVolume *volume;
 
@@ -510,6 +511,7 @@ static HRESULT WINMM_InitMMDevice(EDataFlow flow, IMMDevice *device,
 {
     HRESULT hr;
 
+    dev->dataflow = flow;
     if(flow == eRender){
         dev->out_caps.wMid = 0xFF;
         dev->out_caps.wPid = 0xFF;
@@ -3749,15 +3751,20 @@ UINT WINAPI mixerGetDevCapsW(UINT_PTR uDeviceID, LPMIXERCAPSW lpCaps, UINT uSize
         return MMSYSERR_NOERROR;
 
     if(uDeviceID >= g_outmmdevices_count + g_inmmdevices_count)
+        mmdevice = WINMM_GetMixerMMDevice((HMIXEROBJ)uDeviceID,
+                MIXER_OBJECTF_MIXER, NULL);
+    else if(uDeviceID < g_outmmdevices_count)
+        mmdevice = read_map(g_out_map, uDeviceID);
+    else
+        mmdevice = read_map(g_in_map, uDeviceID - g_outmmdevices_count);
+
+    if(!mmdevice)
         return MMSYSERR_BADDEVICEID;
 
-    if(uDeviceID < g_outmmdevices_count){
-        mmdevice = read_map(g_out_map, uDeviceID);
+    if(mmdevice->dataflow == eRender)
         memcpy(caps.szPname, mmdevice->out_caps.szPname, sizeof(caps.szPname));
-    }else{
-        mmdevice = read_map(g_in_map, uDeviceID - g_outmmdevices_count);
+    else
         memcpy(caps.szPname, mmdevice->in_caps.szPname, sizeof(caps.szPname));
-    }
 
     caps.wMid = 0xFF;
     caps.wPid = 0xFF;




More information about the wine-cvs mailing list