| 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 786196f7d12a00fae3f778161d1c81894887cd18..e19b1e03b8021219aeb2ebfe230f78046813ad1d 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 url::Origin& 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();
|
| + });
|
| + CHECK(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,14 @@ void MediaStreamDispatcher::OnDeviceOpenFailed(int request_id) {
|
| }
|
| }
|
|
|
| +void MediaStreamDispatcher::OnDevicesChanged() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + 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());
|
|
|