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 14 namespace media { 15 16 class 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. 23 class 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