1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4// 5// An AudioInputStream which provides a loop-back of all audio output generated 6// by the RenderView associated with a WebContents instance. The single stream 7// of data is produced by format-converting and mixing all audio output from a 8// RenderView. In other words, WebContentsAudioInputStream provides tab-level 9// audio mirroring. 10// 11// The implementation observes a WebContents instance (which represents a 12// browser tab) so that it can track the replacement of RenderViews due to 13// navigation, crash/reload, etc. events; and take appropriate actions to 14// provide a seamless, uninterrupted mirroring experience. 15 16#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_AUDIO_INPUT_STREAM_H_ 17#define CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_AUDIO_INPUT_STREAM_H_ 18 19#include <string> 20 21#include "base/memory/ref_counted.h" 22#include "content/common/content_export.h" 23#include "media/audio/audio_io.h" 24 25namespace base { 26class SingleThreadTaskRunner; 27} 28 29namespace media { 30class AudioParameters; 31class VirtualAudioInputStream; 32} 33 34namespace content { 35 36class AudioMirroringManager; 37class WebContentsTracker; 38 39class CONTENT_EXPORT WebContentsAudioInputStream 40 : NON_EXPORTED_BASE(public media::AudioInputStream) { 41 public: 42 // media::AudioInputStream implementation 43 virtual bool Open() OVERRIDE; 44 virtual void Start(AudioInputCallback* callback) OVERRIDE; 45 virtual void Stop() OVERRIDE; 46 virtual void Close() OVERRIDE; 47 virtual double GetMaxVolume() OVERRIDE; 48 virtual void SetVolume(double volume) OVERRIDE; 49 virtual double GetVolume() OVERRIDE; 50 virtual void SetAutomaticGainControl(bool enabled) OVERRIDE; 51 virtual bool GetAutomaticGainControl() OVERRIDE; 52 53 // Create a new audio mirroring session, or return NULL on error. |device_id| 54 // should be in the format accepted by 55 // WebContentsCaptureUtil::ExtractTabCaptureTarget(). The caller must 56 // guarantee Close() is called on the returned object so that it may 57 // self-destruct. 58 // |worker_task_runner| is the task runner on which AudioInputCallback methods 59 // are called and may or may not be the single thread that invokes the 60 // AudioInputStream methods. 61 static WebContentsAudioInputStream* Create( 62 const std::string& device_id, 63 const media::AudioParameters& params, 64 const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner, 65 AudioMirroringManager* audio_mirroring_manager); 66 67 private: 68 friend class WebContentsAudioInputStreamTest; 69 70 // Maintain most state and functionality in an internal ref-counted 71 // implementation class. This object must outlive a call to Close(), until 72 // the shutdown tasks running on other threads complete: The 73 // AudioMirroringManager on the IO thread, the WebContentsTracker on the UI 74 // thread, and the VirtualAudioOuputStreams on the audio thread. 75 class Impl; 76 77 WebContentsAudioInputStream( 78 int render_process_id, int render_view_id, 79 AudioMirroringManager* mirroring_manager, 80 const scoped_refptr<WebContentsTracker>& tracker, 81 media::VirtualAudioInputStream* mixer_stream); 82 83 virtual ~WebContentsAudioInputStream(); 84 85 scoped_refptr<Impl> impl_; 86 87 DISALLOW_COPY_AND_ASSIGN(WebContentsAudioInputStream); 88}; 89 90} // namespace content 91 92#endif // CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_AUDIO_INPUT_STREAM_H_ 93