fake_audio_input_stream.h revision ab8f6f0bd665d3c1ff476eb06c58c42630e462d4
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// A fake implementation of AudioInputStream, useful for testing purpose.
6
7#ifndef MEDIA_AUDIO_FAKE_AUDIO_INPUT_STREAM_H_
8#define MEDIA_AUDIO_FAKE_AUDIO_INPUT_STREAM_H_
9
10#include <vector>
11
12#include "base/memory/scoped_ptr.h"
13#include "base/synchronization/lock.h"
14#include "base/threading/thread.h"
15#include "base/time/time.h"
16#include "media/audio/audio_io.h"
17#include "media/audio/audio_parameters.h"
18
19namespace media {
20
21class AudioBus;
22class AudioManagerBase;
23
24class MEDIA_EXPORT FakeAudioInputStream
25    : public AudioInputStream {
26 public:
27  static AudioInputStream* MakeFakeStream(AudioManagerBase* manager,
28                                          const AudioParameters& params);
29
30  virtual bool Open() OVERRIDE;
31  virtual void Start(AudioInputCallback* callback) OVERRIDE;
32  virtual void Stop() OVERRIDE;
33  virtual void Close() OVERRIDE;
34  virtual double GetMaxVolume() OVERRIDE;
35  virtual void SetVolume(double volume) OVERRIDE;
36  virtual double GetVolume() OVERRIDE;
37  virtual void SetAutomaticGainControl(bool enabled) OVERRIDE;
38  virtual bool GetAutomaticGainControl() OVERRIDE;
39  virtual bool IsMuted() OVERRIDE;
40
41  // Generate one beep sound. This method is called by
42  // FakeVideoCaptureDevice to test audio/video synchronization.
43  // This is a static method because FakeVideoCaptureDevice is
44  // disconnected from an audio device. This means only one instance of
45  // this class gets to respond, which is okay because we assume there's
46  // only one stream for this testing purpose.
47  // TODO(hclam): Make this non-static. To do this we'll need to fix
48  // crbug.com/159053 such that video capture device is aware of audio
49  // input stream.
50  static void BeepOnce();
51
52 private:
53  FakeAudioInputStream(AudioManagerBase* manager,
54                       const AudioParameters& params);
55
56  virtual ~FakeAudioInputStream();
57
58  void DoCallback();
59
60  AudioManagerBase* audio_manager_;
61  AudioInputCallback* callback_;
62  scoped_ptr<uint8[]> buffer_;
63  int buffer_size_;
64  AudioParameters params_;
65  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
66  base::TimeTicks last_callback_time_;
67  base::TimeDelta callback_interval_;
68  base::TimeDelta interval_from_last_beep_;
69  int beep_duration_in_buffers_;
70  int beep_generated_in_buffers_;
71  int beep_period_in_frames_;
72  int frames_elapsed_;
73  scoped_ptr<media::AudioBus> audio_bus_;
74
75  // Allows us to run tasks on the FakeAudioInputStream instance which are
76  // bound by its lifetime.
77  base::WeakPtrFactory<FakeAudioInputStream> weak_factory_;
78
79  DISALLOW_COPY_AND_ASSIGN(FakeAudioInputStream);
80};
81
82}  // namespace media
83
84#endif  // MEDIA_AUDIO_FAKE_AUDIO_INPUT_STREAM_H_
85