--- SlimServer_v6.0b2/Slim/Player/SLIMP3.pm Sat Mar 19 02:43:38 2005 +++ SlimS-changes-used-v6.0b2/Slim/Player/SLIMP3.pm Sat Mar 19 14:07:39 2005 @@ -15,6 +15,13 @@ use Slim::Utils::Misc; use Slim::Hardware::mas3507d; use Slim::Networking::Stream; +use Slim::Utils::Timers; +use Slim::Player::Client; +use Slim::Networking::Protocol; +use Socket; # for sockaddr_in + +my $CLIENTTIMEOUT = 30; # in seconds +my $CHECKCLIENTEVERY = 5; # in seconds use base qw(Slim::Player::Player); @@ -51,13 +58,44 @@ } Slim::Utils::Prefs::set("clients", join(',', @uniq)); - + # Turn on readUDP in the select loop. $SLIMP3Connected = 1; - + + # setup timer to keep checking if client is still available + $client->lastReplyTime(Time::HiRes::time()); + Slim::Utils::Timers::setTimer($client, (Time::HiRes::time() + $CHECKCLIENTEVERY), \&checkSLIMP3); + return $client; } +sub checkSLIMP3 { + my $client = shift; + my $now; + my $deltaTime; + + $now = Time::HiRes::time(); + $deltaTime = $now-$client->lastReplyTime; + + if ($deltaTime > $CLIENTTIMEOUT ) { + # we have lost the client, so clean up + my ($clientport, $clientip) = sockaddr_in($client->paddr); + msg("Client: ".inet_ntoa($clientip)." last responded $deltaTime seconds ago and is being timed out.\n"); + msg("The client is being forgotten about\n"); + #Slim::Player::Client::forgetClient($client->id()); + Slim::Player::Client::forgetlostClient($client->id()); + + } else { + if (($now-$client->lastReplyTime) > $CHECKCLIENTEVERY ) { + # only send the echo packet if we have not heard from the client anyway + Slim::Networking::Protocol::sendEchoToClient($client); + } + + # Call ourselves again after $CHECKCLIENTEVERY seconds + Slim::Utils::Timers::setTimer($client, ($now + $CHECKCLIENTEVERY), \&checkSLIMP3); + } +} + sub connected { return 1; } @@ -181,7 +219,8 @@ my $frame; assert($client->udpsock); $frame = 'l '.$data; - send($client->udpsock, $frame, 0, $client->paddr()); + #send($client->udpsock, $frame, 0, $client->paddr()); + $client->udpsock->send($frame, 0, $client->paddr()); } sub udpstream { @@ -196,7 +235,8 @@ $frame .= $chunk; - send($client->udpsock, $frame, 0, $client->paddr()); + #send($client->udpsock, $frame, 0, $client->paddr()); + $client->udpsock->send($frame, 0, $client->paddr()); } sub i2c { @@ -204,7 +244,8 @@ $::d_i2c && msg("i2c: sending ".length($data)." bytes\n"); - send($client->udpsock, '2 '.$data, 0, $client->paddr); + #send($client->udpsock, '2 '.$data, 0, $client->paddr); + $client->udpsock->send('2 '.$data, 0, $client->paddr); } sub volume {