Chromium Code Reviews| Index: content/browser/renderer_host/media/video_capture_manager.cc |
| diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc |
| index bd9a15c0db7e07c0585a0243a11e0664450b3ace..f15869aa2d41ad80802cc7504f3f65fd3423dc32 100644 |
| --- a/content/browser/renderer_host/media/video_capture_manager.cc |
| +++ b/content/browser/renderer_host/media/video_capture_manager.cc |
| @@ -301,7 +301,6 @@ VideoCaptureManager::VideoCaptureManager( |
| std::unique_ptr<media::VideoCaptureDeviceFactory> factory, |
| scoped_refptr<base::SingleThreadTaskRunner> device_task_runner) |
| : device_task_runner_(std::move(device_task_runner)), |
| - listener_(nullptr), |
| new_capture_session_id_(1), |
| video_capture_device_factory_(std::move(factory)) {} |
| @@ -325,9 +324,9 @@ void VideoCaptureManager::RemoveAllVideoCaptureObservers() { |
| void VideoCaptureManager::RegisterListener( |
| MediaStreamProviderListener* listener) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - DCHECK(!listener_); |
| + DCHECK(listener); |
| DCHECK(device_task_runner_); |
| - listener_ = listener; |
| + listeners_.AddObserver(listener); |
| #if defined(OS_ANDROID) |
| application_state_has_running_activities_ = true; |
| app_status_listener_.reset(new base::android::ApplicationStatusListener( |
| @@ -336,10 +335,10 @@ void VideoCaptureManager::RegisterListener( |
| #endif |
| } |
| -void VideoCaptureManager::UnregisterListener() { |
| +void VideoCaptureManager::UnregisterListener( |
| + MediaStreamProviderListener* listener) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - DCHECK(listener_); |
| - listener_ = nullptr; |
| + listeners_.RemoveObserver(listener); |
| } |
| void VideoCaptureManager::EnumerateDevices( |
| @@ -366,9 +365,9 @@ void VideoCaptureManager::EnumerateDevices( |
| devices_enumerated_callback)); |
| } |
| -int VideoCaptureManager::Open(const StreamDeviceInfo& device_info) { |
| +int VideoCaptureManager::Open(const MediaStreamDevice& device) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - DCHECK(listener_); |
| + DCHECK(listeners_.might_have_observers()); |
| // Generate a new id for the session being opened. |
| const media::VideoCaptureSessionId capture_session_id = |
| @@ -378,20 +377,20 @@ int VideoCaptureManager::Open(const StreamDeviceInfo& device_info) { |
| DVLOG(1) << "VideoCaptureManager::Open, id " << capture_session_id; |
| // We just save the stream info for processing later. |
| - sessions_[capture_session_id] = device_info.device; |
| + sessions_[capture_session_id] = device; |
| // Notify our listener asynchronously; this ensures that we return |
| // |capture_session_id| to the caller of this function before using that same |
| // id in a listener event. |
| base::ThreadTaskRunnerHandle::Get()->PostTask( |
| - FROM_HERE, base::Bind(&VideoCaptureManager::OnOpened, this, |
| - device_info.device.type, capture_session_id)); |
| + FROM_HERE, base::Bind(&VideoCaptureManager::OnOpened, this, device.type, |
| + capture_session_id)); |
| return capture_session_id; |
| } |
| void VideoCaptureManager::Close(int capture_session_id) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - DCHECK(listener_); |
| + DCHECK(listeners_.might_have_observers()); |
|
mcasas
2017/03/03 00:21:13
Not your fault, but this function name is inaccura
chfremer
2017/03/03 18:21:13
An issue related to this already exists, see https
|
| DVLOG(1) << "VideoCaptureManager::Close, id " << capture_session_id; |
| SessionMap::iterator session_it = sessions_.find(capture_session_id); |
| @@ -767,7 +766,8 @@ void VideoCaptureManager::StopCaptureForClient( |
| LogVideoCaptureEvent(VIDEO_CAPTURE_STOP_CAPTURE_DUE_TO_ERROR); |
| for (auto it : sessions_) { |
| if (it.second.type == entry->stream_type && it.second.id == entry->id) { |
| - listener_->Aborted(it.second.type, it.first); |
| + for (auto& listener : listeners_) |
| + listener.Aborted(it.second.type, it.first); |
| // Aborted() call might synchronously destroy |entry|, recheck. |
| entry = GetDeviceEntryByController(controller); |
| if (!entry) |
| @@ -1041,22 +1041,16 @@ void VideoCaptureManager::OnOpened( |
| MediaStreamType stream_type, |
| media::VideoCaptureSessionId capture_session_id) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - if (!listener_) { |
| - // Listener has been removed. |
| - return; |
| - } |
| - listener_->Opened(stream_type, capture_session_id); |
| + for (auto& listener : listeners_) |
| + listener.Opened(stream_type, capture_session_id); |
| } |
| void VideoCaptureManager::OnClosed( |
| MediaStreamType stream_type, |
| media::VideoCaptureSessionId capture_session_id) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - if (!listener_) { |
| - // Listener has been removed. |
| - return; |
| - } |
| - listener_->Closed(stream_type, capture_session_id); |
| + for (auto& listener : listeners_) |
| + listener.Closed(stream_type, capture_session_id); |
| } |
| void VideoCaptureManager::OnDevicesInfoEnumerated( |