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 "content/renderer/media/audio_message_filter.h" | 5 #include "content/renderer/media/audio_message_filter.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 AudioMessageFilter::AudioMessageFilter( | 51 AudioMessageFilter::AudioMessageFilter( |
52 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) | 52 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) |
53 : sender_(NULL), io_task_runner_(io_task_runner) { | 53 : sender_(NULL), io_task_runner_(io_task_runner) { |
54 DCHECK(!g_filter); | 54 DCHECK(!g_filter); |
55 g_filter = this; | 55 g_filter = this; |
56 } | 56 } |
57 | 57 |
58 AudioMessageFilter::~AudioMessageFilter() { | 58 AudioMessageFilter::~AudioMessageFilter() { |
59 DCHECK_EQ(g_filter, this); | 59 DCHECK_EQ(g_filter, this); |
60 g_filter = NULL; | 60 g_filter = NULL; |
| 61 |
| 62 LOG(ERROR) << "^AudioMessageFilter"; |
61 } | 63 } |
62 | 64 |
63 // static | 65 // static |
64 AudioMessageFilter* AudioMessageFilter::Get() { | 66 AudioMessageFilter* AudioMessageFilter::Get() { |
65 return g_filter; | 67 return g_filter; |
66 } | 68 } |
67 | 69 |
68 AudioMessageFilter::AudioOutputIPCImpl::AudioOutputIPCImpl( | 70 AudioMessageFilter::AudioOutputIPCImpl::AudioOutputIPCImpl( |
69 const scoped_refptr<AudioMessageFilter>& filter, | 71 const scoped_refptr<AudioMessageFilter>& filter, |
70 int render_frame_id) | 72 int render_frame_id) |
71 : filter_(filter), | 73 : filter_(filter), |
72 render_frame_id_(render_frame_id), | 74 render_frame_id_(render_frame_id), |
73 stream_id_(kStreamIDNotSet), | 75 stream_id_(kStreamIDNotSet), |
74 stream_created_(false) {} | 76 stream_created_(false) {} |
75 | 77 |
76 AudioMessageFilter::AudioOutputIPCImpl::~AudioOutputIPCImpl() {} | 78 AudioMessageFilter::AudioOutputIPCImpl::~AudioOutputIPCImpl() {} |
77 | 79 |
78 std::unique_ptr<media::AudioOutputIPC> AudioMessageFilter::CreateAudioOutputIPC( | 80 std::unique_ptr<media::AudioOutputIPC> AudioMessageFilter::CreateAudioOutputIPC( |
79 int render_frame_id) { | 81 int render_frame_id) { |
80 DCHECK_GT(render_frame_id, 0); | 82 DCHECK_GT(render_frame_id, 0); |
81 return std::unique_ptr<media::AudioOutputIPC>( | 83 return std::unique_ptr<media::AudioOutputIPC>( |
82 new AudioOutputIPCImpl(this, render_frame_id)); | 84 new AudioOutputIPCImpl(this, render_frame_id)); |
83 } | 85 } |
84 | 86 |
| 87 void AudioMessageFilter::CloseStream(int stream_id) { |
| 88 Send(new AudioHostMsg_CloseStream(stream_id)); |
| 89 } |
| 90 |
85 void AudioMessageFilter::AudioOutputIPCImpl::RequestDeviceAuthorization( | 91 void AudioMessageFilter::AudioOutputIPCImpl::RequestDeviceAuthorization( |
86 media::AudioOutputIPCDelegate* delegate, | 92 media::AudioOutputIPCDelegate* delegate, |
87 int session_id, | 93 int session_id, |
88 const std::string& device_id, | 94 const std::string& device_id, |
89 const url::Origin& security_origin) { | 95 const url::Origin& security_origin) { |
90 DCHECK(filter_->io_task_runner_->BelongsToCurrentThread()); | 96 DCHECK(filter_->io_task_runner_->BelongsToCurrentThread()); |
91 DCHECK(delegate); | 97 DCHECK(delegate); |
92 DCHECK_EQ(stream_id_, kStreamIDNotSet); | 98 DCHECK_EQ(stream_id_, kStreamIDNotSet); |
93 DCHECK(!stream_created_); | 99 DCHECK(!stream_created_); |
94 | 100 |
95 stream_id_ = filter_->delegates_.Add(delegate); | 101 stream_id_ = filter_->delegates_.Add(delegate); |
96 filter_->Send(new AudioHostMsg_RequestDeviceAuthorization( | 102 filter_->Send(new AudioHostMsg_RequestDeviceAuthorization( |
97 stream_id_, render_frame_id_, session_id, device_id, | 103 stream_id_, render_frame_id_, session_id, device_id, |
98 url::Origin(security_origin))); | 104 url::Origin(security_origin))); |
99 } | 105 } |
100 | 106 |
101 void AudioMessageFilter::AudioOutputIPCImpl::CreateStream( | 107 void AudioMessageFilter::AudioOutputIPCImpl::CreateStream( |
102 media::AudioOutputIPCDelegate* delegate, | 108 media::AudioOutputIPCDelegate* delegate, |
103 const media::AudioParameters& params) { | 109 const media::AudioParameters& params) { |
104 DCHECK(filter_->io_task_runner_->BelongsToCurrentThread()); | 110 DCHECK(filter_->io_task_runner_->BelongsToCurrentThread()); |
105 DCHECK(!stream_created_); | 111 DCHECK(!stream_created_); |
| 112 auto client = filter_->audio_output_clients_.find(render_frame_id_); |
| 113 if (client == filter_->audio_output_clients_.end()) |
| 114 return; |
106 if (stream_id_ == kStreamIDNotSet) | 115 if (stream_id_ == kStreamIDNotSet) |
107 stream_id_ = filter_->delegates_.Add(delegate); | 116 stream_id_ = filter_->delegates_.Add(delegate); |
| 117 // TODO(rchtara): This is temporary. In soon upcoming CLs AudioMessageFilter |
| 118 // and AudioMessageFilter::AudioOutputIPCImpl will be removed and replaced by |
| 119 // AudioOutputClient. |
108 | 120 |
109 filter_->Send( | 121 client->second->CreateStream( |
110 new AudioHostMsg_CreateStream(stream_id_, render_frame_id_, params)); | 122 stream_id_, params, |
| 123 base::Bind(&AudioOutputClient::CreateStreamCallback, client->second)); |
111 stream_created_ = true; | 124 stream_created_ = true; |
112 } | 125 } |
113 | 126 |
114 void AudioMessageFilter::AudioOutputIPCImpl::PlayStream() { | 127 void AudioMessageFilter::AudioOutputIPCImpl::PlayStream() { |
115 DCHECK(stream_created_); | 128 DCHECK(stream_created_); |
116 filter_->Send(new AudioHostMsg_PlayStream(stream_id_)); | 129 filter_->Send(new AudioHostMsg_PlayStream(stream_id_)); |
117 } | 130 } |
118 | 131 |
119 void AudioMessageFilter::AudioOutputIPCImpl::PauseStream() { | 132 void AudioMessageFilter::AudioOutputIPCImpl::PauseStream() { |
120 DCHECK(stream_created_); | 133 DCHECK(stream_created_); |
121 filter_->Send(new AudioHostMsg_PauseStream(stream_id_)); | 134 filter_->Send(new AudioHostMsg_PauseStream(stream_id_)); |
122 } | 135 } |
123 | 136 |
124 void AudioMessageFilter::AudioOutputIPCImpl::CloseStream() { | 137 void AudioMessageFilter::AudioOutputIPCImpl::CloseStream() { |
125 DCHECK(filter_->io_task_runner_->BelongsToCurrentThread()); | 138 DCHECK(filter_->io_task_runner_->BelongsToCurrentThread()); |
126 DCHECK_NE(stream_id_, kStreamIDNotSet); | 139 DCHECK_NE(stream_id_, kStreamIDNotSet); |
127 filter_->Send(new AudioHostMsg_CloseStream(stream_id_)); | 140 auto client = filter_->audio_output_clients_.find(render_frame_id_); |
| 141 if (client == filter_->audio_output_clients_.end()) |
| 142 return; |
| 143 // TODO(rchtara): This is temporary. In soon upcoming CLs AudioMessageFilter |
| 144 // and AudioMessageFilter::AudioOutputIPCImpl will be removed and replaced by |
| 145 // AudioOutputClient. |
| 146 client->second->CloseStream(stream_id_); |
128 filter_->delegates_.Remove(stream_id_); | 147 filter_->delegates_.Remove(stream_id_); |
129 stream_id_ = kStreamIDNotSet; | 148 stream_id_ = kStreamIDNotSet; |
130 stream_created_ = false; | 149 stream_created_ = false; |
131 } | 150 } |
132 | 151 |
133 void AudioMessageFilter::AudioOutputIPCImpl::SetVolume(double volume) { | 152 void AudioMessageFilter::AudioOutputIPCImpl::SetVolume(double volume) { |
134 DCHECK(stream_created_); | 153 DCHECK(stream_created_); |
135 filter_->Send(new AudioHostMsg_SetVolume(stream_id_, volume)); | 154 filter_->Send(new AudioHostMsg_SetVolume(stream_id_, volume)); |
136 } | 155 } |
137 | 156 |
138 void AudioMessageFilter::Send(IPC::Message* message) { | 157 void AudioMessageFilter::Send(IPC::Message* message) { |
139 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 158 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
140 if (!sender_) { | 159 if (!sender_) { |
141 delete message; | 160 delete message; |
142 } else { | 161 } else { |
143 sender_->Send(message); | 162 sender_->Send(message); |
144 } | 163 } |
145 } | 164 } |
146 | 165 |
147 bool AudioMessageFilter::OnMessageReceived(const IPC::Message& message) { | 166 bool AudioMessageFilter::OnMessageReceived(const IPC::Message& message) { |
148 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 167 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
149 bool handled = true; | 168 bool handled = true; |
150 IPC_BEGIN_MESSAGE_MAP(AudioMessageFilter, message) | 169 IPC_BEGIN_MESSAGE_MAP(AudioMessageFilter, message) |
151 IPC_MESSAGE_HANDLER(AudioMsg_NotifyDeviceAuthorized, OnDeviceAuthorized) | 170 IPC_MESSAGE_HANDLER(AudioMsg_NotifyDeviceAuthorized, OnDeviceAuthorized) |
152 IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamCreated, OnStreamCreated) | |
153 IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamStateChanged, OnStreamStateChanged) | 171 IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamStateChanged, OnStreamStateChanged) |
154 IPC_MESSAGE_UNHANDLED(handled = false) | 172 IPC_MESSAGE_UNHANDLED(handled = false) |
155 IPC_END_MESSAGE_MAP() | 173 IPC_END_MESSAGE_MAP() |
156 return handled; | 174 return handled; |
157 } | 175 } |
158 | 176 |
159 void AudioMessageFilter::OnFilterAdded(IPC::Sender* sender) { | 177 void AudioMessageFilter::OnFilterAdded(IPC::Sender* sender) { |
160 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 178 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
161 sender_ = sender; | 179 sender_ = sender; |
162 } | 180 } |
(...skipping 27 matching lines...) Expand all Loading... |
190 const media::AudioParameters& output_params, | 208 const media::AudioParameters& output_params, |
191 const std::string& matched_device_id) { | 209 const std::string& matched_device_id) { |
192 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 210 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
193 media::AudioOutputIPCDelegate* delegate = delegates_.Lookup(stream_id); | 211 media::AudioOutputIPCDelegate* delegate = delegates_.Lookup(stream_id); |
194 if (!delegate) | 212 if (!delegate) |
195 return; | 213 return; |
196 | 214 |
197 delegate->OnDeviceAuthorized(device_status, output_params, matched_device_id); | 215 delegate->OnDeviceAuthorized(device_status, output_params, matched_device_id); |
198 } | 216 } |
199 | 217 |
200 void AudioMessageFilter::OnStreamCreated( | 218 void AudioMessageFilter::StreamCreated( |
201 int stream_id, | 219 int stream_id, |
202 base::SharedMemoryHandle handle, | 220 base::SharedMemoryHandle handle, |
203 base::SyncSocket::TransitDescriptor socket_descriptor, | 221 base::SyncSocket::TransitDescriptor socket_descriptor, |
204 uint32_t length) { | 222 uint32_t length) { |
205 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 223 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
206 | 224 |
207 WebRtcLogMessage(base::StringPrintf( | 225 WebRtcLogMessage(base::StringPrintf( |
208 "AMF::OnStreamCreated. stream_id=%d", | 226 "AMF::OnStreamCreated. stream_id=%d", |
209 stream_id)); | 227 stream_id)); |
210 | 228 |
211 base::SyncSocket::Handle socket_handle = | 229 base::SyncSocket::Handle socket_handle = |
212 base::SyncSocket::UnwrapHandle(socket_descriptor); | 230 base::SyncSocket::UnwrapHandle(socket_descriptor); |
213 | 231 |
214 media::AudioOutputIPCDelegate* delegate = delegates_.Lookup(stream_id); | 232 media::AudioOutputIPCDelegate* delegate = delegates_.Lookup(stream_id); |
215 if (!delegate) { | 233 if (!delegate) { |
216 DLOG(WARNING) << "Got OnStreamCreated() event for a non-existent or removed" | 234 DLOG(WARNING) << "Got StreamCreated() event for a non-existent or removed" |
217 << " audio renderer. (stream_id=" << stream_id << ")."; | 235 << " audio renderer. (stream_id=" << stream_id << ")."; |
218 base::SharedMemory::CloseHandle(handle); | 236 base::SharedMemory::CloseHandle(handle); |
219 base::SyncSocket socket(socket_handle); | 237 base::SyncSocket socket(socket_handle); |
220 return; | 238 return; |
221 } | 239 } |
222 delegate->OnStreamCreated(handle, socket_handle, length); | 240 delegate->OnStreamCreated(handle, socket_handle, length); |
223 } | 241 } |
224 | 242 |
225 void AudioMessageFilter::OnStreamStateChanged( | 243 void AudioMessageFilter::OnStreamStateChanged( |
226 int stream_id, media::AudioOutputIPCDelegateState state) { | 244 int stream_id, media::AudioOutputIPCDelegateState state) { |
227 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 245 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
228 media::AudioOutputIPCDelegate* delegate = delegates_.Lookup(stream_id); | 246 media::AudioOutputIPCDelegate* delegate = delegates_.Lookup(stream_id); |
229 if (!delegate) { | 247 if (!delegate) { |
230 DLOG(WARNING) << "Got OnStreamStateChanged() event for a non-existent or" | 248 DLOG(WARNING) << "Got OnStreamStateChanged() event for a non-existent or" |
231 << " removed audio renderer. State: " << state; | 249 << " removed audio renderer. State: " << state; |
232 return; | 250 return; |
233 } | 251 } |
234 delegate->OnStateChanged(state); | 252 delegate->OnStateChanged(state); |
235 } | 253 } |
236 | 254 |
237 } // namespace content | 255 } // namespace content |
OLD | NEW |