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