| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 // TODO(henrika): add test which included |start_frame| in Consume() call. | 5 // TODO(henrika): add test which included |start_frame| in Consume() call. | 
| 6 | 6 | 
|  | 7 #include <memory> | 
|  | 8 | 
| 7 #include "base/macros.h" | 9 #include "base/macros.h" | 
| 8 #include "media/base/audio_fifo.h" | 10 #include "media/base/audio_fifo.h" | 
| 9 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" | 
| 10 | 12 | 
| 11 namespace media { | 13 namespace media { | 
| 12 | 14 | 
| 13 class AudioFifoTest : public testing::Test { | 15 class AudioFifoTest : public testing::Test { | 
| 14  public: | 16  public: | 
| 15   AudioFifoTest() {} | 17   AudioFifoTest() {} | 
| 16   ~AudioFifoTest() override {} | 18   ~AudioFifoTest() override {} | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 32   EXPECT_EQ(fifo.frames(), 0); | 34   EXPECT_EQ(fifo.frames(), 0); | 
| 33 } | 35 } | 
| 34 | 36 | 
| 35 // Pushes audio bus objects to a FIFO and fill it up to different degrees. | 37 // Pushes audio bus objects to a FIFO and fill it up to different degrees. | 
| 36 TEST_F(AudioFifoTest, Push) { | 38 TEST_F(AudioFifoTest, Push) { | 
| 37   static const int kChannels = 2; | 39   static const int kChannels = 2; | 
| 38   static const int kMaxFrameCount = 128; | 40   static const int kMaxFrameCount = 128; | 
| 39   AudioFifo fifo(kChannels, kMaxFrameCount); | 41   AudioFifo fifo(kChannels, kMaxFrameCount); | 
| 40   { | 42   { | 
| 41     SCOPED_TRACE("Push 50%"); | 43     SCOPED_TRACE("Push 50%"); | 
| 42     scoped_ptr<AudioBus> bus = AudioBus::Create(kChannels, kMaxFrameCount / 2); | 44     std::unique_ptr<AudioBus> bus = | 
|  | 45         AudioBus::Create(kChannels, kMaxFrameCount / 2); | 
| 43     EXPECT_EQ(fifo.frames(), 0); | 46     EXPECT_EQ(fifo.frames(), 0); | 
| 44     fifo.Push(bus.get()); | 47     fifo.Push(bus.get()); | 
| 45     EXPECT_EQ(fifo.frames(), bus->frames()); | 48     EXPECT_EQ(fifo.frames(), bus->frames()); | 
| 46     fifo.Clear(); | 49     fifo.Clear(); | 
| 47   } | 50   } | 
| 48   { | 51   { | 
| 49     SCOPED_TRACE("Push 100%"); | 52     SCOPED_TRACE("Push 100%"); | 
| 50     scoped_ptr<AudioBus> bus = AudioBus::Create(kChannels, kMaxFrameCount); | 53     std::unique_ptr<AudioBus> bus = AudioBus::Create(kChannels, kMaxFrameCount); | 
| 51     EXPECT_EQ(fifo.frames(), 0); | 54     EXPECT_EQ(fifo.frames(), 0); | 
| 52     fifo.Push(bus.get()); | 55     fifo.Push(bus.get()); | 
| 53     EXPECT_EQ(fifo.frames(), bus->frames()); | 56     EXPECT_EQ(fifo.frames(), bus->frames()); | 
| 54     fifo.Clear(); | 57     fifo.Clear(); | 
| 55   } | 58   } | 
| 56 } | 59 } | 
| 57 | 60 | 
| 58 // Consumes audio bus objects from a FIFO and empty it to different degrees. | 61 // Consumes audio bus objects from a FIFO and empty it to different degrees. | 
| 59 TEST_F(AudioFifoTest, Consume) { | 62 TEST_F(AudioFifoTest, Consume) { | 
| 60   static const int kChannels = 2; | 63   static const int kChannels = 2; | 
| 61   static const int kMaxFrameCount = 128; | 64   static const int kMaxFrameCount = 128; | 
| 62   AudioFifo fifo(kChannels, kMaxFrameCount); | 65   AudioFifo fifo(kChannels, kMaxFrameCount); | 
| 63   { | 66   { | 
| 64     scoped_ptr<AudioBus> bus = AudioBus::Create(kChannels, kMaxFrameCount); | 67     std::unique_ptr<AudioBus> bus = AudioBus::Create(kChannels, kMaxFrameCount); | 
| 65     fifo.Push(bus.get()); | 68     fifo.Push(bus.get()); | 
| 66     EXPECT_EQ(fifo.frames(), kMaxFrameCount); | 69     EXPECT_EQ(fifo.frames(), kMaxFrameCount); | 
| 67   } | 70   } | 
| 68   { | 71   { | 
| 69     SCOPED_TRACE("Consume 50%"); | 72     SCOPED_TRACE("Consume 50%"); | 
| 70     scoped_ptr<AudioBus> bus = AudioBus::Create(kChannels, kMaxFrameCount / 2); | 73     std::unique_ptr<AudioBus> bus = | 
|  | 74         AudioBus::Create(kChannels, kMaxFrameCount / 2); | 
| 71     fifo.Consume(bus.get(), 0, bus->frames()); | 75     fifo.Consume(bus.get(), 0, bus->frames()); | 
| 72     EXPECT_TRUE(fifo.frames() == bus->frames()); | 76     EXPECT_TRUE(fifo.frames() == bus->frames()); | 
| 73     fifo.Push(bus.get()); | 77     fifo.Push(bus.get()); | 
| 74     EXPECT_EQ(fifo.frames(), kMaxFrameCount); | 78     EXPECT_EQ(fifo.frames(), kMaxFrameCount); | 
| 75   } | 79   } | 
| 76   { | 80   { | 
| 77     SCOPED_TRACE("Consume 100%"); | 81     SCOPED_TRACE("Consume 100%"); | 
| 78     scoped_ptr<AudioBus> bus = AudioBus::Create(kChannels, kMaxFrameCount); | 82     std::unique_ptr<AudioBus> bus = AudioBus::Create(kChannels, kMaxFrameCount); | 
| 79     fifo.Consume(bus.get(), 0, bus->frames()); | 83     fifo.Consume(bus.get(), 0, bus->frames()); | 
| 80     EXPECT_EQ(fifo.frames(), 0); | 84     EXPECT_EQ(fifo.frames(), 0); | 
| 81     fifo.Push(bus.get()); | 85     fifo.Push(bus.get()); | 
| 82     EXPECT_EQ(fifo.frames(), kMaxFrameCount); | 86     EXPECT_EQ(fifo.frames(), kMaxFrameCount); | 
| 83   } | 87   } | 
| 84 } | 88 } | 
| 85 | 89 | 
| 86 // Verify that the frames() method of the FIFO works as intended while | 90 // Verify that the frames() method of the FIFO works as intended while | 
| 87 // appending and removing audio bus elements to/from the FIFO. | 91 // appending and removing audio bus elements to/from the FIFO. | 
| 88 TEST_F(AudioFifoTest, FramesInFifo) { | 92 TEST_F(AudioFifoTest, FramesInFifo) { | 
| 89   static const int kChannels = 2; | 93   static const int kChannels = 2; | 
| 90   static const int kMaxFrameCount = 64; | 94   static const int kMaxFrameCount = 64; | 
| 91   AudioFifo fifo(kChannels, kMaxFrameCount); | 95   AudioFifo fifo(kChannels, kMaxFrameCount); | 
| 92 | 96 | 
| 93   // Fill up the FIFO and verify that the size grows as it should while adding | 97   // Fill up the FIFO and verify that the size grows as it should while adding | 
| 94   // one audio frame each time. | 98   // one audio frame each time. | 
| 95   scoped_ptr<AudioBus> bus = AudioBus::Create(kChannels, 1); | 99   std::unique_ptr<AudioBus> bus = AudioBus::Create(kChannels, 1); | 
| 96   int n = 0; | 100   int n = 0; | 
| 97   while (fifo.frames() < kMaxFrameCount) { | 101   while (fifo.frames() < kMaxFrameCount) { | 
| 98     fifo.Push(bus.get()); | 102     fifo.Push(bus.get()); | 
| 99     EXPECT_EQ(fifo.frames(), ++n); | 103     EXPECT_EQ(fifo.frames(), ++n); | 
| 100   } | 104   } | 
| 101   EXPECT_EQ(fifo.frames(), kMaxFrameCount); | 105   EXPECT_EQ(fifo.frames(), kMaxFrameCount); | 
| 102 | 106 | 
| 103   // Empty the FIFO and verify that the size decreases as it should. | 107   // Empty the FIFO and verify that the size decreases as it should. | 
| 104   // Reduce the size of the FIFO by one frame each time. | 108   // Reduce the size of the FIFO by one frame each time. | 
| 105   while (fifo.frames() > 0) { | 109   while (fifo.frames() > 0) { | 
| 106     fifo.Consume(bus.get(), 0, bus->frames()); | 110     fifo.Consume(bus.get(), 0, bus->frames()); | 
| 107     EXPECT_EQ(fifo.frames(), --n); | 111     EXPECT_EQ(fifo.frames(), --n); | 
| 108   } | 112   } | 
| 109   EXPECT_EQ(fifo.frames(), 0); | 113   EXPECT_EQ(fifo.frames(), 0); | 
| 110 | 114 | 
| 111   // Verify that a steady-state size of #frames in the FIFO is maintained | 115   // Verify that a steady-state size of #frames in the FIFO is maintained | 
| 112   // during a sequence of Push/Consume calls which involves wrapping. We ensure | 116   // during a sequence of Push/Consume calls which involves wrapping. We ensure | 
| 113   // wrapping by selecting a buffer size which does divides the FIFO size | 117   // wrapping by selecting a buffer size which does divides the FIFO size | 
| 114   // with a remainder of one. | 118   // with a remainder of one. | 
| 115   scoped_ptr<AudioBus> bus2 = | 119   std::unique_ptr<AudioBus> bus2 = | 
| 116       AudioBus::Create(kChannels, (kMaxFrameCount / 4) - 1); | 120       AudioBus::Create(kChannels, (kMaxFrameCount / 4) - 1); | 
| 117   const int frames_in_fifo = bus2->frames(); | 121   const int frames_in_fifo = bus2->frames(); | 
| 118   fifo.Push(bus2.get()); | 122   fifo.Push(bus2.get()); | 
| 119   EXPECT_EQ(fifo.frames(), frames_in_fifo); | 123   EXPECT_EQ(fifo.frames(), frames_in_fifo); | 
| 120   for (int n = 0; n < kMaxFrameCount; ++n) { | 124   for (int n = 0; n < kMaxFrameCount; ++n) { | 
| 121     fifo.Push(bus2.get()); | 125     fifo.Push(bus2.get()); | 
| 122     fifo.Consume(bus2.get(), 0, frames_in_fifo); | 126     fifo.Consume(bus2.get(), 0, frames_in_fifo); | 
| 123     EXPECT_EQ(fifo.frames(), frames_in_fifo); | 127     EXPECT_EQ(fifo.frames(), frames_in_fifo); | 
| 124   } | 128   } | 
| 125 } | 129 } | 
| 126 | 130 | 
| 127 // Perform a sequence of Push/Consume calls and verify that the data written | 131 // Perform a sequence of Push/Consume calls and verify that the data written | 
| 128 // to the FIFO is correctly retrieved, i.e., that the order is correct and the | 132 // to the FIFO is correctly retrieved, i.e., that the order is correct and the | 
| 129 // values are correct. | 133 // values are correct. | 
| 130 TEST_F(AudioFifoTest, VerifyDataValues) { | 134 TEST_F(AudioFifoTest, VerifyDataValues) { | 
| 131   static const int kChannels = 2; | 135   static const int kChannels = 2; | 
| 132   static const int kFrameCount = 2; | 136   static const int kFrameCount = 2; | 
| 133   static const int kFifoFrameCount = 5 * kFrameCount; | 137   static const int kFifoFrameCount = 5 * kFrameCount; | 
| 134 | 138 | 
| 135   AudioFifo fifo(kChannels, kFifoFrameCount); | 139   AudioFifo fifo(kChannels, kFifoFrameCount); | 
| 136   scoped_ptr<AudioBus> bus = AudioBus::Create(kChannels, kFrameCount); | 140   std::unique_ptr<AudioBus> bus = AudioBus::Create(kChannels, kFrameCount); | 
| 137   EXPECT_EQ(fifo.frames(), 0); | 141   EXPECT_EQ(fifo.frames(), 0); | 
| 138   EXPECT_EQ(bus->frames(), kFrameCount); | 142   EXPECT_EQ(bus->frames(), kFrameCount); | 
| 139 | 143 | 
| 140   // Start by filling up the FIFO with audio frames. The first audio frame | 144   // Start by filling up the FIFO with audio frames. The first audio frame | 
| 141   // will contain all 1's, the second all 2's etc. All channels contain the | 145   // will contain all 1's, the second all 2's etc. All channels contain the | 
| 142   // same value. | 146   // same value. | 
| 143   int value = 1; | 147   int value = 1; | 
| 144   while (fifo.frames() < kFifoFrameCount) { | 148   while (fifo.frames() < kFifoFrameCount) { | 
| 145     for (int j = 0; j < bus->channels(); ++j) | 149     for (int j = 0; j < bus->channels(); ++j) | 
| 146       std::fill(bus->channel(j), bus->channel(j) + bus->frames(), value); | 150       std::fill(bus->channel(j), bus->channel(j) + bus->frames(), value); | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 186       VerifyValue(bus->channel(j), bus->channels(), value); | 190       VerifyValue(bus->channel(j), bus->channels(), value); | 
| 187       std::fill(bus->channel(j), bus->channel(j) + bus->frames(), value + 1); | 191       std::fill(bus->channel(j), bus->channel(j) + bus->frames(), value + 1); | 
| 188     } | 192     } | 
| 189     fifo.Push(bus.get()); | 193     fifo.Push(bus.get()); | 
| 190     EXPECT_EQ(fifo.frames(), bus->frames()); | 194     EXPECT_EQ(fifo.frames(), bus->frames()); | 
| 191     ++value; | 195     ++value; | 
| 192   } | 196   } | 
| 193 } | 197 } | 
| 194 | 198 | 
| 195 }  // namespace media | 199 }  // namespace media | 
| OLD | NEW | 
|---|