| 
					
				 | 
			
			
				@@ -17,12 +17,14 @@ use protocol::spirc::{PlayStatus, State, MessageType, Frame, DeviceState}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use mixer::Mixer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use player::Player; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+use std; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use rand; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use rand::Rng; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 pub struct SpircTask { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     player: Player, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     mixer: Box<Mixer>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    progressive_volume:bool, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     sequence: SeqGenerator<u32>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -122,6 +124,33 @@ fn initial_device_state(config: ConnectConfig, volume: u16) -> DeviceState { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+fn volume_to_mixer(volume: u16, progressive: bool) -> u16 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if progressive { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Some by trail determined volume calculation algorithm. Start increasing slowly, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // then after 50% increase in bigger steps. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let d = volume / (std::u16::MAX / 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut v:u32 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut incr:u32 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for i in 0..d { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            v += incr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            incr +=3; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if i > 50 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // Increase faster to reach max volume 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                incr += 42; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Clip the vulume to the max 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if v > std::u16::MAX as u32 {v = std::u16::MAX as u32;} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        debug!("volume_to_mixer {} {}", volume, v);	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return v as u16; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        debug!("volume_to_mixer {}", volume);	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return volume; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 impl Spirc { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     pub fn new(config: ConnectConfig, session: Session, player: Player, mixer: Box<Mixer>) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         -> (Spirc, SpircTask) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -144,15 +173,15 @@ impl Spirc { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         })); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (cmd_tx, cmd_rx) = mpsc::unbounded(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let progressive_volume = config.progressive_volume; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let volume = config.volume as u16; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let device = initial_device_state(config, volume); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        mixer.set_volume(volume as u16); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mixer.set_volume(volume_to_mixer(volume as u16, progressive_volume)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let mut task = SpircTask { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             player: player, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             mixer: mixer, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            progressive_volume, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             sequence: SeqGenerator::new(1), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ident: ident, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -439,9 +468,9 @@ impl SpircTask { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             MessageType::kMessageTypeVolume => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                let volume = frame.get_volume(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.device.set_volume(volume); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.mixer.set_volume(frame.get_volume() as u16); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.device.set_volume(frame.get_volume()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.mixer.set_volume( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    volume_to_mixer(frame.get_volume() as u16, self.progressive_volume)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 self.notify(None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -536,21 +565,21 @@ impl SpircTask { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fn handle_volume_up(&mut self) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let mut volume: u32 = self.mixer.volume() as u32 + 4096; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut volume: u32 = self.device.get_volume() as u32 + 4096; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if volume > 0xFFFF { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             volume = 0xFFFF; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.device.set_volume(volume); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.mixer.set_volume(volume as u16); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.mixer.set_volume(volume_to_mixer(volume as u16, self.progressive_volume)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fn handle_volume_down(&mut self) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let mut volume: i32 = self.mixer.volume() as i32 - 4096; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut volume: i32 = self.device.get_volume() as i32 - 4096; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if volume < 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             volume = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.device.set_volume(volume as u32); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.mixer.set_volume(volume as u16); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.mixer.set_volume(volume_to_mixer(volume as u16, self.progressive_volume)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fn handle_end_of_track(&mut self) { 
			 |