Index: components/copresence/mediums/audio/audio_player.h |
diff --git a/components/copresence/mediums/audio/audio_player.h b/components/copresence/mediums/audio/audio_player.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..954f288bde8f62011a6272d9f315d0e01acfe5dd |
--- /dev/null |
+++ b/components/copresence/mediums/audio/audio_player.h |
@@ -0,0 +1,83 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_PLAYER_ |
+#define COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_PLAYER_ |
+ |
+#include <vector> |
+ |
+#include "base/gtest_prod_util.h" |
+#include "base/macros.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/synchronization/lock.h" |
+#include "media/audio/audio_io.h" |
+ |
+namespace media { |
+class AudioBus; |
+class AudioBusRefCounted; |
+} |
+ |
+namespace copresence { |
+ |
+// The AudioPlayer class will play a set of samples till it is told to stop. |
+class AudioPlayer : public media::AudioOutputStream::AudioSourceCallback { |
+ public: |
+ AudioPlayer(); |
+ |
+ // This constructor is only for testing. |
+ explicit AudioPlayer(media::AudioOutputStream* output_stream_for_testing); |
Daniel Erat
2014/07/28 21:18:18
document ownership of the stream
rkc
2014/07/29 00:33:35
Done.
|
+ |
+ // Play the given samples. These samples will keep on being played in a loop |
+ // till we explicitly tell the player to stop playing. |
+ void Play(const scoped_refptr<media::AudioBusRefCounted>& samples); |
+ // Stop playing. |
+ void Stop(); |
+ |
+ // Cleans up and deletes this object. Do not use object after this call. |
+ void Finalize(); |
+ |
+ private: |
+ friend class AudioPlayerTest; |
+ FRIEND_TEST_ALL_PREFIXES(AudioPlayerTest, BasicPlayAndStop); |
+ FRIEND_TEST_ALL_PREFIXES(AudioPlayerTest, OutOfOrderPlayAndStopMultiple); |
+ |
+ virtual ~AudioPlayer(); |
+ |
+ // Methods to do our various operations; all of these need to be run on the |
+ // audio thread. |
+ void InitializeOnAudioThread(); |
+ void PlayOnAudioThread( |
+ const scoped_refptr<media::AudioBusRefCounted>& samples); |
+ void StopOnAudioThread(); |
+ void StopAndCloseOnAudioThread(); |
+ void FinalizeOnAudioThread(); |
+ |
+ // AudioOutputStream::AudioSourceCallback overrides: |
+ // Following methods could be called from *ANY* thread. |
+ virtual int OnMoreData(media::AudioBus* dest, |
+ media::AudioBuffersState /* state */) OVERRIDE; |
+ virtual void OnError(media::AudioOutputStream* /* stream */) OVERRIDE; |
+ |
+ // These are used by unit tests, do NOT use in production code. |
+ void FlushAudioLoop(); |
+ bool IsPlaying(); |
+ |
+ media::AudioOutputStream* stream_; |
Daniel Erat
2014/07/28 21:18:18
document ownership of this object
rkc
2014/07/29 00:33:35
Done.
|
+ |
+ // All fields below here are protected by this lock. |
+ base::Lock state_lock_; |
+ |
+ scoped_refptr<media::AudioBusRefCounted> samples_; |
+ // Index to the frame in the samples that we need to play next. |
Daniel Erat
2014/07/28 21:18:18
nit: add blanks line before this line and between
rkc
2014/07/29 00:33:35
Done.
|
+ int frame_index_; |
+ bool is_playing_; |
+ |
+ media::AudioOutputStream* output_stream_for_testing_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AudioPlayer); |
+}; |
+ |
+} // namespace copresence |
+ |
+#endif // COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_PLAYER_ |