pa_assert(u);
pa_mutex_lock(u->msg_mutex);
- if (pa_cond_timedwait(u->msg_cond, u->msg_mutex, MSG_WAIT_TIMEOUT))
- pa_log_error("msg cond wait failed, timeout..");
- else
- pa_log_info("msg cond wakeup");
+
+ while (u->need_pause) {
+ pa_log_info("msg cond wait for resume");
+
+ if (pa_cond_timedwait(u->msg_cond, u->msg_mutex, MSG_WAIT_TIMEOUT))
+ pa_log_error("msg cond wait failed, timeout..");
+ else
+ pa_log_info("msg cond wakeup");
+ }
+
pa_mutex_unlock(u->msg_mutex);
}
for (;;) {
ssize_t sent;
- if (u->need_pause) {
- pa_log_info("msg cond wait for resume");
- msg_cond_wait(u);
- }
+ msg_cond_wait(u);
sent = ipc_push_data(u, p + index, u->write_block_size);
}
if ((recv_len = recv(u->msg_fd, recv_msg , IPC_MAX_MSG_LEN, 0)) > 0) {
+ pa_mutex_lock(u->msg_mutex);
if (!strncmp(recv_msg, MSG_DRAIN_COMPLETE, IPC_MAX_MSG_LEN)) {
pa_log_debug("got drain complete signal [%s]", recv_msg);
pa_cond_signal(u->msg_cond, false);
u->need_pause = false;
pa_cond_signal(u->msg_cond, false);
}
+ pa_mutex_unlock(u->msg_mutex);
}
sched_yield();