2015-01-26 21:23:53 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* Use of this source code is governed by a BSD-style license
|
|
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
|
|
|
|
* in the file PATENTS. All contributing project authors may
|
|
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
|
|
|
*/
|
|
|
|
|
|
2016-02-24 05:22:32 -08:00
|
|
|
#include <memory>
|
|
|
|
|
|
2016-04-05 14:57:48 -07:00
|
|
|
#include "webrtc/common_audio/audio_ring_buffer.h"
|
2015-01-26 21:23:53 +00:00
|
|
|
|
2015-01-28 19:57:00 +00:00
|
|
|
#include "webrtc/common_audio/channel_buffer.h"
|
2016-09-30 22:29:43 -07:00
|
|
|
#include "webrtc/test/gtest.h"
|
2015-01-26 21:23:53 +00:00
|
|
|
|
|
|
|
|
namespace webrtc {
|
|
|
|
|
|
|
|
|
|
class AudioRingBufferTest :
|
|
|
|
|
public ::testing::TestWithParam< ::testing::tuple<int, int, int, int> > {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void ReadAndWriteTest(const ChannelBuffer<float>& input,
|
|
|
|
|
size_t num_write_chunk_frames,
|
|
|
|
|
size_t num_read_chunk_frames,
|
|
|
|
|
size_t buffer_frames,
|
|
|
|
|
ChannelBuffer<float>* output) {
|
|
|
|
|
const size_t num_channels = input.num_channels();
|
2015-02-10 22:52:15 +00:00
|
|
|
const size_t total_frames = input.num_frames();
|
2015-01-26 21:23:53 +00:00
|
|
|
AudioRingBuffer buf(num_channels, buffer_frames);
|
2016-02-24 05:22:32 -08:00
|
|
|
std::unique_ptr<float* []> slice(new float*[num_channels]);
|
2015-01-26 21:23:53 +00:00
|
|
|
|
|
|
|
|
size_t input_pos = 0;
|
|
|
|
|
size_t output_pos = 0;
|
|
|
|
|
while (input_pos + buf.WriteFramesAvailable() < total_frames) {
|
|
|
|
|
// Write until the buffer is as full as possible.
|
|
|
|
|
while (buf.WriteFramesAvailable() >= num_write_chunk_frames) {
|
Update a ton of audio code to use size_t more correctly and in general reduce
use of int16_t/uint16_t.
This is the upshot of a recommendation by henrik.lundin and kwiberg on an original small change ( https://webrtc-codereview.appspot.com/42569004/#ps1 ) to stop using int16_t just because values could fit in it, and is similar in nature to a previous "mass change to use size_t more" ( https://webrtc-codereview.appspot.com/23129004/ ) which also needed to be split up for review but to land all at once, since, like adding "const", such changes tend to cause a lot of transitive effects.
This was be reviewed and approved in pieces:
https://codereview.webrtc.org/1224093003
https://codereview.webrtc.org/1224123002
https://codereview.webrtc.org/1224163002
https://codereview.webrtc.org/1225133003
https://codereview.webrtc.org/1225173002
https://codereview.webrtc.org/1227163003
https://codereview.webrtc.org/1227203003
https://codereview.webrtc.org/1227213002
https://codereview.webrtc.org/1227893002
https://codereview.webrtc.org/1228793004
https://codereview.webrtc.org/1228803003
https://codereview.webrtc.org/1228823002
https://codereview.webrtc.org/1228823003
https://codereview.webrtc.org/1228843002
https://codereview.webrtc.org/1230693002
https://codereview.webrtc.org/1231713002
The change is being landed as TBR to all the folks who reviewed the above.
BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, pbos@webrtc.org
TBR=aluebs, andrew, asapersson, henrika, hlundin, jan.skoglund, kwiberg, minyue, pbos, pthatcher
Review URL: https://codereview.webrtc.org/1230503003 .
Cr-Commit-Position: refs/heads/master@{#9768}
2015-08-24 14:52:23 -07:00
|
|
|
buf.Write(input.Slice(slice.get(), input_pos), num_channels,
|
|
|
|
|
num_write_chunk_frames);
|
2015-01-26 21:23:53 +00:00
|
|
|
input_pos += num_write_chunk_frames;
|
|
|
|
|
}
|
|
|
|
|
// Read until the buffer is as empty as possible.
|
|
|
|
|
while (buf.ReadFramesAvailable() >= num_read_chunk_frames) {
|
|
|
|
|
EXPECT_LT(output_pos, total_frames);
|
Update a ton of audio code to use size_t more correctly and in general reduce
use of int16_t/uint16_t.
This is the upshot of a recommendation by henrik.lundin and kwiberg on an original small change ( https://webrtc-codereview.appspot.com/42569004/#ps1 ) to stop using int16_t just because values could fit in it, and is similar in nature to a previous "mass change to use size_t more" ( https://webrtc-codereview.appspot.com/23129004/ ) which also needed to be split up for review but to land all at once, since, like adding "const", such changes tend to cause a lot of transitive effects.
This was be reviewed and approved in pieces:
https://codereview.webrtc.org/1224093003
https://codereview.webrtc.org/1224123002
https://codereview.webrtc.org/1224163002
https://codereview.webrtc.org/1225133003
https://codereview.webrtc.org/1225173002
https://codereview.webrtc.org/1227163003
https://codereview.webrtc.org/1227203003
https://codereview.webrtc.org/1227213002
https://codereview.webrtc.org/1227893002
https://codereview.webrtc.org/1228793004
https://codereview.webrtc.org/1228803003
https://codereview.webrtc.org/1228823002
https://codereview.webrtc.org/1228823003
https://codereview.webrtc.org/1228843002
https://codereview.webrtc.org/1230693002
https://codereview.webrtc.org/1231713002
The change is being landed as TBR to all the folks who reviewed the above.
BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, pbos@webrtc.org
TBR=aluebs, andrew, asapersson, henrika, hlundin, jan.skoglund, kwiberg, minyue, pbos, pthatcher
Review URL: https://codereview.webrtc.org/1230503003 .
Cr-Commit-Position: refs/heads/master@{#9768}
2015-08-24 14:52:23 -07:00
|
|
|
buf.Read(output->Slice(slice.get(), output_pos), num_channels,
|
|
|
|
|
num_read_chunk_frames);
|
2015-01-26 21:23:53 +00:00
|
|
|
output_pos += num_read_chunk_frames;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Write and read the last bit.
|
Reformat existing code. There should be no functional effects.
This includes changes like:
* Attempt to break lines at better positions
* Use "override" in more places, don't use "virtual" with it
* Use {} where the body is more than one line
* Make declaration and definition arg names match
* Eliminate unused code
* EXPECT_EQ(expected, actual) (but use (actual, expected) for e.g. _GT)
* Correct #include order
* Use anonymous namespaces in preference to "static" for file-scoping
* Eliminate unnecessary casts
* Update reference code in comments of ARM assembly sources to match actual current C code
* Fix indenting to be more style-guide compliant
* Use arraysize() in more places
* Use bool instead of int for "boolean" values (0/1)
* Shorten and simplify code
* Spaces around operators
* 80 column limit
* Use const more consistently
* Space goes after '*' in type name, not before
* Remove unnecessary return values
* Use "(var == const)", not "(const == var)"
* Spelling
* Prefer true, typed constants to "enum hack" constants
* Avoid "virtual" on non-overridden functions
* ASSERT(x == y) -> ASSERT_EQ(y, x)
BUG=none
R=andrew@webrtc.org, asapersson@webrtc.org, henrika@webrtc.org, juberti@webrtc.org, kjellander@webrtc.org, kwiberg@webrtc.org
Review URL: https://codereview.webrtc.org/1172163004
Cr-Commit-Position: refs/heads/master@{#9420}
2015-06-11 14:31:38 -07:00
|
|
|
if (input_pos < total_frames) {
|
Update a ton of audio code to use size_t more correctly and in general reduce
use of int16_t/uint16_t.
This is the upshot of a recommendation by henrik.lundin and kwiberg on an original small change ( https://webrtc-codereview.appspot.com/42569004/#ps1 ) to stop using int16_t just because values could fit in it, and is similar in nature to a previous "mass change to use size_t more" ( https://webrtc-codereview.appspot.com/23129004/ ) which also needed to be split up for review but to land all at once, since, like adding "const", such changes tend to cause a lot of transitive effects.
This was be reviewed and approved in pieces:
https://codereview.webrtc.org/1224093003
https://codereview.webrtc.org/1224123002
https://codereview.webrtc.org/1224163002
https://codereview.webrtc.org/1225133003
https://codereview.webrtc.org/1225173002
https://codereview.webrtc.org/1227163003
https://codereview.webrtc.org/1227203003
https://codereview.webrtc.org/1227213002
https://codereview.webrtc.org/1227893002
https://codereview.webrtc.org/1228793004
https://codereview.webrtc.org/1228803003
https://codereview.webrtc.org/1228823002
https://codereview.webrtc.org/1228823003
https://codereview.webrtc.org/1228843002
https://codereview.webrtc.org/1230693002
https://codereview.webrtc.org/1231713002
The change is being landed as TBR to all the folks who reviewed the above.
BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, pbos@webrtc.org
TBR=aluebs, andrew, asapersson, henrika, hlundin, jan.skoglund, kwiberg, minyue, pbos, pthatcher
Review URL: https://codereview.webrtc.org/1230503003 .
Cr-Commit-Position: refs/heads/master@{#9768}
2015-08-24 14:52:23 -07:00
|
|
|
buf.Write(input.Slice(slice.get(), input_pos), num_channels,
|
|
|
|
|
total_frames - input_pos);
|
Reformat existing code. There should be no functional effects.
This includes changes like:
* Attempt to break lines at better positions
* Use "override" in more places, don't use "virtual" with it
* Use {} where the body is more than one line
* Make declaration and definition arg names match
* Eliminate unused code
* EXPECT_EQ(expected, actual) (but use (actual, expected) for e.g. _GT)
* Correct #include order
* Use anonymous namespaces in preference to "static" for file-scoping
* Eliminate unnecessary casts
* Update reference code in comments of ARM assembly sources to match actual current C code
* Fix indenting to be more style-guide compliant
* Use arraysize() in more places
* Use bool instead of int for "boolean" values (0/1)
* Shorten and simplify code
* Spaces around operators
* 80 column limit
* Use const more consistently
* Space goes after '*' in type name, not before
* Remove unnecessary return values
* Use "(var == const)", not "(const == var)"
* Spelling
* Prefer true, typed constants to "enum hack" constants
* Avoid "virtual" on non-overridden functions
* ASSERT(x == y) -> ASSERT_EQ(y, x)
BUG=none
R=andrew@webrtc.org, asapersson@webrtc.org, henrika@webrtc.org, juberti@webrtc.org, kjellander@webrtc.org, kwiberg@webrtc.org
Review URL: https://codereview.webrtc.org/1172163004
Cr-Commit-Position: refs/heads/master@{#9420}
2015-06-11 14:31:38 -07:00
|
|
|
}
|
|
|
|
|
if (buf.ReadFramesAvailable()) {
|
Update a ton of audio code to use size_t more correctly and in general reduce
use of int16_t/uint16_t.
This is the upshot of a recommendation by henrik.lundin and kwiberg on an original small change ( https://webrtc-codereview.appspot.com/42569004/#ps1 ) to stop using int16_t just because values could fit in it, and is similar in nature to a previous "mass change to use size_t more" ( https://webrtc-codereview.appspot.com/23129004/ ) which also needed to be split up for review but to land all at once, since, like adding "const", such changes tend to cause a lot of transitive effects.
This was be reviewed and approved in pieces:
https://codereview.webrtc.org/1224093003
https://codereview.webrtc.org/1224123002
https://codereview.webrtc.org/1224163002
https://codereview.webrtc.org/1225133003
https://codereview.webrtc.org/1225173002
https://codereview.webrtc.org/1227163003
https://codereview.webrtc.org/1227203003
https://codereview.webrtc.org/1227213002
https://codereview.webrtc.org/1227893002
https://codereview.webrtc.org/1228793004
https://codereview.webrtc.org/1228803003
https://codereview.webrtc.org/1228823002
https://codereview.webrtc.org/1228823003
https://codereview.webrtc.org/1228843002
https://codereview.webrtc.org/1230693002
https://codereview.webrtc.org/1231713002
The change is being landed as TBR to all the folks who reviewed the above.
BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, pbos@webrtc.org
TBR=aluebs, andrew, asapersson, henrika, hlundin, jan.skoglund, kwiberg, minyue, pbos, pthatcher
Review URL: https://codereview.webrtc.org/1230503003 .
Cr-Commit-Position: refs/heads/master@{#9768}
2015-08-24 14:52:23 -07:00
|
|
|
buf.Read(output->Slice(slice.get(), output_pos), num_channels,
|
|
|
|
|
buf.ReadFramesAvailable());
|
Reformat existing code. There should be no functional effects.
This includes changes like:
* Attempt to break lines at better positions
* Use "override" in more places, don't use "virtual" with it
* Use {} where the body is more than one line
* Make declaration and definition arg names match
* Eliminate unused code
* EXPECT_EQ(expected, actual) (but use (actual, expected) for e.g. _GT)
* Correct #include order
* Use anonymous namespaces in preference to "static" for file-scoping
* Eliminate unnecessary casts
* Update reference code in comments of ARM assembly sources to match actual current C code
* Fix indenting to be more style-guide compliant
* Use arraysize() in more places
* Use bool instead of int for "boolean" values (0/1)
* Shorten and simplify code
* Spaces around operators
* 80 column limit
* Use const more consistently
* Space goes after '*' in type name, not before
* Remove unnecessary return values
* Use "(var == const)", not "(const == var)"
* Spelling
* Prefer true, typed constants to "enum hack" constants
* Avoid "virtual" on non-overridden functions
* ASSERT(x == y) -> ASSERT_EQ(y, x)
BUG=none
R=andrew@webrtc.org, asapersson@webrtc.org, henrika@webrtc.org, juberti@webrtc.org, kjellander@webrtc.org, kwiberg@webrtc.org
Review URL: https://codereview.webrtc.org/1172163004
Cr-Commit-Position: refs/heads/master@{#9420}
2015-06-11 14:31:38 -07:00
|
|
|
}
|
2015-01-26 21:23:53 +00:00
|
|
|
EXPECT_EQ(0u, buf.ReadFramesAvailable());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_P(AudioRingBufferTest, ReadDataMatchesWrittenData) {
|
|
|
|
|
const size_t kFrames = 5000;
|
|
|
|
|
const size_t num_channels = ::testing::get<3>(GetParam());
|
|
|
|
|
|
|
|
|
|
// Initialize the input data to an increasing sequence.
|
|
|
|
|
ChannelBuffer<float> input(kFrames, static_cast<int>(num_channels));
|
|
|
|
|
for (size_t i = 0; i < num_channels; ++i)
|
|
|
|
|
for (size_t j = 0; j < kFrames; ++j)
|
2015-01-27 21:59:33 +00:00
|
|
|
input.channels()[i][j] = (i + 1) * (j + 1);
|
2015-01-26 21:23:53 +00:00
|
|
|
|
|
|
|
|
ChannelBuffer<float> output(kFrames, static_cast<int>(num_channels));
|
|
|
|
|
ReadAndWriteTest(input,
|
|
|
|
|
::testing::get<0>(GetParam()),
|
|
|
|
|
::testing::get<1>(GetParam()),
|
|
|
|
|
::testing::get<2>(GetParam()),
|
|
|
|
|
&output);
|
|
|
|
|
|
|
|
|
|
// Verify the read data matches the input.
|
|
|
|
|
for (size_t i = 0; i < num_channels; ++i)
|
|
|
|
|
for (size_t j = 0; j < kFrames; ++j)
|
|
|
|
|
EXPECT_EQ(input.channels()[i][j], output.channels()[i][j]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P(
|
|
|
|
|
AudioRingBufferTest, AudioRingBufferTest,
|
|
|
|
|
::testing::Combine(::testing::Values(10, 20, 42), // num_write_chunk_frames
|
|
|
|
|
::testing::Values(1, 10, 17), // num_read_chunk_frames
|
|
|
|
|
::testing::Values(100, 256), // buffer_frames
|
|
|
|
|
::testing::Values(1, 4))); // num_channels
|
|
|
|
|
|
|
|
|
|
TEST_F(AudioRingBufferTest, MoveReadPosition) {
|
|
|
|
|
const size_t kNumChannels = 1;
|
|
|
|
|
const float kInputArray[] = {1, 2, 3, 4};
|
|
|
|
|
const size_t kNumFrames = sizeof(kInputArray) / sizeof(*kInputArray);
|
2015-02-10 22:52:15 +00:00
|
|
|
ChannelBuffer<float> input(kNumFrames, kNumChannels);
|
|
|
|
|
input.SetDataForTesting(kInputArray, kNumFrames);
|
2015-01-26 21:23:53 +00:00
|
|
|
AudioRingBuffer buf(kNumChannels, kNumFrames);
|
|
|
|
|
buf.Write(input.channels(), kNumChannels, kNumFrames);
|
|
|
|
|
|
2015-07-28 00:52:59 -07:00
|
|
|
buf.MoveReadPositionForward(3);
|
2015-01-26 21:23:53 +00:00
|
|
|
ChannelBuffer<float> output(1, kNumChannels);
|
|
|
|
|
buf.Read(output.channels(), kNumChannels, 1);
|
2015-02-10 22:52:15 +00:00
|
|
|
EXPECT_EQ(4, output.channels()[0][0]);
|
2015-07-28 00:52:59 -07:00
|
|
|
buf.MoveReadPositionBackward(3);
|
2015-01-26 21:23:53 +00:00
|
|
|
buf.Read(output.channels(), kNumChannels, 1);
|
2015-02-10 22:52:15 +00:00
|
|
|
EXPECT_EQ(2, output.channels()[0][0]);
|
2015-01-26 21:23:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace webrtc
|