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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/at_exit.h" | 7 #include "base/at_exit.h" |
8 #include "base/memory/shared_memory.h" | 8 #include "base/memory/shared_memory.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/process/process_handle.h" | 10 #include "base/process/process_handle.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 | 47 |
48 MOCK_METHOD3(CreateStream, void(AudioOutputIPCDelegate* delegate, | 48 MOCK_METHOD3(CreateStream, void(AudioOutputIPCDelegate* delegate, |
49 const AudioParameters& params, | 49 const AudioParameters& params, |
50 int session_id)); | 50 int session_id)); |
51 MOCK_METHOD0(PlayStream, void()); | 51 MOCK_METHOD0(PlayStream, void()); |
52 MOCK_METHOD0(PauseStream, void()); | 52 MOCK_METHOD0(PauseStream, void()); |
53 MOCK_METHOD0(CloseStream, void()); | 53 MOCK_METHOD0(CloseStream, void()); |
54 MOCK_METHOD1(SetVolume, void(double volume)); | 54 MOCK_METHOD1(SetVolume, void(double volume)); |
55 }; | 55 }; |
56 | 56 |
57 // Creates a copy of a SyncSocket handle that we can give to AudioOutputDevice. | |
58 // On Windows this means duplicating the pipe handle so that AudioOutputDevice | |
59 // can call CloseHandle() (since ownership has been transferred), but on other | |
60 // platforms, we just copy the same socket handle since AudioOutputDevice on | |
61 // those platforms won't actually own the socket (FileDescriptor.auto_close is | |
62 // false). | |
63 bool DuplicateSocketHandle(SyncSocket::Handle socket_handle, | |
64 SyncSocket::Handle* copy) { | |
65 #if defined(OS_WIN) | |
66 HANDLE process = GetCurrentProcess(); | |
67 ::DuplicateHandle(process, socket_handle, process, copy, | |
68 0, FALSE, DUPLICATE_SAME_ACCESS); | |
69 return *copy != NULL; | |
70 #else | |
71 *copy = socket_handle; | |
72 return *copy != -1; | |
73 #endif | |
74 } | |
75 | |
76 ACTION_P2(SendPendingBytes, socket, pending_bytes) { | 57 ACTION_P2(SendPendingBytes, socket, pending_bytes) { |
77 socket->Send(&pending_bytes, sizeof(pending_bytes)); | 58 socket->Send(&pending_bytes, sizeof(pending_bytes)); |
78 } | 59 } |
79 | 60 |
80 // Used to terminate a loop from a different thread than the loop belongs to. | 61 // Used to terminate a loop from a different thread than the loop belongs to. |
81 // |loop| should be a MessageLoopProxy. | 62 // |loop| should be a MessageLoopProxy. |
82 ACTION_P(QuitLoop, loop) { | 63 ACTION_P(QuitLoop, loop) { |
83 loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); | 64 loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); |
84 } | 65 } |
85 | 66 |
(...skipping 27 matching lines...) Expand all Loading... |
113 | 94 |
114 SharedMemory shared_memory_; | 95 SharedMemory shared_memory_; |
115 CancelableSyncSocket browser_socket_; | 96 CancelableSyncSocket browser_socket_; |
116 CancelableSyncSocket renderer_socket_; | 97 CancelableSyncSocket renderer_socket_; |
117 | 98 |
118 DISALLOW_COPY_AND_ASSIGN(AudioOutputDeviceTest); | 99 DISALLOW_COPY_AND_ASSIGN(AudioOutputDeviceTest); |
119 }; | 100 }; |
120 | 101 |
121 int AudioOutputDeviceTest::CalculateMemorySize() { | 102 int AudioOutputDeviceTest::CalculateMemorySize() { |
122 // Calculate output memory size. | 103 // Calculate output memory size. |
123 return AudioBus::CalculateMemorySize(default_audio_parameters_); | 104 return AudioBus::CalculateMemorySize(default_audio_parameters_); |
124 } | 105 } |
125 | 106 |
126 AudioOutputDeviceTest::AudioOutputDeviceTest() { | 107 AudioOutputDeviceTest::AudioOutputDeviceTest() { |
127 default_audio_parameters_.Reset( | 108 default_audio_parameters_.Reset( |
128 AudioParameters::AUDIO_PCM_LINEAR, | 109 AudioParameters::AUDIO_PCM_LINEAR, |
129 CHANNEL_LAYOUT_STEREO, 2, 48000, 16, 1024); | 110 CHANNEL_LAYOUT_STEREO, 2, 48000, 16, 1024); |
130 | 111 |
131 audio_output_ipc_ = new MockAudioOutputIPC(); | 112 audio_output_ipc_ = new MockAudioOutputIPC(); |
132 audio_device_ = new AudioOutputDevice( | 113 audio_device_ = new AudioOutputDevice( |
133 scoped_ptr<AudioOutputIPC>(audio_output_ipc_), | 114 scoped_ptr<AudioOutputIPC>(audio_output_ipc_), |
(...skipping 22 matching lines...) Expand all Loading... |
156 | 137 |
157 ASSERT_TRUE(shared_memory_.CreateAndMapAnonymous(kMemorySize)); | 138 ASSERT_TRUE(shared_memory_.CreateAndMapAnonymous(kMemorySize)); |
158 memset(shared_memory_.memory(), 0xff, kMemorySize); | 139 memset(shared_memory_.memory(), 0xff, kMemorySize); |
159 | 140 |
160 ASSERT_TRUE(CancelableSyncSocket::CreatePair(&browser_socket_, | 141 ASSERT_TRUE(CancelableSyncSocket::CreatePair(&browser_socket_, |
161 &renderer_socket_)); | 142 &renderer_socket_)); |
162 | 143 |
163 // Create duplicates of the handles we pass to AudioOutputDevice since | 144 // Create duplicates of the handles we pass to AudioOutputDevice since |
164 // ownership will be transferred and AudioOutputDevice is responsible for | 145 // ownership will be transferred and AudioOutputDevice is responsible for |
165 // freeing. | 146 // freeing. |
166 SyncSocket::Handle audio_device_socket = SyncSocket::kInvalidHandle; | 147 SyncSocket::TransitDescriptor audio_device_socket_descriptor; |
167 ASSERT_TRUE(DuplicateSocketHandle(renderer_socket_.handle(), | 148 ASSERT_TRUE(renderer_socket_.PrepareTransitDescriptor( |
168 &audio_device_socket)); | 149 base::GetCurrentProcessHandle(), &audio_device_socket_descriptor)); |
169 base::SharedMemoryHandle duplicated_memory_handle; | 150 base::SharedMemoryHandle duplicated_memory_handle; |
170 ASSERT_TRUE(shared_memory_.ShareToProcess(base::GetCurrentProcessHandle(), | 151 ASSERT_TRUE(shared_memory_.ShareToProcess(base::GetCurrentProcessHandle(), |
171 &duplicated_memory_handle)); | 152 &duplicated_memory_handle)); |
172 | 153 |
173 audio_device_->OnStreamCreated(duplicated_memory_handle, audio_device_socket, | 154 audio_device_->OnStreamCreated( |
174 kMemorySize); | 155 duplicated_memory_handle, |
| 156 SyncSocket::UnwrapHandle(audio_device_socket_descriptor), kMemorySize); |
175 io_loop_.RunUntilIdle(); | 157 io_loop_.RunUntilIdle(); |
176 } | 158 } |
177 | 159 |
178 void AudioOutputDeviceTest::ExpectRenderCallback() { | 160 void AudioOutputDeviceTest::ExpectRenderCallback() { |
179 // We should get a 'play' notification when we call OnStreamCreated(). | 161 // We should get a 'play' notification when we call OnStreamCreated(). |
180 // Respond by asking for some audio data. This should ask our callback | 162 // Respond by asking for some audio data. This should ask our callback |
181 // to provide some audio data that AudioOutputDevice then writes into the | 163 // to provide some audio data that AudioOutputDevice then writes into the |
182 // shared memory section. | 164 // shared memory section. |
183 const int kMemorySize = CalculateMemorySize(); | 165 const int kMemorySize = CalculateMemorySize(); |
184 | 166 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 StartAudioDevice(); | 235 StartAudioDevice(); |
254 ExpectRenderCallback(); | 236 ExpectRenderCallback(); |
255 CreateStream(); | 237 CreateStream(); |
256 WaitUntilRenderCallback(); | 238 WaitUntilRenderCallback(); |
257 StopAudioDevice(); | 239 StopAudioDevice(); |
258 } | 240 } |
259 | 241 |
260 INSTANTIATE_TEST_CASE_P(Render, AudioOutputDeviceTest, Values(false)); | 242 INSTANTIATE_TEST_CASE_P(Render, AudioOutputDeviceTest, Values(false)); |
261 | 243 |
262 } // namespace media. | 244 } // namespace media. |
OLD | NEW |