Add LappedTransform accessors.

These are necessary for clients to validate that they conform to its API.

R=andrew@webrtc.org

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

Cr-Commit-Position: refs/heads/master@{#9327}
This commit is contained in:
Michael Graczyk
2015-05-28 18:01:33 -07:00
parent e70028e43f
commit cc84649389
3 changed files with 56 additions and 27 deletions

View File

@@ -24,8 +24,8 @@ void LappedTransform::BlockThunk::ProcessBlock(const float* const* input,
int num_input_channels, int num_input_channels,
int num_output_channels, int num_output_channels,
float* const* output) { float* const* output) {
CHECK_EQ(num_input_channels, parent_->in_channels_); CHECK_EQ(num_input_channels, parent_->num_in_channels_);
CHECK_EQ(num_output_channels, parent_->out_channels_); CHECK_EQ(num_output_channels, parent_->num_out_channels_);
CHECK_EQ(parent_->block_length_, num_frames); CHECK_EQ(parent_->block_length_, num_frames);
for (int i = 0; i < num_input_channels; ++i) { for (int i = 0; i < num_input_channels; ++i) {
@@ -52,25 +52,38 @@ void LappedTransform::BlockThunk::ProcessBlock(const float* const* input,
} }
} }
LappedTransform::LappedTransform(int in_channels, int out_channels, LappedTransform::LappedTransform(int num_in_channels,
int chunk_length, const float* window, int num_out_channels,
int block_length, int shift_amount, int chunk_length,
const float* window,
int block_length,
int shift_amount,
Callback* callback) Callback* callback)
: blocker_callback_(this), : blocker_callback_(this),
in_channels_(in_channels), num_in_channels_(num_in_channels),
out_channels_(out_channels), num_out_channels_(num_out_channels),
block_length_(block_length), block_length_(block_length),
chunk_length_(chunk_length), chunk_length_(chunk_length),
block_processor_(callback), block_processor_(callback),
blocker_( blocker_(chunk_length_,
chunk_length_, block_length_, in_channels_, out_channels_, window, block_length_,
shift_amount, &blocker_callback_), num_in_channels_,
num_out_channels_,
window,
shift_amount,
&blocker_callback_),
fft_(RealFourier::Create(RealFourier::FftOrder(block_length_))), fft_(RealFourier::Create(RealFourier::FftOrder(block_length_))),
cplx_length_(RealFourier::ComplexLength(fft_->order())), cplx_length_(RealFourier::ComplexLength(fft_->order())),
real_buf_(in_channels, block_length_, RealFourier::kFftBufferAlignment), real_buf_(num_in_channels,
cplx_pre_(in_channels, cplx_length_, RealFourier::kFftBufferAlignment), block_length_,
cplx_post_(out_channels, cplx_length_, RealFourier::kFftBufferAlignment) { RealFourier::kFftBufferAlignment),
CHECK(in_channels_ > 0 && out_channels_ > 0); cplx_pre_(num_in_channels,
cplx_length_,
RealFourier::kFftBufferAlignment),
cplx_post_(num_out_channels,
cplx_length_,
RealFourier::kFftBufferAlignment) {
CHECK(num_in_channels_ > 0 && num_out_channels_ > 0);
CHECK_GT(block_length_, 0); CHECK_GT(block_length_, 0);
CHECK_GT(chunk_length_, 0); CHECK_GT(chunk_length_, 0);
CHECK(block_processor_); CHECK(block_processor_);
@@ -81,9 +94,8 @@ LappedTransform::LappedTransform(int in_channels, int out_channels,
void LappedTransform::ProcessChunk(const float* const* in_chunk, void LappedTransform::ProcessChunk(const float* const* in_chunk,
float* const* out_chunk) { float* const* out_chunk) {
blocker_.ProcessChunk(in_chunk, chunk_length_, in_channels_, out_channels_, blocker_.ProcessChunk(in_chunk, chunk_length_, num_in_channels_,
out_chunk); num_out_channels_, out_chunk);
} }
} // namespace webrtc } // namespace webrtc

View File

@@ -35,8 +35,8 @@ class LappedTransform {
virtual ~Callback() {} virtual ~Callback() {}
virtual void ProcessAudioBlock(const std::complex<float>* const* in_block, virtual void ProcessAudioBlock(const std::complex<float>* const* in_block,
int in_channels, int frames, int num_in_channels, int frames,
int out_channels, int num_out_channels,
std::complex<float>* const* out_block) = 0; std::complex<float>* const* out_block) = 0;
}; };
@@ -46,7 +46,7 @@ class LappedTransform {
// |block_length| defines the length of a block, in samples. // |block_length| defines the length of a block, in samples.
// |shift_amount| is in samples. |callback| is the caller-owned audio // |shift_amount| is in samples. |callback| is the caller-owned audio
// processing function called for each block of the input chunk. // processing function called for each block of the input chunk.
LappedTransform(int in_channels, int out_channels, int chunk_length, LappedTransform(int num_in_channels, int num_out_channels, int chunk_length,
const float* window, int block_length, int shift_amount, const float* window, int block_length, int shift_amount,
Callback* callback); Callback* callback);
~LappedTransform() {} ~LappedTransform() {}
@@ -63,7 +63,24 @@ class LappedTransform {
// to ProcessChunk via the parameter in_chunk. // to ProcessChunk via the parameter in_chunk.
// //
// Returns the same chunk_length passed to the LappedTransform constructor. // Returns the same chunk_length passed to the LappedTransform constructor.
int get_chunk_length() const { return chunk_length_; } int chunk_length() const { return chunk_length_; }
// Get the number of input channels.
//
// This is the number of arrays that must be passed to ProcessChunk via
// in_chunk.
//
// Returns the same num_in_channels passed to the LappedTransform constructor.
int num_in_channels() const { return num_in_channels_; }
// Get the number of output channels.
//
// This is the number of arrays that must be passed to ProcessChunk via
// out_chunk.
//
// Returns the same num_out_channels passed to the LappedTransform
// constructor.
int num_out_channels() const { return num_out_channels_; }
private: private:
// Internal middleware callback, given to the blocker. Transforms each block // Internal middleware callback, given to the blocker. Transforms each block
@@ -80,8 +97,8 @@ class LappedTransform {
LappedTransform* const parent_; LappedTransform* const parent_;
} blocker_callback_; } blocker_callback_;
const int in_channels_; const int num_in_channels_;
const int out_channels_; const int num_out_channels_;
const int block_length_; const int block_length_;
const int chunk_length_; const int chunk_length_;

View File

@@ -177,26 +177,26 @@ TEST(LappedTransformTest, Callbacks) {
ASSERT_EQ(kChunkLength / kBlockLength, call.block_num()); ASSERT_EQ(kChunkLength / kBlockLength, call.block_num());
} }
TEST(LappedTransformTest, get_chunk_length) { TEST(LappedTransformTest, chunk_length) {
const int kBlockLength = 64; const int kBlockLength = 64;
FftCheckerCallback call; FftCheckerCallback call;
const float window[kBlockLength] = {}; const float window[kBlockLength] = {};
// Make sure that get_chunk_length returns the same value passed to the // Make sure that chunk_length returns the same value passed to the
// LappedTransform constructor. // LappedTransform constructor.
{ {
const int kExpectedChunkLength = 512; const int kExpectedChunkLength = 512;
const LappedTransform trans(1, 1, kExpectedChunkLength, window, const LappedTransform trans(1, 1, kExpectedChunkLength, window,
kBlockLength, kBlockLength, &call); kBlockLength, kBlockLength, &call);
EXPECT_EQ(kExpectedChunkLength, trans.get_chunk_length()); EXPECT_EQ(kExpectedChunkLength, trans.chunk_length());
} }
{ {
const int kExpectedChunkLength = 160; const int kExpectedChunkLength = 160;
const LappedTransform trans(1, 1, kExpectedChunkLength, window, const LappedTransform trans(1, 1, kExpectedChunkLength, window,
kBlockLength, kBlockLength, &call); kBlockLength, kBlockLength, &call);
EXPECT_EQ(kExpectedChunkLength, trans.get_chunk_length()); EXPECT_EQ(kExpectedChunkLength, trans.chunk_length());
} }
} }