return \%st;
}
+my $CONF = undef;
+
+sub configured_connection (;$) {
+ my ($quietp) = @_;
+ $CONF //= load_config $C{config};
+ return connect_to_server %$CONF, $quietp // 0;
+}
+
sub get_state () {
- my $sk = connect_to_server $C{config};
+ my $sk = configured_connection;
send_command0 $sk, "log";
my $st = get_state0 $sk;
close $sk;
sub watch_and_notify0 ($) {
my ($now_playing) = @_;
- my $sk = connect_to_server $C{config}, 1;
- my $sk_log = connect_to_server $C{config}, 1;
+ my $sk = configured_connection 1;
+ my $sk_log = configured_connection 1;
send_command0 $sk_log, "log";
my $st = get_state0 $sk_log;
}
if (!$sk_log) { $loss = "EOF from server"; last WATCH; }
- select my $rdout = $rdin, undef, undef, undef;
- READ: for (;;) {
- my ($b, $n);
- eval { $n = sysread $sk_log, $b, 4096; };
- if ($@ && $@->errno == EAGAIN) { last READ; }
- elsif ($@) { $loss = "error from read: " . $@->errno; last WATCH; }
- elsif (!$n) { close $sk_log; $sk_log = undef; }
- else { $buffer .= $b; }
- }
+ my $nfd = select my $rdout = $rdin, undef, undef, 60;
+ if (!$nfd) {
+ eval { print $sk_log "."; flush $sk_log; };
+ if ($@) { $loss = "error from write: " . $@->errno; last WATCH; }
+ @lines = ();
+ } else {
+ READ: for (;;) {
+ my ($b, $n);
+ eval { $n = sysread $sk_log, $b, 4096; };
+ if ($@ && $@->errno == EAGAIN) { last READ; }
+ elsif ($@) { $loss = "error from read: " . $@->errno; last WATCH; }
+ elsif (!$n) { close $sk_log; $sk_log = undef; last READ; }
+ else { $buffer .= $b; }
+ }
- @lines = split /\n/, $buffer, -1;
- $buffer = pop @lines;
+ @lines = split /\n/, $buffer, -1;
+ $buffer = pop @lines;
+ }
}
notify "$TITLE state", "Lost connection: $loss";
sub { run_discard_output "amixer", "sset", $C{mixer}, "5\%-"; };
$OP{"scratch"} = sub {
- my $sk = connect_to_server $C{config};
+ my $sk = configured_connection;
send_command $sk, "scratch";
close $sk;
};
$OP{"enable/disable"} = sub {
my $st = get_state;
- my $sk = connect_to_server $C{config};
+ my $sk =configured_connection;
if ($st->{play}) { send_command $sk, "disable"; }
else { send_command $sk, "enable"; }
close $sk;
$OP{"play/pause"} = sub {
my $st = get_state;
- my $sk = connect_to_server $C{config};
+ my $sk = configured_connection;
if (!$st->{play}) {
send_command $sk, "enable";
if ($st->{pause}) { send_command $sk, "resume"; }
};
$OP{"now-playing"} = sub {
- my $sk = connect_to_server $C{config};
+ my $sk = configured_connection;
my $info = get_now_playing $sk;
close $sk;
print format_now_playing %$info;
};
$OP{"notify-now-playing"} = sub {
- my $sk = connect_to_server $C{config};
+ my $sk = configured_connection;
my $info = get_now_playing $sk;
close $sk;
notify "$TITLE: Now playing", format_now_playing %$info;