From 7a35e9c6b3a8ec4eb45b708b32b175e1f4419983 Mon Sep 17 00:00:00 2001 From: tangjie02 Date: Mon, 11 Jul 2022 21:00:16 +0800 Subject: [PATCH 2/2] feature(audio): Try reconnection if failed to connect pulseaudio service firstly. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 如果第一次链接puluseaudio失败,也进行重新连接尝试,因为pulseaudio可能在kiran-session-daemon之后启动 Signed-off-by: tangjie02 --- plugins/audio/pulse/pulse-backend.cpp | 50 ++++++++++++++------------- plugins/audio/pulse/pulse-backend.h | 4 +-- plugins/audio/pulse/pulse-context.cpp | 6 ++-- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/plugins/audio/pulse/pulse-backend.cpp b/plugins/audio/pulse/pulse-backend.cpp index e1844dc..5190eb4 100644 --- a/plugins/audio/pulse/pulse-backend.cpp +++ b/plugins/audio/pulse/pulse-backend.cpp @@ -16,8 +16,10 @@ namespace Kiran { +#define MAX_RECONNECTION_NUM 50 + PulseBackend::PulseBackend() : state_(AudioState::AUDIO_STATE_IDLE), - connected_once_(false), + reconnection_count_(0), reconnection_handle_(0) { this->context_ = std::make_shared(); @@ -99,7 +101,7 @@ bool PulseBackend::init() this->set_state(AudioState::AUDIO_STATE_CONNECTING); - if (!this->context_->connect(false)) + if (!this->context_->connect(true)) { this->set_state(AudioState::AUDIO_STATE_FAILED); return false; @@ -110,7 +112,7 @@ bool PulseBackend::init() void PulseBackend::set_state(AudioState state) { - KLOG_PROFILE("state: %d.", state); + KLOG_DEBUG("Audio state: %d.", state); if (this->state_ != state) { @@ -121,7 +123,16 @@ void PulseBackend::set_state(AudioState state) bool PulseBackend::try_reconnection() { - KLOG_PROFILE(""); + ++this->reconnection_count_; + + KLOG_DEBUG("Try to reconnect pulseaudio service. reconnection count: %d.", this->reconnection_count_); + + if (this->reconnection_count_ > MAX_RECONNECTION_NUM) + { + KLOG_WARNING("The maximum number of reconnections (%d) has been exceeded. Stop reconnection", MAX_RECONNECTION_NUM); + this->reconnection_handle_ = 0; + return G_SOURCE_REMOVE; + } if (this->context_->connect(true)) { @@ -168,38 +179,28 @@ void PulseBackend::reset_data() void PulseBackend::on_connection_state_changed_cb(PulseConnectionState connection_state) { - KLOG_PROFILE("connection state: %d.", connection_state); + KLOG_DEBUG("Connection state: %d.", connection_state); switch (connection_state) { case PulseConnectionState::PULSE_CONNECTION_DISCONNECTED: { - // 如果之前已经成功连接过一次,此时突然断开了连接,则重新进行连接 // 重新连接之前需要清理掉之前的数据,需要测试一下重启pulseaudio服务程序会不会出问题 this->reset_data(); + this->set_state(AudioState::AUDIO_STATE_CONNECTING); - if (this->connected_once_) + if (this->reconnection_handle_) { - this->set_state(AudioState::AUDIO_STATE_CONNECTING); - - if (this->reconnection_handle_) - { - KLOG_DEBUG("The reconnection handle is already exist. handle: %d.", this->reconnection_handle_); - break; - } - - if (!this->context_->connect(true)) - { - auto timeout_source = Glib::TimeoutSource::create(200); - timeout_source->connect(sigc::mem_fun(this, &PulseBackend::try_reconnection)); - auto glib_context = Glib::wrap(g_main_context_get_thread_default()); - this->reconnection_handle_ = timeout_source->attach(glib_context); - } + KLOG_DEBUG("The reconnection handle is already exist. handle: %d.", this->reconnection_handle_); } else { - this->set_state(AudioState::AUDIO_STATE_FAILED); + auto timeout_source = Glib::TimeoutSource::create(400); + timeout_source->connect(sigc::mem_fun(this, &PulseBackend::try_reconnection)); + auto glib_context = Glib::wrap(g_main_context_get_thread_default()); + this->reconnection_handle_ = timeout_source->attach(glib_context); } + break; } case PulseConnectionState::PULSE_CONNECTION_CONNECTING: @@ -209,7 +210,8 @@ void PulseBackend::on_connection_state_changed_cb(PulseConnectionState connectio break; case PulseConnectionState::PULSE_CONNECTION_CONNECTED: { - this->connected_once_ = true; + // 如果连接成功,重连次数清0 + this->reconnection_count_ = 0; this->set_state(AudioState::AUDIO_STATE_READY); break; } diff --git a/plugins/audio/pulse/pulse-backend.h b/plugins/audio/pulse/pulse-backend.h index 5494c32..1d27bf2 100644 --- a/plugins/audio/pulse/pulse-backend.h +++ b/plugins/audio/pulse/pulse-backend.h @@ -171,8 +171,8 @@ private: // 可用状态 AudioState state_; - // 是否成功连接过一次 - bool connected_once_; + // 重新连接次数 + int32_t reconnection_count_; uint32_t reconnection_handle_; PulseServerInfo server_info_; diff --git a/plugins/audio/pulse/pulse-context.cpp b/plugins/audio/pulse/pulse-context.cpp index 699b7c6..eb3e8a5 100644 --- a/plugins/audio/pulse/pulse-context.cpp +++ b/plugins/audio/pulse/pulse-context.cpp @@ -56,7 +56,7 @@ PulseContext::~PulseContext() bool PulseContext::connect(bool wait_for_daemon) { - KLOG_PROFILE("wait for deamon: %d.", wait_for_daemon); + KLOG_DEBUG("Wait for deamon: %d.", wait_for_daemon); RETURN_VAL_IF_FALSE(this->main_loop_ != NULL, false); @@ -75,7 +75,6 @@ bool PulseContext::connect(bool wait_for_daemon) pa_context_set_state_callback(this->context_, &PulseContext::on_pulse_state_cb, this); pa_context_flags_t flags = wait_for_daemon ? PA_CONTEXT_NOFAIL : PA_CONTEXT_NOFLAGS; - if (pa_context_connect(this->context_, NULL, flags, NULL) == 0) { this->set_connection_state(PulseConnectionState::PULSE_CONNECTION_CONNECTING); @@ -83,6 +82,7 @@ bool PulseContext::connect(bool wait_for_daemon) } else { + KLOG_WARNING("Failed to connect pulseaudio service."); // on_pulse_state_cb回调函数可能已经进行了释放操作,所以这里需要进一步判断 if (this->context_) { @@ -569,6 +569,8 @@ void PulseContext::on_pulse_state_cb(pa_context *context, void *userdata) PulseContext *self = (PulseContext *)(userdata); auto state = pa_context_get_state(self->context_); + KLOG_DEBUG("Pulse state change, state: %d.", state); + if (state == PA_CONTEXT_READY) { if (self->connection_state_ == PULSE_CONNECTION_LOADING || self->connection_state_ == PULSE_CONNECTION_CONNECTED) -- 2.33.0