replace source SET_STATE handlers with callbacks 33/227733/2 submit/tizen/20200316.105549
authorSeungbae Shin <seungbae.shin@samsung.com>
Mon, 16 Mar 2020 05:58:32 +0000 (14:58 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Mon, 16 Mar 2020 06:45:58 +0000 (15:45 +0900)
[Version] 13.0.5
[Issue Type] Bug / Upgrade

Change-Id: I46b2885d566b8ebcdc555d28260f4ce25f7fe7d2

packaging/pulseaudio-modules-tizen.spec
src/module-tizenaudio-source.c

index 0252e9e..1ae2b33 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          13.0.4
+Version:          13.0.5
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 098e1f9..81dfc36 100644 (file)
@@ -208,6 +208,50 @@ fail:
     return -PA_ERR_IO;
 }
 
+/* Called from the IO thread. */
+static int source_set_state_in_io_thread_cb(pa_source *s, pa_source_state_t new_state, pa_suspend_cause_t new_suspend_cause) {
+    struct userdata *u;
+    int r;
+
+    pa_assert(s);
+    pa_assert_se(u = s->userdata);
+
+    /* It may be that only the suspend cause is changing, in which case there's
+     * nothing more to do. */
+    if (new_state == s->thread_info.state)
+        return 0;
+
+    switch (new_state) {
+        case PA_SOURCE_SUSPENDED: {
+            pa_assert(PA_SOURCE_IS_OPENED(s->thread_info.state));
+            if ((r = suspend(u)) < 0)
+                return r;
+            break;
+        }
+
+        case PA_SOURCE_IDLE:
+        case PA_SOURCE_RUNNING: {
+            if (s->thread_info.state == PA_SOURCE_INIT) {
+                if (build_pollfd(u) < 0)
+                    return -PA_ERR_IO;
+            }
+
+            if (s->thread_info.state == PA_SOURCE_SUSPENDED) {
+                if ((r = unsuspend(u)) < 0)
+                    return r;
+            }
+            break;
+        }
+
+        case PA_SOURCE_UNLINKED:
+        case PA_SOURCE_INIT:
+        case PA_SOURCE_INVALID_STATE:
+            break;
+    }
+
+    return 0;
+}
+
 static int source_process_msg(
         pa_msgobject *o,
         int code,
@@ -216,39 +260,8 @@ static int source_process_msg(
         pa_memchunk *chunk) {
 
     struct userdata *u = PA_SOURCE(o)->userdata;
-    int r;
 
     switch (code) {
-        case PA_SOURCE_MESSAGE_SET_STATE:
-            switch ((pa_source_state_t)PA_PTR_TO_UINT(data)) {
-                case PA_SOURCE_SUSPENDED: {
-                    pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
-                    if ((r = suspend(u)) < 0)
-                        return r;
-                    break;
-                }
-
-                case PA_SOURCE_IDLE:
-                case PA_SOURCE_RUNNING: {
-                    if (u->source->thread_info.state == PA_SOURCE_INIT) {
-                        if (build_pollfd(u) < 0)
-                            return -PA_ERR_IO;
-                    }
-
-                    if (u->source->thread_info.state == PA_SOURCE_SUSPENDED) {
-                        if ((r = unsuspend(u)) < 0)
-                            return r;
-                    }
-                    break;
-                }
-
-                case PA_SOURCE_UNLINKED:
-                case PA_SOURCE_INIT:
-                case PA_SOURCE_INVALID_STATE:
-                    break;
-            }
-            break;
-
         case PA_SOURCE_MESSAGE_GET_LATENCY: {
             pa_usec_t now = pa_rtclock_now();
             *((pa_usec_t*)data) = u->timestamp > now ? 0ULL : now - u->timestamp;
@@ -530,6 +543,7 @@ int pa__init(pa_module*m) {
     }
 
     u->source->parent.process_msg = source_process_msg;
+    u->source->set_state_in_io_thread = source_set_state_in_io_thread_cb;
     u->source->update_requested_latency = source_update_requested_latency_cb;
     u->source->userdata = u;