From: Jaechul Lee Date: Wed, 27 May 2020 01:41:01 +0000 (+0900) Subject: tone-player: Add sink_input_detach callback X-Git-Tag: submit/tizen/20200608.021130^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=18b4796906c12d7e65b14372740b8dfc3c7c26ea;p=platform%2Fcore%2Fmultimedia%2Fpulseaudio-modules-tizen.git tone-player: Add sink_input_detach callback 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 --- diff --git a/packaging/pulseaudio-modules-tizen.spec b/packaging/pulseaudio-modules-tizen.spec index 64e1ab1..64bc990 100644 --- a/packaging/pulseaudio-modules-tizen.spec +++ b/packaging/pulseaudio-modules-tizen.spec @@ -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+ diff --git a/src/module-sound-player.c b/src/module-sound-player.c index 143b975..0322544 100644 --- a/src/module-sound-player.c +++ b/src/module-sound-player.c @@ -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; } diff --git a/src/module-tone-player.c b/src/module-tone-player.c index 99866ec..de3d2f6 100644 --- a/src/module-tone-player.c +++ b/src/module-tone-player.c @@ -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); }