12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef MEDIA_AUDIO_VIRTUAL_AUDIO_OUTPUT_STREAM_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MEDIA_AUDIO_VIRTUAL_AUDIO_OUTPUT_STREAM_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/threading/thread_checker.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/audio/audio_io.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/audio/audio_parameters.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/audio_converter.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VirtualAudioInputStream; 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// VirtualAudioOutputStream attaches to a VirtualAudioInputStream when Start() 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is called and is used as an audio source. VirtualAudioOutputStream also 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// implements an interface so it can be used as an input to AudioConverter so 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that we can get audio frames that match the AudioParameters that 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// VirtualAudioInputStream expects. 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MEDIA_EXPORT VirtualAudioOutputStream 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public AudioOutputStream, 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public AudioConverter::InputCallback { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Callback invoked just after VirtualAudioOutputStream is closed. 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(VirtualAudioOutputStream* vaos)> 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AfterCloseCallback; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Construct an audio loopback pathway to the given |target| (not owned). 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |target| must outlive this instance. 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VirtualAudioOutputStream(const AudioParameters& params, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VirtualAudioInputStream* target, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AfterCloseCallback& after_close_cb); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~VirtualAudioOutputStream(); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // AudioOutputStream: 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool Open() OVERRIDE; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Start(AudioSourceCallback* callback) OVERRIDE; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Stop() OVERRIDE; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetVolume(double volume) OVERRIDE; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void GetVolume(double* volume) OVERRIDE; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Close() OVERRIDE; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // AudioConverter::InputCallback: 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual double ProvideInput(AudioBus* audio_bus, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta buffer_delay) OVERRIDE; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AudioParameters params_; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pointer to the VirtualAudioInputStream to attach to when Start() is called. 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This pointer should always be valid because VirtualAudioInputStream should 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // outlive this class. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VirtualAudioInputStream* const target_input_stream_; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AfterCloseCallback after_close_cb_; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AudioSourceCallback* callback_; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double volume_; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::ThreadChecker thread_checker_; 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VirtualAudioOutputStream); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace media 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // MEDIA_AUDIO_VIRTUAL_AUDIO_OUTPUT_STREAM_H_ 71