1 From b1b5cd6bbb1e0dea35e7b86429ff3e04fd67db9f Mon Sep 17 00:00:00 2001
2 From: Jan Palus <atler@pld-linux.org>
3 Date: Wed, 23 Dec 2020 23:31:20 +0100
4 Subject: [PATCH 1/5] feat(mpd): split noidle into noidle and recv_idle
7 include/adapters/mpd.hpp | 3 ++-
8 src/adapters/mpd.cpp | 15 ++++++++++++---
9 src/modules/mpd.cpp | 3 ++-
10 3 files changed, 16 insertions(+), 5 deletions(-)
12 diff --git a/include/adapters/mpd.hpp b/include/adapters/mpd.hpp
13 index 2a152b01c..2e9b438e8 100644
14 --- a/include/adapters/mpd.hpp
15 +++ b/include/adapters/mpd.hpp
16 @@ -91,7 +91,8 @@ namespace mpd {
24 unique_ptr<mpdstatus> get_status();
25 unique_ptr<mpdstatus> get_status_safe();
26 diff --git a/src/adapters/mpd.cpp b/src/adapters/mpd.cpp
27 index 4a5438ad5..083427a9c 100644
28 --- a/src/adapters/mpd.cpp
29 +++ b/src/adapters/mpd.cpp
30 @@ -201,12 +201,21 @@ namespace mpd {
34 - int mpdconnection::noidle() {
35 + bool mpdconnection::noidle() {
36 + check_connection(m_connection.get());
37 + bool success = true;
39 + success = mpd_send_noidle(m_connection.get());
44 + int mpdconnection::recv_idle() {
45 check_connection(m_connection.get());
47 - if (m_idle && mpd_send_noidle(m_connection.get())) {
50 flags = mpd_recv_idle(m_connection.get(), true);
52 mpd_response_finish(m_connection.get());
53 check_errors(m_connection.get());
55 diff --git a/src/modules/mpd.cpp b/src/modules/mpd.cpp
56 index ea867f281..1ba33c81c 100644
57 --- a/src/modules/mpd.cpp
58 +++ b/src/modules/mpd.cpp
59 @@ -182,7 +182,8 @@ namespace modules {
63 - if ((idle_flags = m_mpd->noidle()) != 0) {
65 + if ((idle_flags = m_mpd->recv_idle()) != 0) {
66 // Update status on every event
67 m_status->update(idle_flags, m_mpd.get());
70 From 1e2d86354cf3553df202e3fddc848ee54b2ff872 Mon Sep 17 00:00:00 2001
71 From: Jan Palus <atler@pld-linux.org>
72 Date: Fri, 25 Dec 2020 01:15:30 +0100
73 Subject: [PATCH 2/5] feat(mpd): reduce wakeups/network traffic when not
77 include/adapters/mpd.hpp | 1 +
78 src/adapters/mpd.cpp | 15 +++++++++++++++
79 src/modules/mpd.cpp | 16 ++++++++++++----
80 3 files changed, 28 insertions(+), 4 deletions(-)
82 diff --git a/include/adapters/mpd.hpp b/include/adapters/mpd.hpp
83 index 2e9b438e8..7f5a43e1b 100644
84 --- a/include/adapters/mpd.hpp
85 +++ b/include/adapters/mpd.hpp
86 @@ -93,6 +93,7 @@ namespace mpd {
90 + int try_recv_idle(int timeout);
92 unique_ptr<mpdstatus> get_status();
93 unique_ptr<mpdstatus> get_status_safe();
94 diff --git a/src/adapters/mpd.cpp b/src/adapters/mpd.cpp
95 index 083427a9c..76f824115 100644
96 --- a/src/adapters/mpd.cpp
97 +++ b/src/adapters/mpd.cpp
105 @@ -222,6 +223,20 @@ namespace mpd {
109 + int mpdconnection::try_recv_idle(int timeout) {
110 + struct pollfd pfd = { m_fd, POLLIN, 0 };
112 + int poll_ret = poll(&pfd, 1, timeout);
114 + if (poll_ret > 0) {
115 + return recv_idle();
116 + } else if (poll_ret == 0) {
119 + throw mpd_exception("poll() returned error: "s + std::strerror(errno));
123 unique_ptr<mpdstatus> mpdconnection::get_status() {
124 check_prerequisites();
125 auto status = make_unique<mpdstatus>(this);
126 diff --git a/src/modules/mpd.cpp b/src/modules/mpd.cpp
127 index 1ba33c81c..9c53378b8 100644
128 --- a/src/modules/mpd.cpp
129 +++ b/src/modules/mpd.cpp
130 @@ -178,12 +178,20 @@ namespace modules {
131 m_status = m_mpd->get_status_safe();
134 + bool track_time = (m_label_time || m_bar_progress) && m_status->match_state(mpdstate::PLAYING);
138 - int idle_flags = 0;
140 - if ((idle_flags = m_mpd->recv_idle()) != 0) {
145 + idle_flags = m_mpd->recv_idle();
147 + idle_flags = m_mpd->try_recv_idle(2000);
150 + if (idle_flags != 0) {
151 // Update status on every event
152 m_status->update(idle_flags, m_mpd.get());
154 @@ -194,7 +202,7 @@ namespace modules {
158 - if ((m_label_time || m_bar_progress) && m_status->match_state(mpdstate::PLAYING)) {
160 auto now = chrono::system_clock::now();
161 auto diff = now - m_lastsync;
164 From 139dca02ae02615cd331d8061ac7c0cae661be25 Mon Sep 17 00:00:00 2001
165 From: Jan Palus <atler@pld-linux.org>
166 Date: Fri, 25 Dec 2020 01:23:34 +0100
167 Subject: [PATCH 3/5] feat(mpd): subscribe only to relevant event types
170 src/adapters/mpd.cpp | 2 +-
171 1 file changed, 1 insertion(+), 1 deletion(-)
173 diff --git a/src/adapters/mpd.cpp b/src/adapters/mpd.cpp
174 index 76f824115..b4567e7f2 100644
175 --- a/src/adapters/mpd.cpp
176 +++ b/src/adapters/mpd.cpp
177 @@ -196,7 +196,7 @@ namespace mpd {
178 void mpdconnection::idle() {
179 check_connection(m_connection.get());
181 - mpd_send_idle(m_connection.get());
182 + mpd_send_idle_mask(m_connection.get(), (mpd_idle) (MPD_IDLE_PLAYER | MPD_IDLE_OPTIONS));
183 check_errors(m_connection.get());
187 From 00eeb73637ff1928c9621fe6008628f04a1cf655 Mon Sep 17 00:00:00 2001
188 From: Jan Palus <atler@pld-linux.org>
189 Date: Fri, 25 Dec 2020 01:31:04 +0100
190 Subject: [PATCH 4/5] feat(mpd): minor optimization of happy code path
193 src/modules/mpd.cpp | 8 +-------
194 1 file changed, 1 insertion(+), 7 deletions(-)
196 diff --git a/src/modules/mpd.cpp b/src/modules/mpd.cpp
197 index 9c53378b8..702fbebf6 100644
198 --- a/src/modules/mpd.cpp
199 +++ b/src/modules/mpd.cpp
200 @@ -149,13 +149,7 @@ namespace modules {
203 bool mpd_module::has_event() {
206 - if (!connected() && m_statebroadcasted == mpd::connection_state::CONNECTED) {
208 - } else if (connected() && m_statebroadcasted == mpd::connection_state::DISCONNECTED) {
211 + bool def = (m_statebroadcasted == (connected() ? mpd::connection_state::DISCONNECTED : mpd::connection_state::CONNECTED));
216 From b073db3569d887a1567a387c3ea71989ffede0cc Mon Sep 17 00:00:00 2001
217 From: Jan Palus <atler@pld-linux.org>
218 Date: Fri, 25 Dec 2020 12:30:10 +0100
219 Subject: [PATCH 5/5] feat(mpd): slightly modify delay calculation between
222 wait 0.5s more on each attempt and cap it at 5s
224 include/modules/mpd.hpp | 2 +-
225 src/modules/mpd.cpp | 4 ++--
226 2 files changed, 3 insertions(+), 3 deletions(-)
228 diff --git a/include/modules/mpd.hpp b/include/modules/mpd.hpp
229 index 04afc97e7..ed591fe42 100644
230 --- a/include/modules/mpd.hpp
231 +++ b/include/modules/mpd.hpp
232 @@ -90,7 +90,7 @@ namespace modules {
233 chrono::system_clock::time_point m_lastsync{};
234 float m_synctime{1.0f};
236 - int m_quick_attempts{0};
237 + int m_connect_attempts{0};
239 // This flag is used to let thru a broadcast once every time
240 // the connection state changes
241 diff --git a/src/modules/mpd.cpp b/src/modules/mpd.cpp
242 index 702fbebf6..3394f42a9 100644
243 --- a/src/modules/mpd.cpp
244 +++ b/src/modules/mpd.cpp
245 @@ -141,10 +141,10 @@ namespace modules {
247 void mpd_module::idle() {
249 - m_quick_attempts = 0;
250 + m_connect_attempts = 0;
253 - sleep(m_quick_attempts++ < 5 ? 0.5s : 2s);
254 + sleep(++m_connect_attempts < 10 ? m_connect_attempts * 0.5s : 5s);