Chromium Code Reviews| Index: content/renderer/media/media_stream_dispatcher.cc |
| diff --git a/content/renderer/media/media_stream_dispatcher.cc b/content/renderer/media/media_stream_dispatcher.cc |
| index 65551805910763d340bfbec74ef58007a6bae910..567d4c7189c96573630c7d7166a9b80cc77fc30d 100644 |
| --- a/content/renderer/media/media_stream_dispatcher.cc |
| +++ b/content/renderer/media/media_stream_dispatcher.cc |
| @@ -68,7 +68,9 @@ MediaStreamDispatcher::MediaStreamDispatcher(RenderFrame* render_frame) |
| next_ipc_id_(0) { |
| } |
| -MediaStreamDispatcher::~MediaStreamDispatcher() {} |
| +MediaStreamDispatcher::~MediaStreamDispatcher() { |
| + DCHECK(device_change_subscribers_.empty()); |
| +} |
| void MediaStreamDispatcher::GenerateStream( |
| int request_id, |
| @@ -209,6 +211,43 @@ void MediaStreamDispatcher::CloseDevice(const std::string& label) { |
| Send(new MediaStreamHostMsg_CloseDevice(routing_id(), label)); |
| } |
| +void MediaStreamDispatcher::SubscribeToDeviceChangeNotifications( |
| + const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, |
| + const GURL& security_origin) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + DCHECK(std::find_if( |
| + device_change_subscribers_.begin(), |
| + device_change_subscribers_.end(), |
| + [&event_handler]( |
| + const base::WeakPtr<MediaStreamDispatcherEventHandler>& item) { |
| + return event_handler.get() == item.get(); |
| + }) == device_change_subscribers_.end()); |
| + DVLOG(1) << "MediaStreamDispatcher::SubscribeToDeviceChangeNotifications"; |
| + |
| + if (device_change_subscribers_.empty()) { |
| + Send(new MediaStreamHostMsg_SubscribeToDeviceChangeNotifications( |
| + routing_id(), security_origin)); |
| + } |
| + device_change_subscribers_.push_back(event_handler); |
| +} |
| + |
| +void MediaStreamDispatcher::CancelDeviceChangeNotifications( |
| + const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + DVLOG(1) << "MediaStreamDispatcher::SubscribeToDeviceChangeNotifications"; |
| + auto it = std::find_if( |
| + device_change_subscribers_.begin(), device_change_subscribers_.end(), |
| + [&event_handler]( |
| + const base::WeakPtr<MediaStreamDispatcherEventHandler>& item) { |
| + return event_handler.get() == item.get(); |
| + }); |
| + DCHECK(it != device_change_subscribers_.end()); |
| + device_change_subscribers_.erase(it); |
| + |
| + if (device_change_subscribers_.empty()) |
| + Send(new MediaStreamHostMsg_CancelDeviceChangeNotifications(routing_id())); |
| +} |
| + |
| void MediaStreamDispatcher::OnDestruct() { |
| // Do not self-destruct. UserMediaClientImpl owns |this|. |
| } |
| @@ -237,6 +276,7 @@ bool MediaStreamDispatcher::OnMessageReceived(const IPC::Message& message) { |
| OnDeviceOpened) |
| IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceOpenFailed, |
| OnDeviceOpenFailed) |
| + IPC_MESSAGE_HANDLER(MediaStreamMsg_DevicesChanged, OnDevicesChanged) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| return handled; |
| @@ -378,6 +418,13 @@ void MediaStreamDispatcher::OnDeviceOpenFailed(int request_id) { |
| } |
| } |
| +void MediaStreamDispatcher::OnDevicesChanged() { |
|
tommi (sloooow) - chröme
2016/04/26 10:11:36
DCHECK(thread_checker_.CalledOnValidThread()); ?
Guido Urdaneta
2016/04/26 11:07:54
Done.
|
| + for (auto event_handler : device_change_subscribers_) { |
| + DCHECK(event_handler); |
| + event_handler->OnDevicesChanged(); |
| + } |
| +} |
| + |
| int MediaStreamDispatcher::audio_session_id(const std::string& label, |
| int index) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |