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