Index: Slim/Networking/Slimproto.pm =================================================================== --- Slim/Networking/Slimproto.pm (revision 2531) +++ Slim/Networking/Slimproto.pm (working copy) @@ -342,7 +342,9 @@ while (Slim::Buttons::Common::mode($client) eq 'block') { Slim::Buttons::Block::unblock($client); } - $client->volume($client->volume()); + # make sure volume is set, without changing temp setting + $client->volume($client->volume(), + defined($client->tempVolume())); } return; } Index: Slim/Player/SLIMP3.pm =================================================================== --- Slim/Player/SLIMP3.pm (revision 2531) +++ Slim/Player/SLIMP3.pm (working copy) @@ -95,7 +95,9 @@ my $client = shift; my $paused = shift; - $client->volume($client->volume()); + # make sure volume is set, without changing temp setting + $client->volume($client->volume(), + defined($client->tempVolume())); $client->i2c( Slim::Hardware::mas3507d::masWrite('config','00002') @@ -119,7 +121,9 @@ # sub resume { my $client = shift; - $client->volume($client->volume()); + # make sure volume is set, without changing temp setting + $client->volume($client->volume(), + defined($client->tempVolume())); Slim::Networking::Stream::unpause($client); $client->SUPER::resume(); return 1; Index: Slim/Player/Squeezebox.pm =================================================================== --- Slim/Player/Squeezebox.pm (revision 2531) +++ Slim/Player/Squeezebox.pm (working copy) @@ -96,7 +96,9 @@ my $quickstart = shift; $client->stream('s', $paused, $format); - $client->volume($client->volume()); + # make sure volume is set, without changing temp setting + $client->volume($client->volume(), + defined($client->tempVolume())); Slim::Utils::Timers::killTimers($client, \&quickstart); if ($quickstart) { Index: Slim/Player/Client.pm =================================================================== --- Slim/Player/Client.pm (revision 2531) +++ Slim/Player/Client.pm (working copy) @@ -608,6 +608,7 @@ our $defaultPrefs = { 'maxBitrate' => undef # will be set by the client device OR default to server pref when accessed. ,'alarmvolume' => 50 + ,'alarmfadeseconds' => 60 # fade in alarm slowly ,'alarm' => 0 ,'lameQuality' => 9 ,'playername' => undef @@ -724,6 +725,9 @@ $client->[92] = undef; # currentPlaylistModified $client->[93] = undef; # songElapsedSeconds $client->[94] = 0; #animating + # 95 is currentPlaylistRender + # 96 is currentPlaylistChangeTime + $client->[97] = undef; # tempVolume temporary volume setting $::d_protocol && msg("New client connected: $id\n"); $client->lastirtime(0); @@ -1005,11 +1009,31 @@ if (defined($volume)) { if ($volume > $client->maxVolume()) { $volume = $client->maxVolume(); } if ($volume < $client->minVolume()) { $volume = $client->minVolume(); } - Slim::Utils::Prefs::clientSet($client, "volume", $volume) if (!$temp); + if ($temp) { + $client->[97] = $volume; + } else { + # persist only if $temp not set + Slim::Utils::Prefs::clientSet($client, "volume", $volume); + # forget any previous temporary volume + $client->[97] = undef; + } } - return Slim::Utils::Prefs::clientGet($client, "volume"); + # return the current volume, whether temporary or persisted + if (defined($client->tempVolume())) { + return $client->tempVolume(); + } else { + return Slim::Utils::Prefs::clientGet($client, "volume"); + } } +# getter only. +# use volume() to set, passing in temp flag +sub tempVolume { + my $r = shift; + return $r->[97]; +} + + sub treble { my ($client, $treble) = @_; if (defined($treble)) { Index: Slim/Buttons/AlarmClock.pm =================================================================== --- Slim/Buttons/AlarmClock.pm (revision 2531) +++ Slim/Buttons/AlarmClock.pm (working copy) @@ -174,6 +174,10 @@ if (defined ($volume)) { Slim::Control::Command::execute($client, ["mixer", "volume", $volume]); } + + # fade volume over time + $client->fade_volume(Slim::Utils::Prefs::clientGet($client, "alarmfadeseconds") || 60); + if (defined Slim::Utils::Prefs::clientGet($client, "alarmplaylist")) { Slim::Control::Command::execute($client, ["power", 1]); Slim::Buttons::Block::block($client,alarmLines($client));