tone-player: Add sink_input_detach callback 13/234513/5 accepted/tizen/unified/20200615.135431 submit/tizen/20200608.021130 submit/tizen/20200610.005134 submit/tizen/20200610.094452 submit/tizen/20200611.012834 submit/tizen/20200611.075746
authorJaechul Lee <jcsing.lee@samsung.com>
Wed, 27 May 2020 01:41:01 +0000 (10:41 +0900)
committerJaechul Lee <jcsing.lee@samsung.com>
Fri, 29 May 2020 02:34:47 +0000 (11:34 +0900)
sink_input_detach_cb function was added to synchronize I/O and main
thread. This commit fixes the unlink issue(f8cde9099) completely.

In additional, handle_sound_stop returns invalid param error when it is
called with invalid handle.

[Version] 13.0.18
[Issue Type] Bug fix

Change-Id: I1f2ede6c0acc6728e1055317124815db3dbd859c
Signed-off-by: Jaechul Lee <jcsing.lee@samsung.com>
packaging/pulseaudio-modules-tizen.spec
src/module-sound-player.c
src/module-tone-player.c

index 64e1ab1..64bc990 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          13.0.17
+Version:          13.0.18
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 143b975..0322544 100644 (file)
@@ -523,7 +523,7 @@ static void handle_sound_stop(DBusConnection *conn, DBusMessage *msg, void *user
     si = pa_idxset_get_by_index(u->module->core->sink_inputs, stream_idx);
     if (!si) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "%s",
-                            "org.tizen.multimedia.audio.InvalidState");
+                            "org.tizen.multimedia.audio.InvalidArgument");
         return;
     }
 
index 99866ec..de3d2f6 100644 (file)
@@ -129,16 +129,6 @@ struct tone *tone_new(uint32_t index, int rbytes) {
     return t;
 }
 
-void tone_free(struct tone *t) {
-    if (!t)
-        return;
-
-    pa_xfree(t->info);
-    pa_xfree(t);
-
-    return 0;
-}
-
 int tone_peek_fixed_size(struct tone *t, pa_sink_input *si, pa_memchunk *chunk, uint32_t length) {
     short *buf;
     uint32_t i;
@@ -223,7 +213,7 @@ int tone_peek_fixed_size(struct tone *t, pa_sink_input *si, pa_memchunk *chunk,
 static int sink_input_pop_cb(pa_sink_input *i, size_t length, pa_memchunk *chunk) {
     struct tone *t = (struct tone *)i->userdata;
 
-    if (!t)
+    if (!PA_SINK_INPUT_IS_LINKED(i->state))
         return -1;
 
     if (tone_peek_fixed_size(t, i, chunk, length) < 0) {
@@ -240,28 +230,33 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t length, pa_memchunk *chunk
     return 0;
 }
 
-static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
+static void sink_input_detach_cb(pa_sink_input *i) {
     struct tone *t = i->userdata;
 
     if (!t)
         return;
+
+    pa_xfree(t->info);
+    pa_xfree(t);
 }
 
-static void sink_input_kill_cb(pa_sink_input *i) {
-    struct tone *t = i->userdata;
+static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
+    return;
+}
 
-    tone_free(t);
-    pa_sink_input_unlink(i);
-    pa_sink_input_unref(i);
+static void sink_input_kill_cb(pa_sink_input *i) {
+    return;
 }
 
+
 static int sink_input_process_msg(pa_msgobject *o, int code, void*userdata, int64_t offset, pa_memchunk *chunk) {
     pa_sink_input *i = PA_SINK_INPUT(o);
 
     switch (code) {
         case TONE_SOUND_MESSAGE_UNLINK:
-            pa_sink_input_kill(i);
-            break;
+            pa_sink_input_unlink(i);
+            pa_sink_input_unref(i);
+            return 0;
     }
 
     return pa_sink_input_process_msg(o, code, userdata, offset, chunk);
@@ -334,6 +329,7 @@ static void handle_tone_play(DBusConnection *conn, DBusMessage *msg, void *userd
     i->userdata = t;
     i->pop = sink_input_pop_cb;
     i->kill = sink_input_kill_cb;
+    i->detach = sink_input_detach_cb;
     i->process_rewind = sink_input_process_rewind_cb;
     i->parent.process_msg = sink_input_process_msg;
 
@@ -351,7 +347,7 @@ exit:
 static void handle_tone_stop(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     struct userdata *u = (struct userdata *)userdata;
     uint32_t stream_idx;
-    pa_sink_input *si;
+    pa_sink_input *i;
 
     pa_assert(conn);
     pa_assert(msg);
@@ -363,14 +359,15 @@ static void handle_tone_stop(DBusConnection *conn, DBusMessage *msg, void *userd
 
     pa_log_info("stop tone %u", stream_idx);
 
-    si = pa_idxset_get_by_index(u->module->core->sink_inputs, stream_idx);
-    if (!si) {
+    i = pa_idxset_get_by_index(u->module->core->sink_inputs, stream_idx);
+    if (!i) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "%s",
-                            "org.tizen.multimedia.audio.InvalidState");
+                            "org.tizen.multimedia.audio.InvalidArgument");
         return;
     }
 
-    pa_sink_input_kill(si);
+    pa_sink_input_unlink(i);
+    pa_sink_input_unref(i);
 
     pa_dbus_send_empty_reply(conn, msg);
 }