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)