OSDN Git Service

[wasapi] Fix memory leak
authorStarg <starg@users.osdn.me>
Sun, 29 Mar 2020 12:39:20 +0000 (21:39 +0900)
committerStarg <starg@users.osdn.me>
Sun, 29 Mar 2020 12:39:20 +0000 (21:39 +0900)
timidity/wasapi_a.c

index 40b01c4..c66c8d3 100644 (file)
@@ -576,6 +576,10 @@ static int get_device(IMMDevice **ppMMDevice, int devnum)
                goto error;             
        if(pszDeviceId)
                CoTaskMemFree(pszDeviceId);
+       if(pdev)
+               IMMDevice_Release(pdev);
+       if(pdc)
+               IMMDeviceCollection_Release(pdc);
        if(pde)
                IMMDeviceEnumerator_Release(pde);
        return TRUE;
@@ -583,6 +587,10 @@ static int get_device(IMMDevice **ppMMDevice, int devnum)
 error: 
        if(pszDeviceId)
                CoTaskMemFree(pszDeviceId);
+       if(pdev)
+               IMMDevice_Release(pdev);
+       if(pdc)
+               IMMDeviceCollection_Release(pdc);
        if(pde)
                IMMDeviceEnumerator_Release(pde);
        return FALSE;
@@ -635,7 +643,7 @@ static void print_device_list(void)
        device[0].LatencyMax = LatencyMax;
        device[0].LatencyMin = LatencyMin;
        if(tmpClient){
-               tmpClient->lpVtbl->Release(tmpClient);
+               IAudioClient_Release(tmpClient);
                tmpClient = NULL;
        }       
        if(defdev){
@@ -686,7 +694,7 @@ static void print_device_list(void)
                device[i+1].LatencyMax = LatencyMax;
                device[i+1].LatencyMin = LatencyMin;
                if(tmpClient){
-                       tmpClient->lpVtbl->Release(tmpClient);
+                       IAudioClient_Release(tmpClient);
                        tmpClient = NULL;
                }               
                if(dev){
@@ -694,12 +702,12 @@ static void print_device_list(void)
                        dev = NULL;
                }
                if(pps){
-                       pps->lpVtbl->Release(pps); 
+                       IPropertyStore_Release(pps);
                        pps = NULL;
                }
        }
        if(pdc)
-               pdc->lpVtbl->Release(pdc); 
+               IMMDeviceCollection_Release(pdc);
        if(pde)
                IMMDeviceEnumerator_Release(pde);
        for(i = 0; i < num; i++){
@@ -711,9 +719,9 @@ static void print_device_list(void)
        return;
 error1:
        if(tmpClient)
-               tmpClient->lpVtbl->Release(tmpClient);
+               IAudioClient_Release(tmpClient);
        if(pdc){
-               pdc->lpVtbl->Release(pdc);
+               IMMDeviceCollection_Release(pdc);
        }
        if(pde)
                IMMDeviceEnumerator_Release(pde);
@@ -1224,7 +1232,7 @@ int wasapi_device_list(WASAPI_DEVICELIST *device)
        device[0].LatencyMax = LatencyMax;
        device[0].LatencyMin = LatencyMin;
        if(tmpClient){
-               tmpClient->lpVtbl->Release(tmpClient);
+               IAudioClient_Release(tmpClient);
                tmpClient = NULL;
        }       
        if(defdev){
@@ -1275,7 +1283,7 @@ int wasapi_device_list(WASAPI_DEVICELIST *device)
                device[i+1].LatencyMax = LatencyMax;
                device[i+1].LatencyMin = LatencyMin;
                if(tmpClient){
-                       tmpClient->lpVtbl->Release(tmpClient);
+                       IAudioClient_Release(tmpClient);
                        tmpClient = NULL;
                }               
                if(dev){
@@ -1283,21 +1291,21 @@ int wasapi_device_list(WASAPI_DEVICELIST *device)
                        dev = NULL;
                }
                if(pps){
-                       pps->lpVtbl->Release(pps); 
+                       IPropertyStore_Release(pps);
                        pps = NULL;
                }
        }
        if(pdc)
-               pdc->lpVtbl->Release(pdc); 
+               IMMDeviceCollection_Release(pdc);
        if(pde)
                IMMDeviceEnumerator_Release(pde);
        return num + 1; // +1 def dev
 
 error1:
        if(tmpClient)
-               tmpClient->lpVtbl->Release(tmpClient);
+               IAudioClient_Release(tmpClient);
        if(pdc){
-               pdc->lpVtbl->Release(pdc);
+               IMMDeviceCollection_Release(pdc);
        }
        if(pde)
                IMMDeviceEnumerator_Release(pde);