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_);