• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 namespace media {
17 class AudioBus;
18 class AudioBusRefCounted;
19 }
20 
21 namespace copresence {
22 
23 // The AudioPlayer class will play a set of samples till it is told to stop.
24 class 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.
set_output_stream_for_testing(media::AudioOutputStream * output_stream_for_testing)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();
set_is_playing(bool is_playing)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