Add keyboard channel support to AudioBuffer.

Also use local aliases for AudioBuffers for brevity.

BUG=2894
R=aluebs@webrtc.org, bjornv@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/13369005

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5973 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_processing/audio_buffer.cc b/webrtc/modules/audio_processing/audio_buffer.cc
index 6936155..c53d4df 100644
--- a/webrtc/modules/audio_processing/audio_buffer.cc
+++ b/webrtc/modules/audio_processing/audio_buffer.cc
@@ -23,6 +23,35 @@
   kSamplesPer32kHzChannel = 320
 };
 
+bool HasKeyboardChannel(AudioProcessing::ChannelLayout layout) {
+  switch (layout) {
+    case AudioProcessing::kMono:
+    case AudioProcessing::kStereo:
+      return false;
+    case AudioProcessing::kMonoAndKeyboard:
+    case AudioProcessing::kStereoAndKeyboard:
+      return true;
+  }
+  assert(false);
+  return false;
+}
+
+int KeyboardChannelIndex(AudioProcessing::ChannelLayout layout) {
+  switch (layout) {
+    case AudioProcessing::kMono:
+    case AudioProcessing::kStereo:
+      assert(false);
+      return -1;
+    case AudioProcessing::kMonoAndKeyboard:
+      return 1;
+    case AudioProcessing::kStereoAndKeyboard:
+      return 2;
+  }
+  assert(false);
+  return -1;
+}
+
+
 void StereoToMono(const float* left, const float* right, float* out,
                   int samples_per_channel) {
   for (int i = 0; i < samples_per_channel; ++i) {
@@ -32,8 +61,9 @@
 
 void StereoToMono(const int16_t* left, const int16_t* right, int16_t* out,
                   int samples_per_channel) {
-  for (int i = 0; i < samples_per_channel; i++)
+  for (int i = 0; i < samples_per_channel; ++i) {
     out[i] = (left[i] + right[i]) >> 1;
+  }
 }
 
 }  // namespace
@@ -72,6 +102,7 @@
     activity_(AudioFrame::kVadUnknown),
     is_muted_(false),
     data_(NULL),
+    keyboard_data_(NULL),
     channels_(new ChannelBuffer<int16_t>(proc_samples_per_channel_,
                                          num_proc_channels_)) {
   assert(input_samples_per_channel_ > 0);
@@ -118,6 +149,8 @@
   }
 }
 
+AudioBuffer::~AudioBuffer() {}
+
 void AudioBuffer::CopyFrom(const float* const* data,
                            int samples_per_channel,
                            AudioProcessing::ChannelLayout layout) {
@@ -125,6 +158,10 @@
   assert(ChannelsFromLayout(layout) == num_input_channels_);
   InitForNewData();
 
+  if (HasKeyboardChannel(layout)) {
+    keyboard_data_ = data[KeyboardChannelIndex(layout)];
+  }
+
   // Downmix.
   const float* const* data_ptr = data;
   if (num_input_channels_ == 2 && num_proc_channels_ == 1) {
@@ -180,10 +217,9 @@
   }
 }
 
-AudioBuffer::~AudioBuffer() {}
-
 void AudioBuffer::InitForNewData() {
   data_ = NULL;
+  keyboard_data_ = NULL;
   data_was_mixed_ = false;
   num_mixed_channels_ = 0;
   num_mixed_low_pass_channels_ = 0;
@@ -240,6 +276,10 @@
   return low_pass_reference_channels_->channel(channel);
 }
 
+const float* AudioBuffer::keyboard_data() const {
+  return keyboard_data_;
+}
+
 SplitFilterStates* AudioBuffer::filter_states(int channel) const {
   assert(channel >= 0 && channel < num_proc_channels_);
   return &filter_states_[channel];
@@ -269,6 +309,11 @@
   return samples_per_split_channel_;
 }
 
+int AudioBuffer::samples_per_keyboard_channel() const {
+  // We don't resample the keyboard channel.
+  return input_samples_per_channel_;
+}
+
 // TODO(andrew): Do deinterleaving and mixing in one step?
 void AudioBuffer::DeinterleaveFrom(AudioFrame* frame) {
   assert(proc_samples_per_channel_ == input_samples_per_channel_);