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 #include "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/environment.h" | 6 #include "base/environment.h" |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/process_util.h" | 9 #include "base/process_util.h" |
10 #include "base/sync_socket.h" | 10 #include "base/sync_socket.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 static bool IsRunningHeadless() { | 36 static bool IsRunningHeadless() { |
37 scoped_ptr<base::Environment> env(base::Environment::Create()); | 37 scoped_ptr<base::Environment> env(base::Environment::Create()); |
38 if (env->HasVar("CHROME_HEADLESS")) | 38 if (env->HasVar("CHROME_HEADLESS")) |
39 return true; | 39 return true; |
40 return false; | 40 return false; |
41 } | 41 } |
42 | 42 |
43 class MockAudioRendererHost : public AudioRendererHost { | 43 class MockAudioRendererHost : public AudioRendererHost { |
44 public: | 44 public: |
45 explicit MockAudioRendererHost( | 45 explicit MockAudioRendererHost( |
46 AudioManager* audio_manager, | 46 media::AudioManager* audio_manager, |
47 content::MediaObserver* media_observer) | 47 content::MediaObserver* media_observer) |
48 : AudioRendererHost(audio_manager, media_observer), | 48 : AudioRendererHost(audio_manager, media_observer), |
49 shared_memory_length_(0) { | 49 shared_memory_length_(0) { |
50 } | 50 } |
51 | 51 |
52 virtual ~MockAudioRendererHost() { | 52 virtual ~MockAudioRendererHost() { |
53 // Make sure all audio streams have been deleted. | 53 // Make sure all audio streams have been deleted. |
54 EXPECT_EQ(0u, audio_entries_.size()); | 54 EXPECT_EQ(0u, audio_entries_.size()); |
55 } | 55 } |
56 | 56 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 protected: | 154 protected: |
155 virtual void SetUp() { | 155 virtual void SetUp() { |
156 // Create a message loop so AudioRendererHost can use it. | 156 // Create a message loop so AudioRendererHost can use it. |
157 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO)); | 157 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO)); |
158 | 158 |
159 // Claim to be on both the UI and IO threads to pass all the DCHECKS. | 159 // Claim to be on both the UI and IO threads to pass all the DCHECKS. |
160 io_thread_.reset(new BrowserThreadImpl(BrowserThread::IO, | 160 io_thread_.reset(new BrowserThreadImpl(BrowserThread::IO, |
161 message_loop_.get())); | 161 message_loop_.get())); |
162 ui_thread_.reset(new BrowserThreadImpl(BrowserThread::UI, | 162 ui_thread_.reset(new BrowserThreadImpl(BrowserThread::UI, |
163 message_loop_.get())); | 163 message_loop_.get())); |
164 audio_manager_.reset(AudioManager::Create()); | 164 audio_manager_.reset(media::AudioManager::Create()); |
165 observer_.reset(new MockMediaObserver()); | 165 observer_.reset(new MockMediaObserver()); |
166 host_ = new MockAudioRendererHost(audio_manager_.get(), observer_.get()); | 166 host_ = new MockAudioRendererHost(audio_manager_.get(), observer_.get()); |
167 | 167 |
168 // Simulate IPC channel connected. | 168 // Simulate IPC channel connected. |
169 host_->OnChannelConnected(base::GetCurrentProcId()); | 169 host_->OnChannelConnected(base::GetCurrentProcId()); |
170 } | 170 } |
171 | 171 |
172 virtual void TearDown() { | 172 virtual void TearDown() { |
173 // Simulate closing the IPC channel. | 173 // Simulate closing the IPC channel. |
174 host_->OnChannelClosing(); | 174 host_->OnChannelClosing(); |
(...skipping 13 matching lines...) Expand all Loading... |
188 | 188 |
189 void Create() { | 189 void Create() { |
190 EXPECT_CALL(*observer_, | 190 EXPECT_CALL(*observer_, |
191 OnSetAudioStreamStatus(_, kStreamId, "created")); | 191 OnSetAudioStreamStatus(_, kStreamId, "created")); |
192 | 192 |
193 InSequence s; | 193 InSequence s; |
194 // We will first receive an OnStreamCreated() signal. | 194 // We will first receive an OnStreamCreated() signal. |
195 EXPECT_CALL(*host_, OnStreamCreated(kStreamId, _)) | 195 EXPECT_CALL(*host_, OnStreamCreated(kStreamId, _)) |
196 .WillOnce(QuitMessageLoop(message_loop_.get())); | 196 .WillOnce(QuitMessageLoop(message_loop_.get())); |
197 | 197 |
198 AudioParameters::Format format; | 198 media::AudioParameters::Format format; |
199 if (mock_stream_) | 199 if (mock_stream_) |
200 format = AudioParameters::AUDIO_MOCK; | 200 format = media::AudioParameters::AUDIO_MOCK; |
201 else | 201 else |
202 format = AudioParameters::AUDIO_PCM_LINEAR; | 202 format = media::AudioParameters::AUDIO_PCM_LINEAR; |
203 | 203 |
204 AudioParameters params(format, CHANNEL_LAYOUT_STEREO, | 204 media::AudioParameters params( |
205 AudioParameters::kAudioCDSampleRate, 16, | 205 format, CHANNEL_LAYOUT_STEREO, |
206 AudioParameters::kAudioCDSampleRate / 10); | 206 media::AudioParameters::kAudioCDSampleRate, 16, |
| 207 media::AudioParameters::kAudioCDSampleRate / 10); |
207 | 208 |
208 // Send a create stream message to the audio output stream and wait until | 209 // Send a create stream message to the audio output stream and wait until |
209 // we receive the created message. | 210 // we receive the created message. |
210 host_->OnCreateStream(kStreamId, params); | 211 host_->OnCreateStream(kStreamId, params); |
211 message_loop_->Run(); | 212 message_loop_->Run(); |
212 } | 213 } |
213 | 214 |
214 void Close() { | 215 void Close() { |
215 EXPECT_CALL(*observer_, | 216 EXPECT_CALL(*observer_, |
216 OnSetAudioStreamStatus(_, kStreamId, "closed")); | 217 OnSetAudioStreamStatus(_, kStreamId, "closed")); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 // Expect the audio stream record is removed. | 273 // Expect the audio stream record is removed. |
273 EXPECT_EQ(0u, host_->audio_entries_.size()); | 274 EXPECT_EQ(0u, host_->audio_entries_.size()); |
274 } | 275 } |
275 | 276 |
276 // Called on the audio thread. | 277 // Called on the audio thread. |
277 static void PostQuitMessageLoop(MessageLoop* message_loop) { | 278 static void PostQuitMessageLoop(MessageLoop* message_loop) { |
278 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); | 279 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
279 } | 280 } |
280 | 281 |
281 // Called on the main thread. | 282 // Called on the main thread. |
282 static void PostQuitOnAudioThread(AudioManager* audio_manager, | 283 static void PostQuitOnAudioThread(media::AudioManager* audio_manager, |
283 MessageLoop* message_loop) { | 284 MessageLoop* message_loop) { |
284 audio_manager->GetMessageLoop()->PostTask(FROM_HERE, | 285 audio_manager->GetMessageLoop()->PostTask(FROM_HERE, |
285 base::Bind(&PostQuitMessageLoop, message_loop)); | 286 base::Bind(&PostQuitMessageLoop, message_loop)); |
286 } | 287 } |
287 | 288 |
288 // SyncWithAudioThread() waits until all pending tasks on the audio thread | 289 // SyncWithAudioThread() waits until all pending tasks on the audio thread |
289 // are executed while also processing pending task in message_loop_ on the | 290 // are executed while also processing pending task in message_loop_ on the |
290 // current thread. It is used to synchronize with the audio thread when we are | 291 // current thread. It is used to synchronize with the audio thread when we are |
291 // closing an audio stream. | 292 // closing an audio stream. |
292 void SyncWithAudioThread() { | 293 void SyncWithAudioThread() { |
293 // Don't use scoped_refptr to addref the AudioManager when posting | 294 // Don't use scoped_refptr to addref the media::AudioManager when posting |
294 // to the thread that itself owns. | 295 // to the thread that itself owns. |
295 message_loop_->PostTask( | 296 message_loop_->PostTask( |
296 FROM_HERE, base::Bind(&PostQuitOnAudioThread, | 297 FROM_HERE, base::Bind(&PostQuitOnAudioThread, |
297 base::Unretained(audio_manager_.get()), | 298 base::Unretained(audio_manager_.get()), |
298 message_loop_.get())); | 299 message_loop_.get())); |
299 message_loop_->Run(); | 300 message_loop_->Run(); |
300 } | 301 } |
301 | 302 |
302 MessageLoop* message_loop() { return message_loop_.get(); } | 303 MessageLoop* message_loop() { return message_loop_.get(); } |
303 MockAudioRendererHost* host() { return host_; } | 304 MockAudioRendererHost* host() { return host_; } |
304 void EnableRealDevice() { mock_stream_ = false; } | 305 void EnableRealDevice() { mock_stream_ = false; } |
305 | 306 |
306 private: | 307 private: |
307 bool mock_stream_; | 308 bool mock_stream_; |
308 scoped_ptr<MockMediaObserver> observer_; | 309 scoped_ptr<MockMediaObserver> observer_; |
309 scoped_refptr<MockAudioRendererHost> host_; | 310 scoped_refptr<MockAudioRendererHost> host_; |
310 scoped_ptr<MessageLoop> message_loop_; | 311 scoped_ptr<MessageLoop> message_loop_; |
311 scoped_ptr<BrowserThreadImpl> io_thread_; | 312 scoped_ptr<BrowserThreadImpl> io_thread_; |
312 scoped_ptr<BrowserThreadImpl> ui_thread_; | 313 scoped_ptr<BrowserThreadImpl> ui_thread_; |
313 scoped_ptr<AudioManager> audio_manager_; | 314 scoped_ptr<media::AudioManager> audio_manager_; |
314 | 315 |
315 DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest); | 316 DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest); |
316 }; | 317 }; |
317 | 318 |
318 TEST_F(AudioRendererHostTest, CreateAndClose) { | 319 TEST_F(AudioRendererHostTest, CreateAndClose) { |
319 if (!IsRunningHeadless()) | 320 if (!IsRunningHeadless()) |
320 EnableRealDevice(); | 321 EnableRealDevice(); |
321 | 322 |
322 Create(); | 323 Create(); |
323 Close(); | 324 Close(); |
(...skipping 30 matching lines...) Expand all Loading... |
354 if (!IsRunningHeadless()) | 355 if (!IsRunningHeadless()) |
355 EnableRealDevice(); | 356 EnableRealDevice(); |
356 | 357 |
357 Create(); | 358 Create(); |
358 SetVolume(0.5); | 359 SetVolume(0.5); |
359 Play(); | 360 Play(); |
360 Pause(); | 361 Pause(); |
361 | 362 |
362 // Expect the volume is set. | 363 // Expect the volume is set. |
363 if (IsRunningHeadless()) { | 364 if (IsRunningHeadless()) { |
364 EXPECT_EQ(0.5, FakeAudioOutputStream::GetCurrentFakeStream()->volume()); | 365 EXPECT_EQ(0.5, |
| 366 media::FakeAudioOutputStream::GetCurrentFakeStream()->volume()); |
365 } | 367 } |
366 Close(); | 368 Close(); |
367 } | 369 } |
368 | 370 |
369 // Simulate the case where a stream is not properly closed. | 371 // Simulate the case where a stream is not properly closed. |
370 TEST_F(AudioRendererHostTest, CreatePlayAndShutdown) { | 372 TEST_F(AudioRendererHostTest, CreatePlayAndShutdown) { |
371 if (!IsRunningHeadless()) | 373 if (!IsRunningHeadless()) |
372 EnableRealDevice(); | 374 EnableRealDevice(); |
373 | 375 |
374 Create(); | 376 Create(); |
(...skipping 27 matching lines...) Expand all Loading... |
402 EnableRealDevice(); | 404 EnableRealDevice(); |
403 | 405 |
404 Create(); | 406 Create(); |
405 Play(); | 407 Play(); |
406 SimulateError(); | 408 SimulateError(); |
407 Close(); | 409 Close(); |
408 } | 410 } |
409 | 411 |
410 | 412 |
411 // TODO(hclam): Add tests for data conversation in low latency mode. | 413 // TODO(hclam): Add tests for data conversation in low latency mode. |
OLD | NEW |