+ );
+ }
+
+ method prepare_to_wait_idle {
+ $log->trace('declaring idle mode');
+ $mpd->send('idle database playlist')->on_done(
+ sub {
+ my $result = shift;
+
+ if ( $result->{changed} eq 'database' ) {
+ $db_needs_update = 1;
+ $self->prepare_to_wait_idle;
+ }
+ elsif ( $result->{changed} eq 'playlist' ) {
+ $self->queue_songs( undef,
+ sub { $self->prepare_to_wait_idle } );
+ }
+ else {
+ use JSON;
+ $log->warn(
+ "Unknown result from idle: " . to_json($result) );
+ $self->prepare_to_wait_idle;
+ }
+ }
+ );
+ }
+
+ method run {
+ $mpd->on(
+ close => sub {
+ die "Connection to MPD lost";
+ }
+ );
+
+ $self->prepare_to_wait_idle;
+ }
+
+ method stop {
+ undef $mpd;
+
+ if ($db) {
+ if ($db->{ActiveKids}) {
+ $log->warn("$db->{ActiveKids} active DB statements");
+ for my $st ( @{ $db->{ChildHandles} } ) {
+ next unless $st->{Active};
+ while(my($k,$v) = each %$st) {
+ $log->debug("$k = ".($v//'<NULL>'));
+ }
+ }
+ }
+
+ $db->disconnect;
+ undef $db;