ecore_audio wasapi - fix ecore win32 handler deletion and destruction
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Sat, 13 Jan 2018 05:44:07 +0000 (14:44 +0900)
committerWonki Kim <wonki_.kim@samsung.com>
Wed, 17 Jan 2018 09:19:31 +0000 (18:19 +0900)
vtorri pointed this out in T6607. this should fix this.

fixed T6607

@fix

src/lib/ecore_audio/ecore_audio_obj_out_wasapi.c

index 772a826..c016be9 100644 (file)
@@ -57,6 +57,7 @@ struct _Ecore_Audio_Out_Wasapi_Data
    IAudioRenderClient   *render;
    IAudioStreamVolume   *volume;
    WAVEFORMATEXTENSIBLE *wave_format;
+   Ecore_Win32_Handler  *handler;
    HANDLE                event;
    UINT32                NumBufferFrames;
    Eina_Bool             spec_format;
@@ -97,20 +98,25 @@ _ecore_audio_out_wasapi_ecore_audio_volume_set(Eo *eo_obj EINA_UNUSED, Ecore_Aud
      }
 }
 
+static void
+_clear(Ecore_Audio_Out_Wasapi_Data *_pd)
+{
+   if (_pd->event)   CloseHandle(_pd->event);
+   if (_pd->handler) ecore_main_win32_handler_del(_pd->handler);
+   if (_pd->render)  _pd->render->lpVtbl->Release(_pd->render);
+   if (_pd->client)  _pd->client->lpVtbl->Release(_pd->client);
+
+   _pd->event   = NULL;
+   _pd->handler = NULL;
+   _pd->render  = NULL;
+   _pd->client  = NULL;
+   _pd->play    = EINA_FALSE;
+}
 
 static void
 _close_cb(void  *data, const Efl_Event *event EINA_UNUSED)
 {
-   Ecore_Audio_Out_Wasapi_Data *_pd = data;
-
-   if (_pd->event)  CloseHandle(_pd->event);
-   if (_pd->render) _pd->render->lpVtbl->Release(_pd->render);
-   if (_pd->client) _pd->client->lpVtbl->Release(_pd->client);
-
-   _pd->event  = NULL;
-   _pd->render = NULL;
-   _pd->client = NULL;
-   _pd->play = EINA_FALSE;
+   _clear(data);
 }
 
 static void
@@ -224,7 +230,9 @@ _write_cb(void  *data, Ecore_Win32_Handler *wh EINA_UNUSED)
 
    if (_pd->client) _pd->client->lpVtbl->Stop(_pd->client);
 
-   ecore_main_win32_handler_del(_pd->event);
+   if (_pd->handler) ecore_main_win32_handler_del(_pd->handler);
+   _pd->handler = NULL;
+
    efl_event_callback_call(_pd->out, ECORE_AUDIO_OUT_WASAPI_EVENT_STOP, NULL);
 
    _pd->play = EINA_FALSE;
@@ -589,8 +597,9 @@ _ecore_audio_out_wasapi_efl_object_constructor(Eo *eo_obj, Ecore_Audio_Out_Wasap
 }
 
 EOLIAN static void
-_ecore_audio_out_wasapi_efl_object_destructor(Eo *eo_obj, Ecore_Audio_Out_Wasapi_Data *_pd EINA_UNUSED)
+_ecore_audio_out_wasapi_efl_object_destructor(Eo *eo_obj, Ecore_Audio_Out_Wasapi_Data *_pd)
 {
+   _clear(_pd);
    client_connect_count--;
    efl_destructor(efl_super(eo_obj, MY_CLASS));