Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(357)

Side by Side Diff: media/audio/audio_output_controller_unittest.cc

Issue 3192017: Revert 57254 - Share one thread between all AudioOutputControllers instead of... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/audio/audio_output_controller.cc ('k') | media/audio/fake_audio_input_stream_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 #include "base/environment.h" 5 #include "base/environment.h"
6 #include "base/basictypes.h" 6 #include "base/basictypes.h"
7 #include "base/waitable_event.h" 7 #include "base/waitable_event.h"
8 #include "media/audio/audio_output_controller.h" 8 #include "media/audio/audio_output_controller.h"
9 #include "testing/gmock/include/gmock/gmock.h" 9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
11 11
12 using ::testing::_; 12 using ::testing::_;
13 using ::testing::AtLeast; 13 using ::testing::AtLeast;
14 using ::testing::Exactly; 14 using ::testing::Exactly;
15 using ::testing::InvokeWithoutArgs; 15 using ::testing::InvokeWithoutArgs;
16 using ::testing::NotNull; 16 using ::testing::NotNull;
17 using ::testing::Return;
18 17
19 static const int kSampleRate = AudioManager::kAudioCDSampleRate; 18 static const int kSampleRate = AudioManager::kAudioCDSampleRate;
20 static const int kBitsPerSample = 16; 19 static const int kBitsPerSample = 16;
21 static const int kChannels = 2; 20 static const int kChannels = 2;
22 static const int kHardwareBufferSize = kSampleRate * kBitsPerSample * 21 static const int kHardwareBufferSize = kSampleRate * kBitsPerSample *
23 kChannels / 8; 22 kChannels / 8;
24 static const int kBufferCapacity = 3 * kHardwareBufferSize; 23 static const int kBufferCapacity = 3 * kHardwareBufferSize;
25 24
26 namespace media { 25 namespace media {
27 26
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 return audio_man->HasAudioOutputDevices(); 61 return audio_man->HasAudioOutputDevices();
63 } 62 }
64 63
65 static bool IsRunningHeadless() { 64 static bool IsRunningHeadless() {
66 scoped_ptr<base::Environment> env(base::Environment::Create()); 65 scoped_ptr<base::Environment> env(base::Environment::Create());
67 if (env->HasVar("CHROME_HEADLESS")) 66 if (env->HasVar("CHROME_HEADLESS"))
68 return true; 67 return true;
69 return false; 68 return false;
70 } 69 }
71 70
72 ACTION_P(SignalEvent, event) {
73 event->Signal();
74 }
75
76 ACTION_P3(SignalEvent, event, count, limit) { 71 ACTION_P3(SignalEvent, event, count, limit) {
77 if (++*count >= limit) { 72 if (++*count >= limit) {
78 event->Signal(); 73 event->Signal();
79 } 74 }
80 } 75 }
81 76
82 TEST(AudioOutputControllerTest, CreateAndClose) { 77 TEST(AudioOutputControllerTest, CreateAndClose) {
83 if (!HasAudioOutputDevices() || IsRunningHeadless()) 78 if (!HasAudioOutputDevices() || IsRunningHeadless())
84 return; 79 return;
85 80
86 MockAudioOutputControllerEventHandler event_handler; 81 MockAudioOutputControllerEventHandler event_handler;
87 scoped_refptr<AudioOutputController> controller = 82 scoped_refptr<AudioOutputController> controller =
88 AudioOutputController::Create(&event_handler, 83 AudioOutputController::Create(&event_handler,
89 AudioManager::AUDIO_PCM_LINEAR, kChannels, 84 AudioManager::AUDIO_PCM_LINEAR, kChannels,
90 kSampleRate, kBitsPerSample, 85 kSampleRate, kBitsPerSample,
91 kHardwareBufferSize, kBufferCapacity); 86 kHardwareBufferSize, kBufferCapacity);
92 ASSERT_TRUE(controller.get()); 87 ASSERT_TRUE(controller.get());
93 88
94 // Close the controller immediately. At this point, chances are that 89 // Close the controller immediately.
95 // DoCreate() hasn't been called yet. In any case, it should be safe to call
96 // Close() and it should not try to call |event_handler| later (the test
97 // would crash otherwise).
98 controller->Close(); 90 controller->Close();
99 } 91 }
100 92
101 TEST(AudioOutputControllerTest, PlayAndClose) { 93 TEST(AudioOutputControllerTest, PlayAndClose) {
102 if (!HasAudioOutputDevices() || IsRunningHeadless()) 94 if (!HasAudioOutputDevices() || IsRunningHeadless())
103 return; 95 return;
104 96
105 MockAudioOutputControllerEventHandler event_handler; 97 MockAudioOutputControllerEventHandler event_handler;
106 base::WaitableEvent event(false, false); 98 base::WaitableEvent event(false, false);
107 int count = 0; 99 int count = 0;
108 100
109 // If OnCreated is called then signal the event. 101 // If OnCreated is called then signal the event.
110 EXPECT_CALL(event_handler, OnCreated(NotNull())) 102 EXPECT_CALL(event_handler, OnCreated(NotNull()))
111 .WillOnce(SignalEvent(&event)); 103 .WillOnce(InvokeWithoutArgs(&event, &base::WaitableEvent::Signal));
112 104
113 // OnPlaying() will be called only once. 105 // OnPlaying() will be called only once.
114 EXPECT_CALL(event_handler, OnPlaying(NotNull())) 106 EXPECT_CALL(event_handler, OnPlaying(NotNull()))
115 .Times(Exactly(1)); 107 .Times(Exactly(1));
116 108
117 // If OnMoreData is called enough then signal the event. 109 // If OnMoreData is called enough then signal the event.
118 EXPECT_CALL(event_handler, OnMoreData(NotNull(), _, 0)) 110 EXPECT_CALL(event_handler, OnMoreData(NotNull(), _, 0))
119 .Times(AtLeast(10)) 111 .Times(AtLeast(10))
120 .WillRepeatedly(SignalEvent(&event, &count, 10)); 112 .WillRepeatedly(SignalEvent(&event, &count, 10));
121 113
122 scoped_refptr<AudioOutputController> controller = 114 scoped_refptr<AudioOutputController> controller =
123 AudioOutputController::Create(&event_handler, 115 AudioOutputController::Create(&event_handler,
124 AudioManager::AUDIO_PCM_LINEAR, kChannels, 116 AudioManager::AUDIO_PCM_LINEAR, kChannels,
125 kSampleRate, kBitsPerSample, 117 kSampleRate, kBitsPerSample,
126 kHardwareBufferSize, kBufferCapacity); 118 kHardwareBufferSize, kBufferCapacity);
127 ASSERT_TRUE(controller.get()); 119 ASSERT_TRUE(controller.get());
128 120
129 // Wait for OnCreated() to be called. 121 // Wait for OnCreated() to be called.
130 event.Wait(); 122 event.Wait();
123 event.Reset();
131 124
132 // Play and then wait for the event to be signaled. 125 // Play and then wait for the event to be signaled.
133 controller->Play(); 126 controller->Play();
134 event.Wait(); 127 event.Wait();
135 128
136 // Now stop the controller. The object is freed later after DoClose() is 129 // Now stop the controller. This should shutdown the internal
137 // executed. 130 // thread and we hold the only reference to it.
138 controller->Close(); 131 controller->Close();
139 } 132 }
140 133
141 TEST(AudioOutputControllerTest, PlayPauseClose) { 134 TEST(AudioOutputControllerTest, PlayPauseClose) {
142 if (!HasAudioOutputDevices() || IsRunningHeadless()) 135 if (!HasAudioOutputDevices() || IsRunningHeadless())
143 return; 136 return;
144 137
145 MockAudioOutputControllerEventHandler event_handler; 138 MockAudioOutputControllerEventHandler event_handler;
146 base::WaitableEvent event(false, false); 139 base::WaitableEvent event(false, false);
147 int count = 0; 140 int count = 0;
(...skipping 30 matching lines...) Expand all
178 171
179 // Play and then wait for the event to be signaled. 172 // Play and then wait for the event to be signaled.
180 controller->Play(); 173 controller->Play();
181 event.Wait(); 174 event.Wait();
182 event.Reset(); 175 event.Reset();
183 176
184 // And then wait for pause to complete. 177 // And then wait for pause to complete.
185 controller->Pause(); 178 controller->Pause();
186 event.Wait(); 179 event.Wait();
187 180
188 // Now stop the controller. The object is freed later after DoClose() is 181 // Now stop the controller. This should shutdown the internal
189 // executed. 182 // thread and we hold the only reference to it.
190 controller->Close(); 183 controller->Close();
191 } 184 }
192 185
193 TEST(AudioOutputControllerTest, PlayPausePlay) { 186 TEST(AudioOutputControllerTest, PlayPausePlay) {
194 if (!HasAudioOutputDevices() || IsRunningHeadless()) 187 if (!HasAudioOutputDevices() || IsRunningHeadless())
195 return; 188 return;
196 189
197 MockAudioOutputControllerEventHandler event_handler; 190 MockAudioOutputControllerEventHandler event_handler;
198 base::WaitableEvent event(false, false); 191 base::WaitableEvent event(false, false);
199 int count = 0; 192 int count = 0;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 // And then wait for pause to complete. 235 // And then wait for pause to complete.
243 controller->Pause(); 236 controller->Pause();
244 event.Wait(); 237 event.Wait();
245 event.Reset(); 238 event.Reset();
246 239
247 // Then we play again. 240 // Then we play again.
248 // Play and then wait for the event to be signaled. 241 // Play and then wait for the event to be signaled.
249 controller->Play(); 242 controller->Play();
250 event.Wait(); 243 event.Wait();
251 244
252 // Now stop the controller. The object is freed later after DoClose() is 245 // Now stop the controller. This should shutdown the internal
253 // executed. 246 // thread and we hold the only reference to it.
254 controller->Close(); 247 controller->Close();
255 } 248 }
256 249
257 TEST(AudioOutputControllerTest, HardwareBufferTooLarge) { 250 TEST(AudioOutputControllerTest, HardwareBufferTooLarge) {
258 if (!HasAudioOutputDevices() || IsRunningHeadless()) 251 if (!HasAudioOutputDevices() || IsRunningHeadless())
259 return; 252 return;
260 253
261 // Create an audio device with a very large hardware buffer size. 254 // Create an audio device with a very large hardware buffer size.
262 MockAudioOutputControllerEventHandler event_handler; 255 MockAudioOutputControllerEventHandler event_handler;
263 scoped_refptr<AudioOutputController> controller = 256 scoped_refptr<AudioOutputController> controller =
264 AudioOutputController::Create(&event_handler, 257 AudioOutputController::Create(&event_handler,
265 AudioManager::AUDIO_PCM_LINEAR, kChannels, 258 AudioManager::AUDIO_PCM_LINEAR, kChannels,
266 kSampleRate, kBitsPerSample, 259 kSampleRate, kBitsPerSample,
267 kHardwareBufferSize * 1000, 260 kHardwareBufferSize * 1000,
268 kBufferCapacity); 261 kBufferCapacity);
269 262
270 // Use assert because we don't stop the device and assume we can't 263 // Use assert because we don't stop the device and assume we can't
271 // create one. 264 // create one.
272 ASSERT_FALSE(controller); 265 ASSERT_FALSE(controller);
273 } 266 }
274 267
275 TEST(AudioOutputControllerTest, CloseTwice) { 268 TEST(AudioOutputControllerTest, CloseTwice) {
276 if (!HasAudioOutputDevices() || IsRunningHeadless()) 269 if (!HasAudioOutputDevices() || IsRunningHeadless())
277 return; 270 return;
278 271
279 MockAudioOutputControllerEventHandler event_handler; 272 MockAudioOutputControllerEventHandler event_handler;
280 base::WaitableEvent event(false, false);
281
282 // If OnCreated is called then signal the event.
283 EXPECT_CALL(event_handler, OnCreated(NotNull()))
284 .WillOnce(SignalEvent(&event));
285
286 // One OnMoreData() is expected.
287 EXPECT_CALL(event_handler, OnMoreData(NotNull(), _, 0))
288 .Times(AtLeast(1))
289 .WillRepeatedly(SignalEvent(&event));
290
291 scoped_refptr<AudioOutputController> controller = 273 scoped_refptr<AudioOutputController> controller =
292 AudioOutputController::Create(&event_handler, 274 AudioOutputController::Create(&event_handler,
293 AudioManager::AUDIO_PCM_LINEAR, kChannels, 275 AudioManager::AUDIO_PCM_LINEAR, kChannels,
294 kSampleRate, kBitsPerSample, 276 kSampleRate, kBitsPerSample,
295 kHardwareBufferSize, kBufferCapacity); 277 kHardwareBufferSize, kBufferCapacity);
296 ASSERT_TRUE(controller.get()); 278 ASSERT_TRUE(controller.get());
297 279
298 // Wait for OnCreated() to be called. 280 // Close the controller immediately.
299 event.Wait();
300
301 // Wait for OnMoreData() to be called.
302 event.Wait();
303
304 controller->Close(); 281 controller->Close();
305 controller->Close(); 282 controller->Close();
306 } 283 }
307 284
308 } // namespace media 285 } // namespace media
OLDNEW
« no previous file with comments | « media/audio/audio_output_controller.cc ('k') | media/audio/fake_audio_input_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698