=?UTF-8?Q?J=C3=B6rg=20H=C3=B6hle=20?=: winmm: Avoid generic MMSYSERR_ERROR during initialisation.

Alexandre Julliard julliard at winehq.org
Fri Nov 9 11:03:23 CST 2012


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

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Thu Jan 12 17:02:46 2012 +0100

winmm: Avoid generic MMSYSERR_ERROR during initialisation.

---

 dlls/winmm/waveform.c |   60 ++++++++++++++++++++++++++++++++++++------------
 1 files changed, 45 insertions(+), 15 deletions(-)

diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c
index 37d1d4f..48f53a5 100644
--- a/dlls/winmm/waveform.c
+++ b/dlls/winmm/waveform.c
@@ -379,6 +379,29 @@ static inline void WINMM_NotifyClient(WINMM_CBInfo *info, WORD msg, DWORD_PTR pa
         msg, info->user, param1, param2);
 }
 
+static MMRESULT hr2mmr(HRESULT hr)
+{
+    switch(hr){
+    case S_OK:
+    case AUDCLNT_E_NOT_STOPPED:
+        return MMSYSERR_NOERROR;
+    case AUDCLNT_E_UNSUPPORTED_FORMAT:
+        return WAVERR_BADFORMAT;
+    case AUDCLNT_E_DEVICE_IN_USE:
+        return MMSYSERR_ALLOCATED;
+    case AUDCLNT_E_ENDPOINT_CREATE_FAILED:
+        return MMSYSERR_NOTENABLED;
+    case E_OUTOFMEMORY:
+        return MMSYSERR_NOMEM;
+    case E_POINTER:
+    case E_INVALIDARG:
+        return MMSYSERR_INVALPARAM;
+    case AUDCLNT_E_DEVICE_INVALIDATED: /* DSERR_BUFFERLOST */
+    default:
+        return FAILED(hr) ? MMSYSERR_ERROR : MMSYSERR_NOERROR;
+    }
+}
+
 static HRESULT WINMM_GetFriendlyName(IMMDevice *device, WCHAR *out,
         UINT outlen)
 {
@@ -898,7 +921,7 @@ static LRESULT WINMM_OpenDevice(WINMM_Device *device, WINMM_MMDevice *mmdevice,
         WINMM_OpenInfo *info)
 {
     WAVEFORMATEX *closer_fmt = NULL, fmt, *passed_fmt;
-    LRESULT ret = MMSYSERR_ERROR;
+    LRESULT ret = MMSYSERR_NOMEM;
     HRESULT hr;
 
     hr = IMMDeviceEnumerator_GetDevice(g_devenum, mmdevice->dev_id,
@@ -907,13 +930,18 @@ static LRESULT WINMM_OpenDevice(WINMM_Device *device, WINMM_MMDevice *mmdevice,
         WARN("Device %s (%s) unavailable: %08x\n",
                 wine_dbgstr_w(mmdevice->dev_id),
                 wine_dbgstr_w(mmdevice->out_caps.szPname), hr);
+        ret = MMSYSERR_NODRIVER;
         goto error;
     }
 
+    /* this is where winexyz.drv opens the audio device */
     hr = IMMDevice_Activate(device->device, &IID_IAudioClient,
             CLSCTX_INPROC_SERVER, NULL, (void**)&device->client);
     if(FAILED(hr)){
         WARN("Activate failed: %08x\n", hr);
+        ret = hr2mmr(hr);
+        if(ret == MMSYSERR_ERROR)
+            ret = MMSYSERR_NOTENABLED;
         goto error;
     }
 
@@ -945,6 +973,7 @@ static LRESULT WINMM_OpenDevice(WINMM_Device *device, WINMM_MMDevice *mmdevice,
         CoTaskMemFree(closer_fmt);
     if(FAILED(hr) && hr != AUDCLNT_E_UNSUPPORTED_FORMAT){
         WARN("IsFormatSupported failed: %08x\n", hr);
+        ret = hr2mmr(hr);
         goto error;
     }
     if(hr == S_FALSE || hr == AUDCLNT_E_UNSUPPORTED_FORMAT){
@@ -962,6 +991,7 @@ static LRESULT WINMM_OpenDevice(WINMM_Device *device, WINMM_MMDevice *mmdevice,
             10 * 100000, 50000, passed_fmt, &device->parent->session);
     if(FAILED(hr)){
         WARN("Initialize failed: %08x\n", hr);
+        ret = hr2mmr(hr);
         goto error;
     }
 
@@ -1038,7 +1068,7 @@ static LRESULT WOD_Open(WINMM_OpenInfo *info)
 {
     WINMM_MMDevice *mmdevice;
     WINMM_Device *device = NULL;
-    LRESULT ret = MMSYSERR_ERROR;
+    LRESULT ret;
     HRESULT hr;
 
     TRACE("(%u, %p, %08x)\n", info->req_device, info, info->flags);
@@ -1111,7 +1141,7 @@ static LRESULT WID_Open(WINMM_OpenInfo *info)
 {
     WINMM_MMDevice *mmdevice;
     WINMM_Device *device = NULL;
-    LRESULT ret = MMSYSERR_ERROR;
+    LRESULT ret;
     HRESULT hr;
 
     TRACE("(%u, %p, %08x)\n", info->req_device, info, info->flags);
@@ -2378,7 +2408,7 @@ UINT WINAPI waveOutGetDevCapsW(UINT_PTR uDeviceID, LPWAVEOUTCAPSW lpCaps,
 
     hr = WINMM_InitMMDevices();
     if(FAILED(hr))
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     if (lpCaps == NULL)	return MMSYSERR_INVALPARAM;
 
@@ -2474,7 +2504,7 @@ MMRESULT WINAPI waveOutOpen(LPHWAVEOUT lphWaveOut, UINT uDeviceID,
             dwCallback, dwInstance, dwFlags);
 
     if(!WINMM_StartDevicesThread())
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     if(!lphWaveOut && !(dwFlags & WAVE_FORMAT_QUERY))
         return MMSYSERR_INVALPARAM;
@@ -2939,7 +2969,7 @@ static UINT get_device_interface(UINT msg, BOOL is_out, UINT index, WCHAR *out,
     WINMM_QueryInterfaceInfo info;
 
     if(!WINMM_StartDevicesThread())
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     info.is_out = is_out;
     info.index = index;
@@ -3021,7 +3051,7 @@ UINT WINAPI waveInGetDevCapsW(UINT_PTR uDeviceID, LPWAVEINCAPSW lpCaps, UINT uSi
 
     hr = WINMM_InitMMDevices();
     if(FAILED(hr))
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     if(!lpCaps)
         return MMSYSERR_INVALPARAM;
@@ -3096,7 +3126,7 @@ MMRESULT WINAPI waveInOpen(HWAVEIN* lphWaveIn, UINT uDeviceID,
             dwCallback, dwInstance, dwFlags);
 
     if(!WINMM_StartDevicesThread())
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     if(!lphWaveIn && !(dwFlags & WAVE_FORMAT_QUERY))
         return MMSYSERR_INVALPARAM;
@@ -3445,7 +3475,7 @@ UINT WINAPI mixerGetDevCapsW(UINT_PTR uDeviceID, LPMIXERCAPSW lpCaps, UINT uSize
 
     hr = WINMM_InitMMDevices();
     if(FAILED(hr))
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     if(!lpCaps)
         return MMSYSERR_INVALPARAM;
@@ -3490,7 +3520,7 @@ UINT WINAPI mixerOpen(LPHMIXER lphMix, UINT uDeviceID, DWORD_PTR dwCallback,
 
     hr = WINMM_InitMMDevices();
     if(FAILED(hr))
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     if(!lphMix)
         return MMSYSERR_INVALPARAM;
@@ -3539,7 +3569,7 @@ UINT WINAPI mixerGetID(HMIXEROBJ hmix, LPUINT lpid, DWORD fdwID)
 
     hr = WINMM_InitMMDevices();
     if(FAILED(hr))
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     if(!lpid)
         return MMSYSERR_INVALPARAM;
@@ -3567,7 +3597,7 @@ UINT WINAPI mixerGetControlDetailsW(HMIXEROBJ hmix, LPMIXERCONTROLDETAILS lpmcdW
 
     hr = WINMM_InitMMDevices();
     if(FAILED(hr))
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     if(!lpmcdW)
         return MMSYSERR_INVALPARAM;
@@ -3754,7 +3784,7 @@ UINT WINAPI mixerGetLineControlsW(HMIXEROBJ hmix, LPMIXERLINECONTROLSW lpmlcW,
 
     hr = WINMM_InitMMDevices();
     if(FAILED(hr))
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     if(fdwControls & ~(MIXER_GETLINECONTROLSF_ALL |
                 MIXER_GETLINECONTROLSF_ONEBYID |
@@ -3972,7 +4002,7 @@ UINT WINAPI mixerGetLineInfoW(HMIXEROBJ hmix, LPMIXERLINEW lpmliW, DWORD fdwInfo
 
     hr = WINMM_InitMMDevices();
     if(FAILED(hr))
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     if(!lpmliW || lpmliW->cbStruct < sizeof(MIXERLINEW))
         return MMSYSERR_INVALPARAM;
@@ -4098,7 +4128,7 @@ UINT WINAPI mixerSetControlDetails(HMIXEROBJ hmix, LPMIXERCONTROLDETAILS lpmcd,
     TRACE("(%p, %p, %x)\n", hmix, lpmcd, fdwDetails);
 
     if(!WINMM_StartDevicesThread())
-        return MMSYSERR_ERROR;
+        return MMSYSERR_NODRIVER;
 
     if((fdwDetails & MIXER_SETCONTROLDETAILSF_QUERYMASK) ==
             MIXER_SETCONTROLDETAILSF_CUSTOM)




More information about the wine-cvs mailing list