// Copyright (c) 2013 GitHub, Inc. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_MEDIA_MEDIA_CAPTURE_DEVICES_DISPATCHER_H_ #define CHROME_BROWSER_MEDIA_MEDIA_CAPTURE_DEVICES_DISPATCHER_H_ #include "base/callback.h" #include "base/memory/scoped_ptr.h" #include "base/memory/singleton.h" #include "base/observer_list.h" #include "content/public/browser/media_observer.h" #include "content/public/common/media_stream_request.h" // This singleton is used to receive updates about media events from the content // layer. class MediaCaptureDevicesDispatcher : public content::MediaObserver { public: static MediaCaptureDevicesDispatcher* GetInstance(); // Helper for picking the device that was requested for an OpenDevice request. // If the device requested is not available it will revert to using the first // available one instead or will return an empty list if no devices of the // requested kind are present. void GetRequestedDevice(const std::string& requested_device_id, bool audio, bool video, content::MediaStreamDevices* devices); void GetDefaultDevices(bool audio, bool video, content::MediaStreamDevices* devices); const content::MediaStreamDevices& GetAudioCaptureDevices(); const content::MediaStreamDevices& GetVideoCaptureDevices(); // Overridden from content::MediaObserver: virtual void OnAudioCaptureDevicesChanged( const content::MediaStreamDevices& devices) OVERRIDE; virtual void OnVideoCaptureDevicesChanged( const content::MediaStreamDevices& devices) OVERRIDE; virtual void OnMediaRequestStateChanged( int render_process_id, int render_view_id, const content::MediaStreamDevice& device, content::MediaRequestState state) OVERRIDE; virtual void OnAudioStreamPlayingChanged( int render_process_id, int render_view_id, int stream_id, bool playing) OVERRIDE {} private: friend struct DefaultSingletonTraits; MediaCaptureDevicesDispatcher(); virtual ~MediaCaptureDevicesDispatcher(); // Called by the MediaObserver() functions, executed on UI thread. void UpdateAudioDevicesOnUIThread(const content::MediaStreamDevices& devices); void UpdateVideoDevicesOnUIThread(const content::MediaStreamDevices& devices); void UpdateMediaRequestStateOnUIThread( int render_process_id, int render_view_id, const content::MediaStreamDevice& device, content::MediaRequestState state); // A list of cached audio capture devices. content::MediaStreamDevices audio_devices_; // A list of cached video capture devices. content::MediaStreamDevices video_devices_; // Flag to indicate if device enumeration has been done/doing. // Only accessed on UI thread. bool devices_enumerated_; }; #endif // CHROME_BROWSER_MEDIA_MEDIA_CAPTURE_DEVICES_DISPATCHER_H_