Add a deinterleaved float interface to AudioProcessing.
This is mainly to support the native audio format in Chrome. Although
this implementation just moves the float->int conversion under the hood,
we will transition AudioProcessing towards supporting this format
throughout.
- Add a test which verifies we get identical output with the float and
int interfaces.
- The float and int wrappers are tasked with conversion to the
AudioBuffer format. A new shared Process/Analyze method does most of
the work.
- Add a new field to the debug.proto to hold deinterleaved data.
- Add helpers to audio_utils.cc, and start using numeric_limits.
- Note that there was no performance difference between numeric_limits
and a literal value when measured on Linux using gcc or clang.
BUG=2894
R=aluebs@webrtc.org, bjornv@webrtc.org, henrikg@webrtc.org, tommi@webrtc.org, turaj@webrtc.org, xians@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/9179004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@5641 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_processing/audio_buffer.cc b/webrtc/modules/audio_processing/audio_buffer.cc
index 048d048..9082477 100644
--- a/webrtc/modules/audio_processing/audio_buffer.cc
+++ b/webrtc/modules/audio_processing/audio_buffer.cc
@@ -10,6 +10,7 @@
#include "webrtc/modules/audio_processing/audio_buffer.h"
+#include "webrtc/common_audio/include/audio_util.h"
#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
namespace webrtc {
@@ -79,11 +80,9 @@
mixed_channels_(NULL),
mixed_low_pass_channels_(NULL),
low_pass_reference_channels_(NULL) {
- if (max_num_channels_ > 1) {
- channels_.reset(new AudioChannel[max_num_channels_]);
- mixed_channels_.reset(new AudioChannel[max_num_channels_]);
- mixed_low_pass_channels_.reset(new AudioChannel[max_num_channels_]);
- }
+ channels_.reset(new AudioChannel[max_num_channels_]);
+ mixed_channels_.reset(new AudioChannel[max_num_channels_]);
+ mixed_low_pass_channels_.reset(new AudioChannel[max_num_channels_]);
low_pass_reference_channels_.reset(new AudioChannel[max_num_channels_]);
if (samples_per_channel_ == kSamplesPer32kHzChannel) {
@@ -94,6 +93,17 @@
AudioBuffer::~AudioBuffer() {}
+void AudioBuffer::InitForNewData(int num_channels) {
+ num_channels_ = num_channels;
+ data_ = NULL;
+ data_was_mixed_ = false;
+ num_mixed_channels_ = 0;
+ num_mixed_low_pass_channels_ = 0;
+ reference_copied_ = false;
+ activity_ = AudioFrame::kVadUnknown;
+ is_muted_ = false;
+}
+
int16_t* AudioBuffer::data(int channel) const {
assert(channel >= 0 && channel < num_channels_);
if (data_ != NULL) {
@@ -191,13 +201,8 @@
assert(frame->num_channels_ <= max_num_channels_);
assert(frame->samples_per_channel_ == samples_per_channel_);
- num_channels_ = frame->num_channels_;
- data_was_mixed_ = false;
- num_mixed_channels_ = 0;
- num_mixed_low_pass_channels_ = 0;
- reference_copied_ = false;
+ InitForNewData(frame->num_channels_);
activity_ = frame->vad_activity_;
- is_muted_ = false;
if (frame->energy_ == 0) {
is_muted_ = true;
}
@@ -252,6 +257,26 @@
}
}
+void AudioBuffer::CopyFrom(const float* const* data, int samples_per_channel,
+ int num_channels) {
+ assert(num_channels <= max_num_channels_);
+ assert(samples_per_channel == samples_per_channel_);
+
+ InitForNewData(num_channels);
+ for (int i = 0; i < num_channels_; ++i) {
+ ScaleAndRoundToInt16(data[i], samples_per_channel, channels_[i].data);
+ }
+}
+
+void AudioBuffer::CopyTo(int samples_per_channel, int num_channels,
+ float* const* data) const {
+ assert(num_channels == num_channels_);
+ assert(samples_per_channel == samples_per_channel_);
+ for (int i = 0; i < num_channels_; ++i) {
+ ScaleToFloat(channels_[i].data, samples_per_channel, data[i]);
+ }
+}
+
// TODO(andrew): would be good to support the no-mix case with pointer
// assignment.
// TODO(andrew): handle mixing to multiple channels?