+method sleep_before_reconnection {
+ $self->debug( "Waiting for "
+ . duration_exact($reconnect_delay)
+ . " before re-connecting" );
+
+ $mpd->loop->add(
+ IO::Async::Timer::Countdown->new(
+ delay => $reconnect_delay,
+ on_expire => sub { $mpd->loop->stop },
+ )->start
+ );
+
+ $reconnect_delay = $reconnect_delay * 1.5;
+ $reconnect_delay = 120 if $reconnect_delay > 120;
+ $mpd->loop->run;
+}
+
+method pulse {
+ unless ($mpd_connected) {
+ $mpd->connect->then(
+ sub {
+ $mpd_connected = 1;
+ $playlist_needs_filling = 1;
+ $reconnect_delay = $opt->initial_reconnect_delay;
+ }
+ )->get;
+
+ $mpd->loop->later( sub { $self->pulse } );
+ return;
+ }
+
+ if ($db_needs_update) {
+ $self->update_db;
+ $mpd->loop->later( sub { $self->pulse } );
+ return;
+ }
+
+ if ($playlist_needs_filling) {
+ $self->queue_songs;
+ $mpd->loop->later( sub { $self->pulse } );
+ return;
+ }
+
+ $log->debug("Waiting idle. PID=$$");
+ $last_mpd_comm = time;
+ $idler = $mpd->send("idle database playlist");
+ my $result = $idler->get;
+ undef $idler;
+
+ if ( ref $result and $result->{changed} ) {
+ my $changed = $result->{changed};
+ $changed = [$changed] unless ref $changed;
+
+ $mpd->emit($_) for @$changed;
+ }
+
+ $log->trace('got out of idle');
+ $mpd->loop->stop;
+}
+