fake_audio_input_stream.h revision 116680a4aac90f2aa7413d9095a592090648e557
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
40  // Generate one beep sound. This method is called by
41  // FakeVideoCaptureDevice to test audio/video synchronization.
42  // This is a static method because FakeVideoCaptureDevice is
43  // disconnected from an audio device. This means only one instance of
44  // this class gets to respond, which is okay because we assume there's
45  // only one stream for this testing purpose.
46  // TODO(hclam): Make this non-static. To do this we'll need to fix
47  // crbug.com/159053 such that video capture device is aware of audio
48  // input stream.
49  static void BeepOnce();
50
51 private:
52  FakeAudioInputStream(AudioManagerBase* manager,
53                       const AudioParameters& params);
54
55  virtual ~FakeAudioInputStream();
56
57  void DoCallback();
58
59  AudioManagerBase* audio_manager_;
60  AudioInputCallback* callback_;
61  scoped_ptr<uint8[]> buffer_;
62  int buffer_size_;
63  AudioParameters params_;
64  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
65  base::TimeTicks last_callback_time_;
66  base::TimeDelta callback_interval_;
67  base::TimeDelta interval_from_last_beep_;
68  int beep_duration_in_buffers_;
69  int beep_generated_in_buffers_;
70  int beep_period_in_frames_;
71  int frames_elapsed_;
72  scoped_ptr<media::AudioBus> audio_bus_;
73
74  // Allows us to run tasks on the FakeAudioInputStream instance which are
75  // bound by its lifetime.
76  base::WeakPtrFactory<FakeAudioInputStream> weak_factory_;
77
78  DISALLOW_COPY_AND_ASSIGN(FakeAudioInputStream);
79};
80
81}  // namespace media
82
83#endif  // MEDIA_AUDIO_FAKE_AUDIO_INPUT_STREAM_H_
84