Home | History | Annotate | Download | only in capture
      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 entire RenderFrame tree associated with a WebContents instance.  The
      7 // single stream of data is produced by format-converting and mixing all audio
      8 // output streams.  As the RenderFrameHost tree mutates (e.g., due to page
      9 // navigations, or crashes/reloads), the stream will continue without
     10 // interruption.  In other words, WebContentsAudioInputStream provides tab-level
     11 // audio mirroring.
     12 
     13 #ifndef CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_AUDIO_INPUT_STREAM_H_
     14 #define CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_AUDIO_INPUT_STREAM_H_
     15 
     16 #include <string>
     17 
     18 #include "base/memory/ref_counted.h"
     19 #include "content/common/content_export.h"
     20 #include "media/audio/audio_io.h"
     21 
     22 namespace base {
     23 class SingleThreadTaskRunner;
     24 }
     25 
     26 namespace media {
     27 class AudioParameters;
     28 class VirtualAudioInputStream;
     29 }
     30 
     31 namespace content {
     32 
     33 class AudioMirroringManager;
     34 class WebContentsTracker;
     35 
     36 class CONTENT_EXPORT WebContentsAudioInputStream
     37     : NON_EXPORTED_BASE(public media::AudioInputStream) {
     38  public:
     39   // media::AudioInputStream implementation
     40   virtual bool Open() OVERRIDE;
     41   virtual void Start(AudioInputCallback* callback) OVERRIDE;
     42   virtual void Stop() OVERRIDE;
     43   virtual void Close() OVERRIDE;
     44   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