diff options
author | Hsin-Yu Chao <hychao@google.com> | 2018-10-05 19:59:52 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-10-09 21:14:00 -0700 |
commit | 78e781a0764b327f8af7748bd2649bc845c1b8c4 (patch) | |
tree | a6abd42755b9eaf9b1f1bc3f9f8028813e662efd | |
parent | 230cd444fd78f75f85225fb8369dcd0e09fed1c2 (diff) | |
download | adhd-78e781a0764b327f8af7748bd2649bc845c1b8c4.tar.gz |
CRAS: float_buffer - Fix readable count
Fix a bug in float_buffer when passing non-zero offset. Without
the fix, the result readable frames count could be incorrectly
larger and cause crash.
BUG=chromium:892608
TEST=unittest
Change-Id: I2d5f1724a032bc3264e4c178bf2b4e488686cde4
Reviewed-on: https://chromium-review.googlesource.com/1265215
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Tested-by: Hsinyu Chao <hychao@chromium.org>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
-rw-r--r-- | cras/src/Makefile.am | 7 | ||||
-rw-r--r-- | cras/src/server/float_buffer.h | 2 | ||||
-rw-r--r-- | cras/src/tests/float_buffer_unittest.cc | 53 |
3 files changed, 61 insertions, 1 deletions
diff --git a/cras/src/Makefile.am b/cras/src/Makefile.am index 18e5510e..ddb53faf 100644 --- a/cras/src/Makefile.am +++ b/cras/src/Makefile.am @@ -354,6 +354,7 @@ TESTS = \ edid_utils_unittest \ expr_unittest \ file_wait_unittest \ + float_buffer_unittest \ fmt_conv_unittest \ hfp_info_unittest \ buffer_share_unittest \ @@ -715,6 +716,12 @@ file_wait_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \ $(CRAS_UT_TMPDIR_CFLAGS) file_wait_unittest_LDADD = -lgtest -lpthread + +float_buffer_unittest_SOURCES = tests/float_buffer_unittest.cc +float_buffer_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \ + -I$(top_srcdir)/src/server +float_buffer_unittest_LDADD = -lgtest -lpthread + fmt_conv_unittest_SOURCES = tests/fmt_conv_unittest.cc server/cras_fmt_conv.c fmt_conv_unittest_CPPFLAGS = $(COMMON_CPPFLAGS) -I$(top_srcdir)/src/common \ -I$(top_srcdir)/src/server diff --git a/cras/src/server/float_buffer.h b/cras/src/server/float_buffer.h index 9b82c043..55e176e6 100644 --- a/cras/src/server/float_buffer.h +++ b/cras/src/server/float_buffer.h @@ -97,8 +97,8 @@ static inline float *const *float_buffer_read_pointer(struct float_buffer *b, offset = offset + b->buf->read_idx - b->buf->max_size; *readable = MIN(*readable, b->buf->write_idx - offset); } else { + *readable = MIN(*readable, nread - offset); offset += b->buf->read_idx; - *readable = MIN(*readable, nread); } for (i = 0; i < b->num_channels; i++, data += b->buf->max_size) diff --git a/cras/src/tests/float_buffer_unittest.cc b/cras/src/tests/float_buffer_unittest.cc new file mode 100644 index 00000000..20d392e3 --- /dev/null +++ b/cras/src/tests/float_buffer_unittest.cc @@ -0,0 +1,53 @@ +// Copyright 2018 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <gtest/gtest.h> + +#include "float_buffer.h" + +namespace { +TEST(FloatBuffer, ReadWrite) { + unsigned int readable = 10; + struct float_buffer *b = float_buffer_create(10, 2); + EXPECT_EQ(10, float_buffer_writable(b)); + + // (w, r)=(8, 0) + float_buffer_written(b, 8); + EXPECT_EQ(8, float_buffer_level(b)); + + float_buffer_read_pointer(b, 0, &readable); + EXPECT_EQ(8, readable); + EXPECT_EQ(2, float_buffer_writable(b)); + + readable = 10; + float_buffer_read_pointer(b, 3, &readable); + EXPECT_EQ(5, readable); + + // (w, r)=(8, 6) + float_buffer_read(b, 6); + EXPECT_EQ(2, float_buffer_writable(b)); + + // (w, r)=(0, 6) + float_buffer_written(b, 2); + EXPECT_EQ(6, float_buffer_writable(b)); + + // (w, r)=(3, 6) + readable = 10; + float_buffer_written(b, 3); + float_buffer_read_pointer(b, 0, &readable); + EXPECT_EQ(4, readable); + + readable = 10; + float_buffer_read_pointer(b, 1, &readable); + EXPECT_EQ(3, readable); + + float_buffer_destroy(&b); +} + +} // namespace + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} |