tizenaudio-sink: Reset pollfd's revents after use 20/272120/1 accepted/tizen/unified/20220314.125239 submit/tizen/20220310.012845
authorjungsup lee <jungsup4.lee@samsung.com>
Mon, 21 Feb 2022 04:17:50 +0000 (13:17 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Wed, 9 Mar 2022 18:14:35 +0000 (03:14 +0900)
revents should be cleared after handling POLLERR. mainloop send a lot of
async message to I/O thread that is stucking on writing pcm. After that,
I/O thread couldn't call poll api because of handling asyncq message.

[Version] 15.0.3
[Issue Type] Bug fix

Change-Id: Ib806cdd77a86fae648b08a5b5e1edc1ed60fbec5
Signed-off-by: jungsup lee <jungsup4.lee@samsung.com>
packaging/pulseaudio-modules-tizen.spec
src/module-tizenaudio-sink.c

index 667909a..64ffcb3 100644 (file)
@@ -2,7 +2,7 @@
 
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          15.0.2
+Version:          15.0.3
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 9dc3226..6c56de9 100644 (file)
@@ -150,6 +150,9 @@ static int build_pollfd(struct userdata *u) {
     u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1);
     pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL);
     ret = pa_hal_interface_pcm_get_fd(u->hal_interface, u->pcm_handle, &fd);
+
+    pa_log_info("get fd(%d) of PCM device successfully", fd);
+
     if (ret < 0 || fd < 0) {
         pa_log_error("Failed to get fd(%d) of PCM device %d", fd, ret);
         return -1;
@@ -402,6 +405,7 @@ static int process_render(struct userdata *u, pa_usec_t now) {
     void *p;
     size_t frames_to_write, frame_size;
     uint32_t avail = 0;
+    pa_usec_t before_write, after_write;
 
     pa_assert(u);
 
@@ -449,7 +453,12 @@ static int process_render(struct userdata *u, pa_usec_t now) {
         pa_sink_render_full(u->sink, frames_to_write * frame_size, &chunk);
         p = pa_memblock_acquire(chunk.memblock);
 
+        before_write = pa_rtclock_now();
         pa_hal_interface_pcm_write(u->hal_interface, u->pcm_handle, (const char*)p + chunk.index, (uint32_t)frames_to_write);
+        after_write = pa_rtclock_now();
+
+        if (after_write - before_write > 10 * PA_USEC_PER_MSEC)
+            pa_log_warn("write takes long time %" PRIu64 " : (%" PRIu64 " - %" PRIu64 ")", 10 * PA_USEC_PER_MSEC, after_write, before_write);
 
         pa_memblock_release(chunk.memblock);
         pa_memblock_unref(chunk.memblock);
@@ -532,9 +541,12 @@ static void thread_func(void *userdata) {
                 pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL);
                 revents = pollfd->revents;
                 if (revents & ~POLLOUT) {
-                    pa_log_debug("Poll error 0x%x occured, try recover.", revents);
+                    pa_log_error("Poll error 0x%x(%d) occured, try recover.", revents, pollfd->fd);
                     pa_hal_interface_pcm_recover(u->hal_interface, u->pcm_handle, revents);
                     u->first = true;
+
+                    /* Need to reset revents because pa_rtpoll_run just returns without calling poll */
+                    pollfd->revents = 0;
                     revents = 0;
                 } else {
                     //pa_log_debug("Poll wakeup.", revents);