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