sound-player: fix memory leak in case of stopping playback 09/264509/3 accepted/tizen/6.5/unified/20211028.123509 accepted/tizen/unified/20210926.235653 submit/tizen/20210924.075945 submit/tizen_6.5/20211028.162401 tizen_6.5.m2_release
authorSeungbae Shin <seungbae.shin@samsung.com>
Thu, 23 Sep 2021 12:25:03 +0000 (21:25 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Fri, 24 Sep 2021 04:04:49 +0000 (13:04 +0900)
eos signal with the cause must be sent to client to make proper subscription release

[Version] 13.0.75
[Issue Type] Bug fix

Change-Id: Id318f1a4d18eafeea4e343eef6c02ee63ca2960f

packaging/pulseaudio-modules-tizen.spec
src/module-sound-player.c

index 39724b8..137d868 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          13.0.74
+Version:          13.0.75
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 5e60af2..16212ae 100644 (file)
@@ -80,6 +80,7 @@ static void handle_simple_stop_all(DBusConnection *conn, DBusMessage *msg, void
 static void handle_sample_play(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_sound_play(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_sound_stop(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void send_signal_for_eos(DBusConnection *conn, int32_t stream_idx, dbus_bool_t stopped_by_user);
 
 enum method_handler_index {
     METHOD_HANDLER_SIMPLE_PLAY,
@@ -537,10 +538,12 @@ static void handle_sound_stop(DBusConnection *conn, DBusMessage *msg, void *user
     pa_sink_input_kill(si);
 
     pa_dbus_send_empty_reply(conn, msg);
+
+    send_signal_for_eos(conn, stream_idx, TRUE);
 }
 
 static DBusHandlerResult handle_methods(DBusConnection *conn, DBusMessage *msg, void *userdata) {
-       int idx = 0;
+    int idx = 0;
 
     pa_assert(conn);
     pa_assert(msg);
@@ -588,16 +591,21 @@ static DBusHandlerResult method_handler_for_vt(DBusConnection *c, DBusMessage *m
     return DBUS_HANDLER_RESULT_HANDLED;
 }
 
-static void send_signal_for_eos(struct userdata *u, int32_t stream_idx) {
+static void send_signal_for_eos(DBusConnection *conn, int32_t stream_idx, dbus_bool_t stopped_by_user) {
     DBusMessage *signal_msg = NULL;
 
-    pa_assert(u);
+    pa_assert(conn);
 
-    pa_log_info("Send EOS signal for stream_idx(%d)", stream_idx);
+    pa_log_info("Send EOS signal for stream_idx(%d), stopped_by_user(%d)", stream_idx, stopped_by_user);
 
-    pa_assert_se((signal_msg = dbus_message_new_signal(SOUND_PLAYER_OBJECT_PATH, SOUND_PLAYER_INTERFACE, SOUND_PLAYER_SIGNAL_EOS)));
-    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_INT32, &stream_idx, DBUS_TYPE_INVALID));
-    pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->dbus_conn), signal_msg, NULL));
+    pa_assert_se((signal_msg = dbus_message_new_signal(SOUND_PLAYER_OBJECT_PATH,
+                                                       SOUND_PLAYER_INTERFACE,
+                                                       SOUND_PLAYER_SIGNAL_EOS)));
+    pa_assert_se(dbus_message_append_args(signal_msg,
+                                          DBUS_TYPE_INT32, &stream_idx,
+                                          DBUS_TYPE_BOOLEAN, &stopped_by_user,
+                                          DBUS_TYPE_INVALID));
+    pa_assert_se(dbus_connection_send(conn, signal_msg, NULL));
     dbus_message_unref(signal_msg);
 }
 #endif
@@ -758,8 +766,10 @@ fail:
 static pa_hook_result_t sink_input_unlink_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
     int32_t *stream_idx = NULL;
     uint32_t idx = 0;
+
     pa_core_assert_ref(core);
     pa_sink_input_assert_ref(i);
+    pa_assert(u);
 
     pa_log_debug("start sink_input_unlink_cb, i(%p, index:%u)", i, i->index);
 
@@ -768,7 +778,7 @@ static pa_hook_result_t sink_input_unlink_cb(pa_core *core, pa_sink_input *i, st
         if (*stream_idx == (int32_t)(i->index)) {
 #ifndef USE_DBUS_PROTOCOL
             /* Send EOS signal for this stream */
-            send_signal_for_eos(u, *stream_idx);
+            send_signal_for_eos(pa_dbus_connection_get(u->dbus_conn), *stream_idx, FALSE);
 #endif
             pa_idxset_remove_by_data(u->stream_idxs, stream_idx, NULL);
             pa_xfree(stream_idx);