delay_buffer_unittest.cc 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/audio/delay_buffer.h"
  5. #include <algorithm>
  6. #include "media/base/audio_bus.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. namespace audio {
  9. namespace {
  10. constexpr int kChannels = 1;
  11. constexpr int kMaxFrames = 32;
  12. #define EXPECT_BUS_VALUES_EQ(bus, begin, end, value) \
  13. { \
  14. const auto IsValue = [](float x) { return x == (value); }; \
  15. EXPECT_TRUE(std::all_of((bus)->channel(0) + (begin), \
  16. (bus)->channel(0) + (end) - (begin), IsValue)); \
  17. }
  18. TEST(DelayBufferTest, RecordsAMaximumNumberOfFrames) {
  19. DelayBuffer buffer(kMaxFrames);
  20. ASSERT_EQ(buffer.GetBeginPosition(), buffer.GetEndPosition());
  21. constexpr int frames_per_bus = kMaxFrames / 4;
  22. const auto bus = media::AudioBus::Create(kChannels, frames_per_bus);
  23. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 1.0);
  24. // Fill the buffer.
  25. DelayBuffer::FrameTicks position = 0;
  26. for (int i = 0; i < 4; ++i) {
  27. buffer.Write(position, *bus, 1.0);
  28. position += frames_per_bus;
  29. EXPECT_EQ(0, buffer.GetBeginPosition());
  30. EXPECT_EQ(position, buffer.GetEndPosition());
  31. }
  32. // Writing just one more bus should cause the leading frames to be dropped.
  33. buffer.Write(position, *bus, 1.0);
  34. position += frames_per_bus;
  35. EXPECT_EQ(position - kMaxFrames, buffer.GetBeginPosition());
  36. EXPECT_EQ(position, buffer.GetEndPosition());
  37. // Now, simulate a gap in the recording by recording the next bus late.
  38. position += frames_per_bus * 2;
  39. buffer.Write(position, *bus, 1.0);
  40. position += frames_per_bus;
  41. EXPECT_EQ(position - kMaxFrames, buffer.GetBeginPosition());
  42. EXPECT_EQ(position, buffer.GetEndPosition());
  43. }
  44. TEST(DelayBufferTest, ReadsSilenceIfNothingWasRecorded) {
  45. DelayBuffer buffer(kMaxFrames);
  46. ASSERT_EQ(buffer.GetBeginPosition(), buffer.GetEndPosition());
  47. DelayBuffer::FrameTicks position = 0;
  48. constexpr int frames_per_bus = kMaxFrames / 4;
  49. const auto bus = media::AudioBus::Create(kChannels, frames_per_bus);
  50. for (int i = 0; i < 10; ++i) {
  51. // Set data in the bus to confirm it is all going to be overwritten.
  52. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 1.0);
  53. buffer.Read(position, frames_per_bus, bus.get());
  54. EXPECT_EQ(buffer.GetBeginPosition(), buffer.GetEndPosition());
  55. EXPECT_BUS_VALUES_EQ(bus, 0, frames_per_bus, 0.0);
  56. position += frames_per_bus;
  57. }
  58. }
  59. TEST(DelayBufferTest, ReadsSilenceIfOutsideRecordedRange) {
  60. DelayBuffer buffer(kMaxFrames);
  61. ASSERT_EQ(buffer.GetBeginPosition(), buffer.GetEndPosition());
  62. constexpr int frames_per_bus = kMaxFrames / 4;
  63. const auto bus = media::AudioBus::Create(kChannels, frames_per_bus);
  64. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 1.0);
  65. // Fill the buffer.
  66. DelayBuffer::FrameTicks position = 0;
  67. for (int i = 0; i < 4; ++i) {
  68. buffer.Write(position, *bus, 1.0);
  69. position += frames_per_bus;
  70. }
  71. EXPECT_EQ(0, buffer.GetBeginPosition());
  72. EXPECT_EQ(position, buffer.GetEndPosition());
  73. // Read before the begin position and expect to get silence.
  74. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 0.5);
  75. buffer.Read(-kMaxFrames, frames_per_bus, bus.get());
  76. EXPECT_BUS_VALUES_EQ(bus, 0, frames_per_bus, 0.0);
  77. // Read at a position one before the begin position. Expect the first sample
  78. // to be 0.0, and the rest 1.0.
  79. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 0.5);
  80. buffer.Read(buffer.GetBeginPosition() - 1, frames_per_bus, bus.get());
  81. EXPECT_EQ(0.0, bus->channel(0)[0]);
  82. EXPECT_BUS_VALUES_EQ(bus, 1, frames_per_bus - 1, 1.0);
  83. // Read at a position where the last sample should be 0.0 and the rest 1.0.
  84. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 0.5);
  85. buffer.Read(buffer.GetEndPosition() - frames_per_bus + 1, frames_per_bus,
  86. bus.get());
  87. EXPECT_BUS_VALUES_EQ(bus, 0, frames_per_bus - 1, 1.0);
  88. EXPECT_EQ(0.0, bus->channel(0)[frames_per_bus - 1]);
  89. // Read after the end position and expect to get silence.
  90. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 0.5);
  91. buffer.Read(kMaxFrames, frames_per_bus, bus.get());
  92. EXPECT_BUS_VALUES_EQ(bus, 0, frames_per_bus, 0.0);
  93. }
  94. TEST(DelayBufferTest, ReadsGapsInRecording) {
  95. DelayBuffer buffer(kMaxFrames);
  96. ASSERT_EQ(buffer.GetBeginPosition(), buffer.GetEndPosition());
  97. constexpr int frames_per_bus = kMaxFrames / 4;
  98. const auto bus = media::AudioBus::Create(kChannels, frames_per_bus);
  99. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 1.0);
  100. // Fill the buffer, but with a gap in the third quarter of it.
  101. DelayBuffer::FrameTicks record_position = 0;
  102. for (int i = 0; i < 4; ++i) {
  103. if (i != 2) {
  104. buffer.Write(record_position, *bus, 1.0);
  105. }
  106. record_position += frames_per_bus;
  107. }
  108. EXPECT_EQ(0, buffer.GetBeginPosition());
  109. EXPECT_EQ(record_position, buffer.GetEndPosition());
  110. // Read through the whole range, but offset by one frame early. Confirm the
  111. // silence gap appears in the right place.
  112. DelayBuffer::FrameTicks read_position = -1;
  113. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 0.5);
  114. buffer.Read(read_position, frames_per_bus, bus.get());
  115. read_position += frames_per_bus;
  116. EXPECT_EQ(0.0, bus->channel(0)[0]);
  117. EXPECT_BUS_VALUES_EQ(bus, 1, frames_per_bus - 1, 1.0);
  118. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 0.5);
  119. buffer.Read(read_position, frames_per_bus, bus.get());
  120. read_position += frames_per_bus;
  121. EXPECT_BUS_VALUES_EQ(bus, 0, frames_per_bus, 1.0);
  122. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 0.5);
  123. buffer.Read(read_position, frames_per_bus, bus.get());
  124. read_position += frames_per_bus;
  125. EXPECT_EQ(1.0, bus->channel(0)[0]);
  126. // The gap begins.
  127. EXPECT_BUS_VALUES_EQ(bus, 1, frames_per_bus - 1, 0.0);
  128. std::fill(bus->channel(0), bus->channel(0) + frames_per_bus, 0.5);
  129. buffer.Read(read_position, frames_per_bus, bus.get());
  130. read_position += frames_per_bus;
  131. EXPECT_EQ(0.0, bus->channel(0)[0]);
  132. // The gap ends.
  133. EXPECT_BUS_VALUES_EQ(bus, 1, frames_per_bus - 1, 1.0);
  134. }
  135. } // namespace
  136. } // namespace audio