diff --git a/src/main.rs b/src/main.rs
index 50b8ae7b3aaecbe26ee8e54c8740e24d082e5980..2b08f37fc0da12351e2883b3aceab0df4a4d51c5 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -63,6 +63,37 @@ static VOLS16: [AtomicUsize; N_INPUTS] = arr![AtomicUsize::new(0); 16];
 
 
 
+fn get_volume_for_input_output_pair(input_index: usize, output_index: usize) -> f32 {
+    // For each input get the corrsponding atomic value for the volume control
+    match input_index {
+        0 => VOLS1[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        1 => VOLS2[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        2 => VOLS3[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        3 => VOLS4[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        4 => VOLS5[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        5 => VOLS6[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        6 => VOLS7[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        7 => VOLS8[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        8 => VOLS9[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        9 => VOLS10[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        10 => VOLS11[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        11 => VOLS12[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        12 => VOLS13[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        13 => VOLS14[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        14 => VOLS15[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+        15 => VOLS16[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
+
+        _ => 0.0
+    }
+}
+
+fn port_has_connections<T>(port: &Port<T>) -> bool {
+    match port.connected_count() {
+        Ok(count) =>  count > 0,
+        _ => true
+    }
+}
+
 
 fn main() {
     let matches = App::new(option_env!("CARGO_PKG_NAME").unwrap())
@@ -138,51 +169,21 @@ fn main() {
         // (in this case for testing purposes: all to all)
         inputs.iter()
               .enumerate()
-              .filter(|(_input_index, inport)| {
-                match inport.connected_count() {
-                    Ok(count) =>  count > 0,
-                    _ => true
-                }
-              })
+              .filter(|(_input_index, inport)| port_has_connections(inport))
               .for_each(|(input_index, inport)| {
                 // Get a slice [f32; 1024] of samples for each port
-                let input_samples = inport.as_slice(ps);
+                let input_samples = &inport.as_slice(ps)[..buffersize];
 
                 // Sum each input to output buffer
                 output_buffers.par_iter_mut()
                               .enumerate()
-                              .filter(|(output_index, _buffer)| {
-                                match outputs[*output_index].connected_count() {
-                                    Ok(count) =>  count > 0,
-                                    _ => true
-                                }
-                              })
+                              .filter(|(output_index, _buffer)|  port_has_connections(&outputs[*output_index]))
                               .for_each(|(output_index, b)| {
                                 b.par_iter_mut()
                                  .take(buffersize)
                                  .enumerate()
                                  .for_each(|(sample_index, sample)| {
-                                    // For each input get the corrsponding atomic value for the volume control
-                                    let volume = match input_index {
-                                        0 => VOLS1[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        1 => VOLS2[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        2 => VOLS3[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        3 => VOLS4[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        4 => VOLS5[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        5 => VOLS6[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        6 => VOLS7[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        7 => VOLS8[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        8 => VOLS9[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        9 => VOLS10[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        10 => VOLS11[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        11 => VOLS12[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        12 => VOLS13[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        13 => VOLS14[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        14 => VOLS15[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-                                        15 => VOLS16[output_index].load(Ordering::Relaxed) as f32 / usize::MAX as f32,
-
-                                        _ => 0.0
-                                    };
+                                    let volume = get_volume_for_input_output_pair(input_index, output_index);
 
                                     if volume != 0.0 {
                                         // Multiply each input sample at position `sample_index` with the
@@ -199,7 +200,7 @@ fn main() {
         outputs.iter_mut()
                .enumerate()
                .for_each(|(output_index, outport)| {
-                outport.as_mut_slice(ps).clone_from_slice(&output_buffers[output_index][..buffersize]);
+                outport.as_mut_slice(ps)[..buffersize].clone_from_slice(&output_buffers[output_index][..buffersize]);
                });
         jack::Control::Continue
     };