1// Copyright (c) 2012 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#ifndef MEDIA_AUDIO_VIRTUAL_AUDIO_OUTPUT_STREAM_H_
6#define MEDIA_AUDIO_VIRTUAL_AUDIO_OUTPUT_STREAM_H_
7
8#include "base/callback.h"
9#include "base/threading/thread_checker.h"
10#include "media/audio/audio_io.h"
11#include "media/audio/audio_parameters.h"
12#include "media/base/audio_converter.h"
13
14namespace media {
15
16class VirtualAudioInputStream;
17
18// VirtualAudioOutputStream attaches to a VirtualAudioInputStream when Start()
19// is called and is used as an audio source. VirtualAudioOutputStream also
20// implements an interface so it can be used as an input to AudioConverter so
21// that we can get audio frames that match the AudioParameters that
22// VirtualAudioInputStream expects.
23class MEDIA_EXPORT VirtualAudioOutputStream
24    : public AudioOutputStream,
25      public AudioConverter::InputCallback {
26 public:
27  // Callback invoked just after VirtualAudioOutputStream is closed.
28  typedef base::Callback<void(VirtualAudioOutputStream* vaos)>
29      AfterCloseCallback;
30
31  // Construct an audio loopback pathway to the given |target| (not owned).
32  // |target| must outlive this instance.
33  VirtualAudioOutputStream(const AudioParameters& params,
34                           VirtualAudioInputStream* target,
35                           const AfterCloseCallback& after_close_cb);
36
37  virtual ~VirtualAudioOutputStream();
38
39  // AudioOutputStream:
40  virtual bool Open() OVERRIDE;
41  virtual void Start(AudioSourceCallback* callback) OVERRIDE;
42  virtual void Stop() OVERRIDE;
43  virtual void SetVolume(double volume) OVERRIDE;
44  virtual void GetVolume(double* volume) OVERRIDE;
45  virtual void Close() OVERRIDE;
46
47 private:
48  // AudioConverter::InputCallback:
49  virtual double ProvideInput(AudioBus* audio_bus,
50                              base::TimeDelta buffer_delay) OVERRIDE;
51
52  const AudioParameters params_;
53  // Pointer to the VirtualAudioInputStream to attach to when Start() is called.
54  // This pointer should always be valid because VirtualAudioInputStream should
55  // outlive this class.
56  VirtualAudioInputStream* const target_input_stream_;
57
58  AfterCloseCallback after_close_cb_;
59
60  AudioSourceCallback* callback_;
61  double volume_;
62
63  base::ThreadChecker thread_checker_;
64
65  DISALLOW_COPY_AND_ASSIGN(VirtualAudioOutputStream);
66};
67
68}  // namespace media
69
70#endif  // MEDIA_AUDIO_VIRTUAL_AUDIO_OUTPUT_STREAM_H_
71