OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "base/process_util.h" | 8 #include "base/process_util.h" |
9 #include "base/sync_socket.h" | 9 #include "base/sync_socket.h" |
10 #include "content/browser/browser_thread.h" | 10 #include "content/browser/browser_thread.h" |
11 #include "content/browser/mock_resource_context.h" | 11 #include "content/browser/mock_resource_context.h" |
12 #include "content/browser/renderer_host/media/audio_renderer_host.h" | 12 #include "content/browser/renderer_host/media/audio_renderer_host.h" |
13 #include "content/browser/renderer_host/media/mock_media_observer.h" | 13 #include "content/browser/renderer_host/media/mock_media_observer.h" |
14 #include "content/common/media/audio_messages.h" | 14 #include "content/common/media/audio_messages.h" |
15 #include "ipc/ipc_message_utils.h" | 15 #include "ipc/ipc_message_utils.h" |
16 #include "media/audio/audio_manager.h" | 16 #include "media/audio/audio_manager.h" |
17 #include "media/audio/fake_audio_output_stream.h" | 17 #include "media/audio/fake_audio_output_stream.h" |
18 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
20 | 20 |
21 using ::testing::_; | 21 using ::testing::_; |
22 using ::testing::AtLeast; | 22 using ::testing::AtLeast; |
23 using ::testing::DoAll; | 23 using ::testing::DoAll; |
24 using ::testing::InSequence; | 24 using ::testing::InSequence; |
25 using ::testing::InvokeWithoutArgs; | 25 using ::testing::InvokeWithoutArgs; |
26 using ::testing::Return; | 26 using ::testing::Return; |
27 using ::testing::SaveArg; | 27 using ::testing::SaveArg; |
28 using ::testing::SetArgumentPointee; | 28 using ::testing::SetArgumentPointee; |
29 | 29 |
30 static const int kInvalidId = -1; | |
31 static const int kRouteId = 200; | |
32 static const int kStreamId = 50; | 30 static const int kStreamId = 50; |
33 | 31 |
34 static bool IsRunningHeadless() { | 32 static bool IsRunningHeadless() { |
35 scoped_ptr<base::Environment> env(base::Environment::Create()); | 33 scoped_ptr<base::Environment> env(base::Environment::Create()); |
36 if (env->HasVar("CHROME_HEADLESS")) | 34 if (env->HasVar("CHROME_HEADLESS")) |
37 return true; | 35 return true; |
38 return false; | 36 return false; |
39 } | 37 } |
40 | 38 |
41 class MockAudioRendererHost : public AudioRendererHost { | 39 class MockAudioRendererHost : public AudioRendererHost { |
42 public: | 40 public: |
43 MockAudioRendererHost(const content::ResourceContext* resource_context) | 41 MockAudioRendererHost(const content::ResourceContext* resource_context) |
44 : AudioRendererHost(resource_context), | 42 : AudioRendererHost(resource_context), |
45 shared_memory_length_(0) { | 43 shared_memory_length_(0) { |
46 } | 44 } |
47 | 45 |
48 virtual ~MockAudioRendererHost() { | 46 virtual ~MockAudioRendererHost() { |
49 } | 47 } |
50 | 48 |
51 // A list of mock methods. | 49 // A list of mock methods. |
52 MOCK_METHOD3(OnRequestPacket, | 50 MOCK_METHOD2(OnRequestPacket, |
53 void(int routing_id, int stream_id, | 51 void(int stream_id, AudioBuffersState buffers_state)); |
54 AudioBuffersState buffers_state)); | 52 MOCK_METHOD2(OnStreamCreated, |
55 MOCK_METHOD3(OnStreamCreated, | 53 void(int stream_id, int length)); |
56 void(int routing_id, int stream_id, int length)); | 54 MOCK_METHOD2(OnLowLatencyStreamCreated, |
57 MOCK_METHOD3(OnLowLatencyStreamCreated, | 55 void(int stream_id, int length)); |
58 void(int routing_id, int stream_id, int length)); | 56 MOCK_METHOD1(OnStreamPlaying, void(int stream_id)); |
59 MOCK_METHOD2(OnStreamPlaying, void(int routing_id, int stream_id)); | 57 MOCK_METHOD1(OnStreamPaused, void(int stream_id)); |
60 MOCK_METHOD2(OnStreamPaused, void(int routing_id, int stream_id)); | 58 MOCK_METHOD1(OnStreamError, void(int stream_id)); |
61 MOCK_METHOD2(OnStreamError, void(int routing_id, int stream_id)); | 59 MOCK_METHOD2(OnStreamVolume, void(int stream_id, double volume)); |
62 MOCK_METHOD3(OnStreamVolume, | |
63 void(int routing_id, int stream_id, double volume)); | |
64 | 60 |
65 base::SharedMemory* shared_memory() { return shared_memory_.get(); } | 61 base::SharedMemory* shared_memory() { return shared_memory_.get(); } |
66 uint32 shared_memory_length() { return shared_memory_length_; } | 62 uint32 shared_memory_length() { return shared_memory_length_; } |
67 | 63 |
68 base::SyncSocket* sync_socket() { return sync_socket_.get(); } | 64 base::SyncSocket* sync_socket() { return sync_socket_.get(); } |
69 | 65 |
70 private: | 66 private: |
71 // This method is used to dispatch IPC messages to the renderer. We intercept | 67 // This method is used to dispatch IPC messages to the renderer. We intercept |
72 // these messages here and dispatch to our mock methods to verify the | 68 // these messages here and dispatch to our mock methods to verify the |
73 // conversation between this object and the renderer. | 69 // conversation between this object and the renderer. |
(...skipping 15 matching lines...) Expand all Loading... |
89 IPC_END_MESSAGE_MAP() | 85 IPC_END_MESSAGE_MAP() |
90 EXPECT_TRUE(handled); | 86 EXPECT_TRUE(handled); |
91 | 87 |
92 delete message; | 88 delete message; |
93 return true; | 89 return true; |
94 } | 90 } |
95 | 91 |
96 // These handler methods do minimal things and delegate to the mock methods. | 92 // These handler methods do minimal things and delegate to the mock methods. |
97 void OnRequestPacket(const IPC::Message& msg, int stream_id, | 93 void OnRequestPacket(const IPC::Message& msg, int stream_id, |
98 AudioBuffersState buffers_state) { | 94 AudioBuffersState buffers_state) { |
99 OnRequestPacket(msg.routing_id(), stream_id, buffers_state); | 95 OnRequestPacket(stream_id, buffers_state); |
100 } | 96 } |
101 | 97 |
102 void OnStreamCreated(const IPC::Message& msg, int stream_id, | 98 void OnStreamCreated(const IPC::Message& msg, int stream_id, |
103 base::SharedMemoryHandle handle, uint32 length) { | 99 base::SharedMemoryHandle handle, uint32 length) { |
104 // Maps the shared memory. | 100 // Maps the shared memory. |
105 shared_memory_.reset(new base::SharedMemory(handle, false)); | 101 shared_memory_.reset(new base::SharedMemory(handle, false)); |
106 ASSERT_TRUE(shared_memory_->Map(length)); | 102 ASSERT_TRUE(shared_memory_->Map(length)); |
107 ASSERT_TRUE(shared_memory_->memory()); | 103 ASSERT_TRUE(shared_memory_->memory()); |
108 shared_memory_length_ = length; | 104 shared_memory_length_ = length; |
109 | 105 |
110 // And then delegate the call to the mock method. | 106 // And then delegate the call to the mock method. |
111 OnStreamCreated(msg.routing_id(), stream_id, length); | 107 OnStreamCreated(stream_id, length); |
112 } | 108 } |
113 | 109 |
114 void OnLowLatencyStreamCreated(const IPC::Message& msg, int stream_id, | 110 void OnLowLatencyStreamCreated(const IPC::Message& msg, int stream_id, |
115 base::SharedMemoryHandle handle, | 111 base::SharedMemoryHandle handle, |
116 #if defined(OS_WIN) | 112 #if defined(OS_WIN) |
117 base::SyncSocket::Handle socket_handle, | 113 base::SyncSocket::Handle socket_handle, |
118 #else | 114 #else |
119 base::FileDescriptor socket_descriptor, | 115 base::FileDescriptor socket_descriptor, |
120 #endif | 116 #endif |
121 uint32 length) { | 117 uint32 length) { |
122 // Maps the shared memory. | 118 // Maps the shared memory. |
123 shared_memory_.reset(new base::SharedMemory(handle, false)); | 119 shared_memory_.reset(new base::SharedMemory(handle, false)); |
124 CHECK(shared_memory_->Map(length)); | 120 CHECK(shared_memory_->Map(length)); |
125 CHECK(shared_memory_->memory()); | 121 CHECK(shared_memory_->memory()); |
126 shared_memory_length_ = length; | 122 shared_memory_length_ = length; |
127 | 123 |
128 // Create the SyncSocket using the handle. | 124 // Create the SyncSocket using the handle. |
129 base::SyncSocket::Handle sync_socket_handle; | 125 base::SyncSocket::Handle sync_socket_handle; |
130 #if defined(OS_WIN) | 126 #if defined(OS_WIN) |
131 sync_socket_handle = socket_handle; | 127 sync_socket_handle = socket_handle; |
132 #else | 128 #else |
133 sync_socket_handle = socket_descriptor.fd; | 129 sync_socket_handle = socket_descriptor.fd; |
134 #endif | 130 #endif |
135 sync_socket_.reset(new base::SyncSocket(sync_socket_handle)); | 131 sync_socket_.reset(new base::SyncSocket(sync_socket_handle)); |
136 | 132 |
137 // And then delegate the call to the mock method. | 133 // And then delegate the call to the mock method. |
138 OnLowLatencyStreamCreated(msg.routing_id(), stream_id, length); | 134 OnLowLatencyStreamCreated(stream_id, length); |
139 } | 135 } |
140 | 136 |
141 void OnStreamStateChanged(const IPC::Message& msg, int stream_id, | 137 void OnStreamStateChanged(const IPC::Message& msg, int stream_id, |
142 AudioStreamState state) { | 138 AudioStreamState state) { |
143 if (state == kAudioStreamPlaying) { | 139 if (state == kAudioStreamPlaying) { |
144 OnStreamPlaying(msg.routing_id(), stream_id); | 140 OnStreamPlaying(stream_id); |
145 } else if (state == kAudioStreamPaused) { | 141 } else if (state == kAudioStreamPaused) { |
146 OnStreamPaused(msg.routing_id(), stream_id); | 142 OnStreamPaused(stream_id); |
147 } else if (state == kAudioStreamError) { | 143 } else if (state == kAudioStreamError) { |
148 OnStreamError(msg.routing_id(), stream_id); | 144 OnStreamError(stream_id); |
149 } else { | 145 } else { |
150 FAIL() << "Unknown stream state"; | 146 FAIL() << "Unknown stream state"; |
151 } | 147 } |
152 } | 148 } |
153 | 149 |
154 void OnStreamVolume(const IPC::Message& msg, int stream_id, double volume) { | 150 void OnStreamVolume(const IPC::Message& msg, int stream_id, double volume) { |
155 OnStreamVolume(msg.routing_id(), stream_id, volume); | 151 OnStreamVolume(stream_id, volume); |
156 } | 152 } |
157 | 153 |
158 scoped_ptr<base::SharedMemory> shared_memory_; | 154 scoped_ptr<base::SharedMemory> shared_memory_; |
159 scoped_ptr<base::SyncSocket> sync_socket_; | 155 scoped_ptr<base::SyncSocket> sync_socket_; |
160 uint32 shared_memory_length_; | 156 uint32 shared_memory_length_; |
161 | 157 |
162 DISALLOW_COPY_AND_ASSIGN(MockAudioRendererHost); | 158 DISALLOW_COPY_AND_ASSIGN(MockAudioRendererHost); |
163 }; | 159 }; |
164 | 160 |
165 ACTION_P(QuitMessageLoop, message_loop) { | 161 ACTION_P(QuitMessageLoop, message_loop) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 | 197 |
202 // We need to continue running message_loop_ to complete all destructions. | 198 // We need to continue running message_loop_ to complete all destructions. |
203 SyncWithAudioThread(); | 199 SyncWithAudioThread(); |
204 | 200 |
205 io_thread_.reset(); | 201 io_thread_.reset(); |
206 ui_thread_.reset(); | 202 ui_thread_.reset(); |
207 } | 203 } |
208 | 204 |
209 void Create() { | 205 void Create() { |
210 EXPECT_CALL(*observer_, | 206 EXPECT_CALL(*observer_, |
211 OnSetAudioStreamStatus(_, kRouteId, kStreamId, "created")); | 207 OnSetAudioStreamStatus(_, kStreamId, "created")); |
212 EXPECT_CALL(*observer_, OnDeleteAudioStream(_, kRouteId, kStreamId)); | 208 EXPECT_CALL(*observer_, OnDeleteAudioStream(_, kStreamId)); |
213 | 209 |
214 InSequence s; | 210 InSequence s; |
215 // 1. We will first receive a OnStreamCreated() signal. | 211 // 1. We will first receive a OnStreamCreated() signal. |
216 EXPECT_CALL(*host_, | 212 EXPECT_CALL(*host_, OnStreamCreated(kStreamId, _)); |
217 OnStreamCreated(kRouteId, kStreamId, _)); | |
218 | 213 |
219 // 2. First packet request will arrive. | 214 // 2. First packet request will arrive. |
220 EXPECT_CALL(*host_, OnRequestPacket(kRouteId, kStreamId, _)) | 215 EXPECT_CALL(*host_, OnRequestPacket(kStreamId, _)) |
221 .WillOnce(QuitMessageLoop(message_loop_.get())); | 216 .WillOnce(QuitMessageLoop(message_loop_.get())); |
222 | 217 |
223 IPC::Message msg; | |
224 msg.set_routing_id(kRouteId); | |
225 | |
226 AudioParameters params; | 218 AudioParameters params; |
227 if (mock_stream_) | 219 if (mock_stream_) |
228 params.format = AudioParameters::AUDIO_MOCK; | 220 params.format = AudioParameters::AUDIO_MOCK; |
229 else | 221 else |
230 params.format = AudioParameters::AUDIO_PCM_LINEAR; | 222 params.format = AudioParameters::AUDIO_PCM_LINEAR; |
231 params.channels = 2; | 223 params.channels = 2; |
232 params.sample_rate = AudioParameters::kAudioCDSampleRate; | 224 params.sample_rate = AudioParameters::kAudioCDSampleRate; |
233 params.bits_per_sample = 16; | 225 params.bits_per_sample = 16; |
234 params.samples_per_packet = 0; | 226 params.samples_per_packet = 0; |
235 | 227 |
236 // Send a create stream message to the audio output stream and wait until | 228 // Send a create stream message to the audio output stream and wait until |
237 // we receive the created message. | 229 // we receive the created message. |
238 host_->OnCreateStream(msg, kStreamId, params, false); | 230 host_->OnCreateStream(kStreamId, params, false); |
239 message_loop_->Run(); | 231 message_loop_->Run(); |
240 } | 232 } |
241 | 233 |
242 void CreateLowLatency() { | 234 void CreateLowLatency() { |
243 EXPECT_CALL(*observer_, | 235 EXPECT_CALL(*observer_, |
244 OnSetAudioStreamStatus(_, kRouteId, kStreamId, "created")); | 236 OnSetAudioStreamStatus(_, kStreamId, "created")); |
245 EXPECT_CALL(*observer_, OnDeleteAudioStream(_, kRouteId, kStreamId)); | 237 EXPECT_CALL(*observer_, OnDeleteAudioStream(_, kStreamId)); |
246 | 238 |
247 InSequence s; | 239 InSequence s; |
248 // We will first receive a OnLowLatencyStreamCreated() signal. | 240 // We will first receive a OnLowLatencyStreamCreated() signal. |
249 EXPECT_CALL(*host_, | 241 EXPECT_CALL(*host_, |
250 OnLowLatencyStreamCreated(kRouteId, kStreamId, _)) | 242 OnLowLatencyStreamCreated(kStreamId, _)) |
251 .WillOnce(QuitMessageLoop(message_loop_.get())); | 243 .WillOnce(QuitMessageLoop(message_loop_.get())); |
252 | 244 |
253 IPC::Message msg; | |
254 msg.set_routing_id(kRouteId); | |
255 | |
256 AudioParameters params; | 245 AudioParameters params; |
257 if (mock_stream_) | 246 if (mock_stream_) |
258 params.format = AudioParameters::AUDIO_MOCK; | 247 params.format = AudioParameters::AUDIO_MOCK; |
259 else | 248 else |
260 params.format = AudioParameters::AUDIO_PCM_LINEAR; | 249 params.format = AudioParameters::AUDIO_PCM_LINEAR; |
261 params.channels = 2; | 250 params.channels = 2; |
262 params.sample_rate = AudioParameters::kAudioCDSampleRate; | 251 params.sample_rate = AudioParameters::kAudioCDSampleRate; |
263 params.bits_per_sample = 16; | 252 params.bits_per_sample = 16; |
264 params.samples_per_packet = 0; | 253 params.samples_per_packet = 0; |
265 | 254 |
266 // Send a create stream message to the audio output stream and wait until | 255 // Send a create stream message to the audio output stream and wait until |
267 // we receive the created message. | 256 // we receive the created message. |
268 host_->OnCreateStream(msg, kStreamId, params, true); | 257 host_->OnCreateStream(kStreamId, params, true); |
269 message_loop_->Run(); | 258 message_loop_->Run(); |
270 } | 259 } |
271 | 260 |
272 void Close() { | 261 void Close() { |
273 EXPECT_CALL(*observer_, | 262 EXPECT_CALL(*observer_, |
274 OnSetAudioStreamStatus(_, kRouteId, kStreamId, "closed")); | 263 OnSetAudioStreamStatus(_, kStreamId, "closed")); |
275 | 264 |
276 // Send a message to AudioRendererHost to tell it we want to close the | 265 // Send a message to AudioRendererHost to tell it we want to close the |
277 // stream. | 266 // stream. |
278 IPC::Message msg; | 267 host_->OnCloseStream(kStreamId); |
279 msg.set_routing_id(kRouteId); | |
280 host_->OnCloseStream(msg, kStreamId); | |
281 message_loop_->RunAllPending(); | 268 message_loop_->RunAllPending(); |
282 } | 269 } |
283 | 270 |
284 void Play() { | 271 void Play() { |
285 EXPECT_CALL(*observer_, | 272 EXPECT_CALL(*observer_, |
286 OnSetAudioStreamPlaying(_, kRouteId, kStreamId, true)); | 273 OnSetAudioStreamPlaying(_, kStreamId, true)); |
287 EXPECT_CALL(*host_, OnStreamPlaying(kRouteId, kStreamId)) | 274 EXPECT_CALL(*host_, OnStreamPlaying(kStreamId)) |
288 .WillOnce(QuitMessageLoop(message_loop_.get())); | 275 .WillOnce(QuitMessageLoop(message_loop_.get())); |
289 | 276 |
290 IPC::Message msg; | 277 host_->OnPlayStream(kStreamId); |
291 msg.set_routing_id(kRouteId); | |
292 host_->OnPlayStream(msg, kStreamId); | |
293 message_loop_->Run(); | 278 message_loop_->Run(); |
294 } | 279 } |
295 | 280 |
296 void Pause() { | 281 void Pause() { |
297 EXPECT_CALL(*observer_, | 282 EXPECT_CALL(*observer_, |
298 OnSetAudioStreamPlaying(_, kRouteId, kStreamId, false)); | 283 OnSetAudioStreamPlaying(_, kStreamId, false)); |
299 EXPECT_CALL(*host_, OnStreamPaused(kRouteId, kStreamId)) | 284 EXPECT_CALL(*host_, OnStreamPaused(kStreamId)) |
300 .WillOnce(QuitMessageLoop(message_loop_.get())); | 285 .WillOnce(QuitMessageLoop(message_loop_.get())); |
301 | 286 |
302 IPC::Message msg; | 287 host_->OnPauseStream(kStreamId); |
303 msg.set_routing_id(kRouteId); | |
304 host_->OnPauseStream(msg, kStreamId); | |
305 message_loop_->Run(); | 288 message_loop_->Run(); |
306 } | 289 } |
307 | 290 |
308 void SetVolume(double volume) { | 291 void SetVolume(double volume) { |
309 EXPECT_CALL(*observer_, | 292 EXPECT_CALL(*observer_, |
310 OnSetAudioStreamVolume(_, kRouteId, kStreamId, volume)); | 293 OnSetAudioStreamVolume(_, kStreamId, volume)); |
311 IPC::Message msg; | 294 |
312 msg.set_routing_id(kRouteId); | 295 host_->OnSetVolume(kStreamId, volume); |
313 host_->OnSetVolume(msg, kStreamId, volume); | |
314 message_loop_->RunAllPending(); | 296 message_loop_->RunAllPending(); |
315 } | 297 } |
316 | 298 |
317 void NotifyPacketReady() { | 299 void NotifyPacketReady() { |
318 EXPECT_CALL(*host_, OnRequestPacket(kRouteId, kStreamId, _)) | 300 EXPECT_CALL(*host_, OnRequestPacket(kStreamId, _)) |
319 .WillOnce(QuitMessageLoop(message_loop_.get())); | 301 .WillOnce(QuitMessageLoop(message_loop_.get())); |
320 | 302 |
321 IPC::Message msg; | |
322 msg.set_routing_id(kRouteId); | |
323 memset(host_->shared_memory()->memory(), 0, host_->shared_memory_length()); | 303 memset(host_->shared_memory()->memory(), 0, host_->shared_memory_length()); |
324 host_->OnNotifyPacketReady(msg, kStreamId, | 304 host_->OnNotifyPacketReady(kStreamId, host_->shared_memory_length()); |
325 host_->shared_memory_length()); | |
326 message_loop_->Run(); | 305 message_loop_->Run(); |
327 } | 306 } |
328 | 307 |
329 void SimulateError() { | 308 void SimulateError() { |
330 EXPECT_CALL(*observer_, | 309 EXPECT_CALL(*observer_, |
331 OnSetAudioStreamStatus(_, kRouteId, kStreamId, "error")); | 310 OnSetAudioStreamStatus(_, kStreamId, "error")); |
332 // Find the first AudioOutputController in the AudioRendererHost. | 311 // Find the first AudioOutputController in the AudioRendererHost. |
333 CHECK(host_->audio_entries_.size()) | 312 CHECK(host_->audio_entries_.size()) |
334 << "Calls Create() before calling this method"; | 313 << "Calls Create() before calling this method"; |
335 media::AudioOutputController* controller = | 314 media::AudioOutputController* controller = |
336 host_->audio_entries_.begin()->second->controller; | 315 host_->audio_entries_.begin()->second->controller; |
337 CHECK(controller) << "AudioOutputController not found"; | 316 CHECK(controller) << "AudioOutputController not found"; |
338 | 317 |
339 // Expect an error signal sent through IPC. | 318 // Expect an error signal sent through IPC. |
340 EXPECT_CALL(*host_, OnStreamError(kRouteId, kStreamId)); | 319 EXPECT_CALL(*host_, OnStreamError(kStreamId)); |
341 | 320 |
342 // Simulate an error sent from the audio device. | 321 // Simulate an error sent from the audio device. |
343 host_->OnError(controller, 0); | 322 host_->OnError(controller, 0); |
344 SyncWithAudioThread(); | 323 SyncWithAudioThread(); |
345 | 324 |
346 // Expect the audio stream record is removed. | 325 // Expect the audio stream record is removed. |
347 EXPECT_EQ(0u, host_->audio_entries_.size()); | 326 EXPECT_EQ(0u, host_->audio_entries_.size()); |
348 } | 327 } |
349 | 328 |
350 // Called on the audio thread. | 329 // Called on the audio thread. |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 | 492 |
514 // Simulate the case where a stream is not properly closed. | 493 // Simulate the case where a stream is not properly closed. |
515 TEST_F(AudioRendererHostTest, CreateLowLatencyAndShutdown) { | 494 TEST_F(AudioRendererHostTest, CreateLowLatencyAndShutdown) { |
516 if (!IsRunningHeadless()) | 495 if (!IsRunningHeadless()) |
517 EnableRealDevice(); | 496 EnableRealDevice(); |
518 | 497 |
519 CreateLowLatency(); | 498 CreateLowLatency(); |
520 } | 499 } |
521 | 500 |
522 // TODO(hclam): Add tests for data conversation in low latency mode. | 501 // TODO(hclam): Add tests for data conversation in low latency mode. |
OLD | NEW |