Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(479)

Side by Side Diff: content/renderer/media/audio_message_filter.cc

Issue 1930393002: Switch stream creation and closing in Chrome audio rendering from IPC to Mojo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: unique_ptr for Binding Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/media/audio_message_filter.h ('k') | content/renderer/media/audio_message_filter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698