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 media::AudioManager* audio_manager, | 46 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(media::AudioManager::Create()); | 164 audio_manager_.reset(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 media::AudioParameters::Format format; | 198 AudioParameters::Format format; |
199 if (mock_stream_) | 199 if (mock_stream_) |
200 format = media::AudioParameters::AUDIO_MOCK; | 200 format = AudioParameters::AUDIO_MOCK; |
201 else | 201 else |
202 format = media::AudioParameters::AUDIO_PCM_LINEAR; | 202 format = AudioParameters::AUDIO_PCM_LINEAR; |
203 | 203 |
204 media::AudioParameters params( | 204 AudioParameters params(format, CHANNEL_LAYOUT_STEREO, |
205 format, CHANNEL_LAYOUT_STEREO, | 205 AudioParameters::kAudioCDSampleRate, 16, |
206 media::AudioParameters::kAudioCDSampleRate, 16, | 206 AudioParameters::kAudioCDSampleRate / 10); |
207 media::AudioParameters::kAudioCDSampleRate / 10); | |
208 | 207 |
209 // Send a create stream message to the audio output stream and wait until | 208 // Send a create stream message to the audio output stream and wait until |
210 // we receive the created message. | 209 // we receive the created message. |
211 host_->OnCreateStream(kStreamId, params); | 210 host_->OnCreateStream(kStreamId, params); |
212 message_loop_->Run(); | 211 message_loop_->Run(); |
213 } | 212 } |
214 | 213 |
215 void Close() { | 214 void Close() { |
216 EXPECT_CALL(*observer_, | 215 EXPECT_CALL(*observer_, |
217 OnSetAudioStreamStatus(_, kStreamId, "closed")); | 216 OnSetAudioStreamStatus(_, kStreamId, "closed")); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 // Expect the audio stream record is removed. | 272 // Expect the audio stream record is removed. |
274 EXPECT_EQ(0u, host_->audio_entries_.size()); | 273 EXPECT_EQ(0u, host_->audio_entries_.size()); |
275 } | 274 } |
276 | 275 |
277 // Called on the audio thread. | 276 // Called on the audio thread. |
278 static void PostQuitMessageLoop(MessageLoop* message_loop) { | 277 static void PostQuitMessageLoop(MessageLoop* message_loop) { |
279 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); | 278 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
280 } | 279 } |
281 | 280 |
282 // Called on the main thread. | 281 // Called on the main thread. |
283 static void PostQuitOnAudioThread(media::AudioManager* audio_manager, | 282 static void PostQuitOnAudioThread(AudioManager* audio_manager, |
284 MessageLoop* message_loop) { | 283 MessageLoop* message_loop) { |
285 audio_manager->GetMessageLoop()->PostTask(FROM_HERE, | 284 audio_manager->GetMessageLoop()->PostTask(FROM_HERE, |
286 base::Bind(&PostQuitMessageLoop, message_loop)); | 285 base::Bind(&PostQuitMessageLoop, message_loop)); |
287 } | 286 } |
288 | 287 |
289 // SyncWithAudioThread() waits until all pending tasks on the audio thread | 288 // SyncWithAudioThread() waits until all pending tasks on the audio thread |
290 // are executed while also processing pending task in message_loop_ on the | 289 // are executed while also processing pending task in message_loop_ on the |
291 // current thread. It is used to synchronize with the audio thread when we are | 290 // current thread. It is used to synchronize with the audio thread when we are |
292 // closing an audio stream. | 291 // closing an audio stream. |
293 void SyncWithAudioThread() { | 292 void SyncWithAudioThread() { |
294 // Don't use scoped_refptr to addref the media::AudioManager when posting | 293 // Don't use scoped_refptr to addref the AudioManager when posting |
295 // to the thread that itself owns. | 294 // to the thread that itself owns. |
296 message_loop_->PostTask( | 295 message_loop_->PostTask( |
297 FROM_HERE, base::Bind(&PostQuitOnAudioThread, | 296 FROM_HERE, base::Bind(&PostQuitOnAudioThread, |
298 base::Unretained(audio_manager_.get()), | 297 base::Unretained(audio_manager_.get()), |
299 message_loop_.get())); | 298 message_loop_.get())); |
300 message_loop_->Run(); | 299 message_loop_->Run(); |
301 } | 300 } |
302 | 301 |
303 MessageLoop* message_loop() { return message_loop_.get(); } | 302 MessageLoop* message_loop() { return message_loop_.get(); } |
304 MockAudioRendererHost* host() { return host_; } | 303 MockAudioRendererHost* host() { return host_; } |
305 void EnableRealDevice() { mock_stream_ = false; } | 304 void EnableRealDevice() { mock_stream_ = false; } |
306 | 305 |
307 private: | 306 private: |
308 bool mock_stream_; | 307 bool mock_stream_; |
309 scoped_ptr<MockMediaObserver> observer_; | 308 scoped_ptr<MockMediaObserver> observer_; |
310 scoped_refptr<MockAudioRendererHost> host_; | 309 scoped_refptr<MockAudioRendererHost> host_; |
311 scoped_ptr<MessageLoop> message_loop_; | 310 scoped_ptr<MessageLoop> message_loop_; |
312 scoped_ptr<BrowserThreadImpl> io_thread_; | 311 scoped_ptr<BrowserThreadImpl> io_thread_; |
313 scoped_ptr<BrowserThreadImpl> ui_thread_; | 312 scoped_ptr<BrowserThreadImpl> ui_thread_; |
314 scoped_ptr<media::AudioManager> audio_manager_; | 313 scoped_ptr<AudioManager> audio_manager_; |
315 | 314 |
316 DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest); | 315 DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest); |
317 }; | 316 }; |
318 | 317 |
319 TEST_F(AudioRendererHostTest, CreateAndClose) { | 318 TEST_F(AudioRendererHostTest, CreateAndClose) { |
320 if (!IsRunningHeadless()) | 319 if (!IsRunningHeadless()) |
321 EnableRealDevice(); | 320 EnableRealDevice(); |
322 | 321 |
323 Create(); | 322 Create(); |
324 Close(); | 323 Close(); |
(...skipping 30 matching lines...) Expand all Loading... |
355 if (!IsRunningHeadless()) | 354 if (!IsRunningHeadless()) |
356 EnableRealDevice(); | 355 EnableRealDevice(); |
357 | 356 |
358 Create(); | 357 Create(); |
359 SetVolume(0.5); | 358 SetVolume(0.5); |
360 Play(); | 359 Play(); |
361 Pause(); | 360 Pause(); |
362 | 361 |
363 // Expect the volume is set. | 362 // Expect the volume is set. |
364 if (IsRunningHeadless()) { | 363 if (IsRunningHeadless()) { |
365 EXPECT_EQ(0.5, | 364 EXPECT_EQ(0.5, FakeAudioOutputStream::GetCurrentFakeStream()->volume()); |
366 media::FakeAudioOutputStream::GetCurrentFakeStream()->volume()); | |
367 } | 365 } |
368 Close(); | 366 Close(); |
369 } | 367 } |
370 | 368 |
371 // Simulate the case where a stream is not properly closed. | 369 // Simulate the case where a stream is not properly closed. |
372 TEST_F(AudioRendererHostTest, CreatePlayAndShutdown) { | 370 TEST_F(AudioRendererHostTest, CreatePlayAndShutdown) { |
373 if (!IsRunningHeadless()) | 371 if (!IsRunningHeadless()) |
374 EnableRealDevice(); | 372 EnableRealDevice(); |
375 | 373 |
376 Create(); | 374 Create(); |
(...skipping 27 matching lines...) Expand all Loading... |
404 EnableRealDevice(); | 402 EnableRealDevice(); |
405 | 403 |
406 Create(); | 404 Create(); |
407 Play(); | 405 Play(); |
408 SimulateError(); | 406 SimulateError(); |
409 Close(); | 407 Close(); |
410 } | 408 } |
411 | 409 |
412 | 410 |
413 // TODO(hclam): Add tests for data conversation in low latency mode. | 411 // TODO(hclam): Add tests for data conversation in low latency mode. |
OLD | NEW |