audio_player.h revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
1// Copyright 2014 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 COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_PLAYER_H_
6#define COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_PLAYER_H_
7
8#include <vector>
9
10#include "base/gtest_prod_util.h"
11#include "base/macros.h"
12#include "base/memory/ref_counted.h"
13#include "base/synchronization/lock.h"
14#include "media/audio/audio_io.h"
15
16namespace media {
17class AudioBus;
18class AudioBusRefCounted;
19}
20
21namespace copresence {
22
23// The AudioPlayer class will play a set of samples till it is told to stop.
24class AudioPlayer : public media::AudioOutputStream::AudioSourceCallback {
25 public:
26  AudioPlayer();
27
28  // Initializes the object. Do not use this object before calling this method.
29  virtual void Initialize();
30
31  // Play the given samples. These samples will keep on being played in a loop
32  // till we explicitly tell the player to stop playing.
33  virtual void Play(const scoped_refptr<media::AudioBusRefCounted>& samples);
34
35  // Stop playing.
36  virtual void Stop();
37
38  // Cleans up and deletes this object. Do not use object after this call.
39  virtual void Finalize();
40
41  bool IsPlaying();
42
43  // Takes ownership of the stream.
44  void set_output_stream_for_testing(
45      media::AudioOutputStream* output_stream_for_testing) {
46    output_stream_for_testing_.reset(output_stream_for_testing);
47  }
48
49 protected:
50  virtual ~AudioPlayer();
51  void set_is_playing(bool is_playing) { is_playing_ = is_playing; }
52
53 private:
54  friend class AudioPlayerTest;
55  FRIEND_TEST_ALL_PREFIXES(AudioPlayerTest, BasicPlayAndStop);
56  FRIEND_TEST_ALL_PREFIXES(AudioPlayerTest, OutOfOrderPlayAndStopMultiple);
57
58  // Methods to do our various operations; all of these need to be run on the
59  // audio thread.
60  void InitializeOnAudioThread();
61  void PlayOnAudioThread(
62      const scoped_refptr<media::AudioBusRefCounted>& samples);
63  void StopOnAudioThread();
64  void StopAndCloseOnAudioThread();
65  void FinalizeOnAudioThread();
66
67  // AudioOutputStream::AudioSourceCallback overrides:
68  // Following methods could be called from *ANY* thread.
69  virtual int OnMoreData(media::AudioBus* dest,
70                         media::AudioBuffersState /* state */) OVERRIDE;
71  virtual void OnError(media::AudioOutputStream* /* stream */) OVERRIDE;
72
73  // Flushes the audio loop, making sure that any queued operations are
74  // performed.
75  void FlushAudioLoopForTesting();
76
77  bool is_playing_;
78
79  // Self-deleting object.
80  media::AudioOutputStream* stream_;
81
82  scoped_ptr<media::AudioOutputStream> output_stream_for_testing_;
83
84  // All fields below here are protected by this lock.
85  base::Lock state_lock_;
86
87  scoped_refptr<media::AudioBusRefCounted> samples_;
88
89  // Index to the frame in the samples that we need to play next.
90  int frame_index_;
91
92  DISALLOW_COPY_AND_ASSIGN(AudioPlayer);
93};
94
95}  // namespace copresence
96
97#endif  // COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_PLAYER_H_
98