| 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);
|
| +
|
| + // 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_;
|
| +
|
| + // 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.
|
| + 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_
|
|
|