virtual_audio_input_stream.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef MEDIA_AUDIO_VIRTUAL_AUDIO_INPUT_STREAM_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define MEDIA_AUDIO_VIRTUAL_AUDIO_INPUT_STREAM_H_
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <map>
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <set>
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/cancelable_callback.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/gtest_prod_util.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "media/audio/audio_io.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "media/audio/audio_parameters.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "media/base/audio_converter.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace base {
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class MessageLoopProxy;
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace media {
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class LoopbackAudioConverter;
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class VirtualAudioOutputStream;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// VirtualAudioInputStream converts and mixes audio from attached
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// VirtualAudioOutputStreams into a single stream. It will continuously render
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// audio until this VirtualAudioInputStream is stopped and closed.
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class MEDIA_EXPORT VirtualAudioInputStream : public AudioInputStream {
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Callback invoked just after VirtualAudioInputStream is closed.
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef base::Callback<void(VirtualAudioInputStream* vais)>
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      AfterCloseCallback;
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Construct a target for audio loopback which mixes multiple data streams
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // into a single stream having the given |params|.
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VirtualAudioInputStream(const AudioParameters& params,
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          base::MessageLoopProxy* message_loop,
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          const AfterCloseCallback& after_close_cb);
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~VirtualAudioInputStream();
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // AudioInputStream:
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool Open() OVERRIDE;
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void Start(AudioInputCallback* callback) OVERRIDE;
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void Stop() OVERRIDE;
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void Close() OVERRIDE;
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual double GetMaxVolume() OVERRIDE;
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetVolume(double volume) OVERRIDE;
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual double GetVolume() OVERRIDE;
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetAutomaticGainControl(bool enabled) OVERRIDE;
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool GetAutomaticGainControl() OVERRIDE;
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Attaches a VirtualAudioOutputStream to be used as input. This
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // VirtualAudioInputStream must outlive all attached streams, so any attached
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // stream must be closed (which causes a detach) before
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // VirtualAudioInputStream is destroyed.
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void AddOutputStream(VirtualAudioOutputStream* stream,
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               const AudioParameters& output_params);
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Detaches a VirtualAudioOutputStream and removes it as input.
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void RemoveOutputStream(VirtualAudioOutputStream* stream,
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  const AudioParameters& output_params);
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  friend class VirtualAudioInputStreamTest;
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef std::map<AudioParameters, LoopbackAudioConverter*> AudioConvertersMap;
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // When Start() is called on this class, we continuously schedule this
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // callback to render audio using any attached VirtualAudioOutputStreams until
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Stop() is called.
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void ReadAudio();
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::MessageLoopProxy* const message_loop_;
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AfterCloseCallback after_close_cb_;
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AudioInputCallback* callback_;
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Non-const for testing.
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::TimeDelta buffer_duration_;
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Time next_read_time_;
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_array<uint8> buffer_;
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AudioParameters params_;
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<AudioBus> audio_bus_;
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::CancelableClosure on_more_data_cb_;
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // AudioConverters associated with the attached VirtualAudioOutputStreams,
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // partitioned by common AudioParameters.
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AudioConvertersMap converters_;
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // AudioConverter that takes all the audio converters and mixes them into one
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // final audio stream.
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AudioConverter mixer_;
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Number of currently attached VirtualAudioOutputStreams.
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int num_attached_output_streams_;
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VirtualAudioInputStream);
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace media
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // MEDIA_AUDIO_VIRTUAL_AUDIO_INPUT_STREAM_H_
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)