11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// Copyright (c) 2013 The Chromium Authors. All rights reserved. 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// Use of this source code is governed by a BSD-style license that can be 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// found in the LICENSE file. 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// An AudioInputStream which provides a loop-back of all audio output generated 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// by the entire RenderFrame tree associated with a WebContents instance. The 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// single stream of data is produced by format-converting and mixing all audio 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// output streams. As the RenderFrameHost tree mutates (e.g., due to page 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// navigations, or crashes/reloads), the stream will continue without 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// interruption. In other words, WebContentsAudioInputStream provides tab-level 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// audio mirroring. 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_AUDIO_INPUT_STREAM_H_ 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert#define CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_AUDIO_INPUT_STREAM_H_ 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert#include <string> 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert#include "base/memory/ref_counted.h" 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert#include "content/common/content_export.h" 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert#include "media/audio/audio_io.h" 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertnamespace base { 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertclass SingleThreadTaskRunner; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertnamespace media { 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertclass AudioParameters; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertclass VirtualAudioInputStream; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertnamespace content { 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertclass AudioMirroringManager; 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertclass WebContentsTracker; 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertclass CONTENT_EXPORT WebContentsAudioInputStream 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert : NON_EXPORTED_BASE(public media::AudioInputStream) { 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public: 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // media::AudioInputStream implementation 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert virtual bool Open() OVERRIDE; 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert virtual void Start(AudioInputCallback* callback) OVERRIDE; 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert virtual void Stop() OVERRIDE; 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert virtual void Close() OVERRIDE; 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert virtual double GetMaxVolume() OVERRIDE; 45 virtual void SetVolume(double volume) OVERRIDE; 46 virtual double GetVolume() OVERRIDE; 47 virtual void SetAutomaticGainControl(bool enabled) OVERRIDE; 48 virtual bool GetAutomaticGainControl() OVERRIDE; 49 virtual bool IsMuted() OVERRIDE; 50 51 // Create a new audio mirroring session, or return NULL on error. |device_id| 52 // should be in the format accepted by 53 // WebContentsCaptureUtil::ExtractTabCaptureTarget(). The caller must 54 // guarantee Close() is called on the returned object so that it may 55 // self-destruct. 56 // |worker_task_runner| is the task runner on which AudioInputCallback methods 57 // are called and may or may not be the single thread that invokes the 58 // AudioInputStream methods. 59 static WebContentsAudioInputStream* Create( 60 const std::string& device_id, 61 const media::AudioParameters& params, 62 const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner, 63 AudioMirroringManager* audio_mirroring_manager); 64 65 private: 66 friend class WebContentsAudioInputStreamTest; 67 68 // Maintain most state and functionality in an internal ref-counted 69 // implementation class. This object must outlive a call to Close(), until 70 // the shutdown tasks running on other threads complete: The 71 // AudioMirroringManager on the IO thread, the WebContentsTracker on the UI 72 // thread, and the VirtualAudioOuputStreams on the audio thread. 73 class Impl; 74 75 WebContentsAudioInputStream( 76 int render_process_id, int main_render_frame_id, 77 AudioMirroringManager* mirroring_manager, 78 const scoped_refptr<WebContentsTracker>& tracker, 79 media::VirtualAudioInputStream* mixer_stream); 80 81 virtual ~WebContentsAudioInputStream(); 82 83 scoped_refptr<Impl> impl_; 84 85 DISALLOW_COPY_AND_ASSIGN(WebContentsAudioInputStream); 86}; 87 88} // namespace content 89 90#endif // CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_AUDIO_INPUT_STREAM_H_ 91