Fix memory leak in case of stopping playback 08/264508/2 accepted/tizen/6.5/unified/20211028.100833 accepted/tizen/unified/20210926.235646 submit/tizen/20210924.075945 submit/tizen/20210928.050031 submit/tizen_6.5/20211028.161801 tizen_6.5.m2_release
authorSeungbae Shin <seungbae.shin@samsung.com>
Thu, 23 Sep 2021 12:11:14 +0000 (21:11 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Fri, 24 Sep 2021 04:05:37 +0000 (13:05 +0900)
[Version] 0.3.6
[Issue Type] Bug

Change-Id: Ic3c4bc7378373909580ade0a261378a2031744dd

packaging/capi-media-wav-player.spec
src/wav_player_private.c

index f407674..4350dc8 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       capi-media-wav-player
 Summary:    A wav player library in Tizen C API
-Version:    0.3.5
+Version:    0.3.6
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index e7899cb..978ed5d 100755 (executable)
@@ -77,24 +77,31 @@ static void __internal_complete_cb(GDBusConnection *connection,
                                        GVariant *params,
                                        gpointer userdata)
 {
-       int handle;
+       gint handle = -1;
+       gboolean stopped_by_user = FALSE;
        struct dbus_cb_data *dbus_data = (struct dbus_cb_data *)userdata;
 
-       g_variant_get(params, "(i)", &handle);
-
        if (!dbus_data) {
-               LOGE("dbus data is null. handle(%d)", handle);
+               LOGE("dbus data is null");
                return;
        }
 
-       if (handle == dbus_data->handle) {
-               g_dbus_connection_signal_unsubscribe(dbus_data->conn, dbus_data->subs_id);
-               g_object_unref(dbus_data->conn);
+       g_variant_get(params, "(ib)", &handle, &stopped_by_user);
+       LOGI("expected handle(%d) callback(%p), incoming handle(%d), stopped_by_user(%d)",
+               dbus_data->handle, dbus_data->cb, handle, stopped_by_user);
+
+       if (handle != dbus_data->handle)
+               return;
+
+       g_dbus_connection_signal_unsubscribe(dbus_data->conn, dbus_data->subs_id);
+       g_object_unref(dbus_data->conn);
 
-               LOGD("user callback for handle(%d) cb(%p)", handle, dbus_data->cb);
+       if (!stopped_by_user) {
+               LOGI("Invoking user callback for handle(%d) cb(%p)", handle, dbus_data->cb);
                dbus_data->cb(handle, dbus_data->user_data);
-               g_free(dbus_data);
        }
+
+       g_free(dbus_data);
 }
 
 int _wav_play_sound(const char *path, sound_stream_info_h stream_info, unsigned loop_count,