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;
void *p;
size_t frames_to_write, frame_size;
uint32_t avail = 0;
+ pa_usec_t before_write, after_write;
pa_assert(u);
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);
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);