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