// Copyright (c) 2012 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 CONTENT_BROWSER_SPEECH_AUDIO_BUFFER_H_ #define CONTENT_BROWSER_SPEECH_AUDIO_BUFFER_H_ #include <deque> #include <string> #include "base/basictypes.h" #include "base/memory/ref_counted.h" #include "content/common/content_export.h" namespace content { // Models a chunk derived from an AudioBuffer. class CONTENT_EXPORT AudioChunk : public base::RefCountedThreadSafe<AudioChunk> { public: explicit AudioChunk(int bytes_per_sample); AudioChunk(const uint8* data, size_t length, int bytes_per_sample); bool IsEmpty() const; int bytes_per_sample() const { return bytes_per_sample_; } size_t NumSamples() const; const std::string& AsString() const; int16 GetSample16(size_t index) const; const int16* SamplesData16() const; friend class AudioBuffer; private: ~AudioChunk() {} friend class base::RefCountedThreadSafe<AudioChunk>; std::string data_string_; int bytes_per_sample_; DISALLOW_COPY_AND_ASSIGN(AudioChunk); }; // Models an audio buffer. The current implementation relies on on-demand // allocations of AudioChunk(s) (which uses a string as storage). class AudioBuffer { public: explicit AudioBuffer(int bytes_per_sample); ~AudioBuffer(); // Enqueues a copy of |length| bytes of |data| buffer. void Enqueue(const uint8* data, size_t length); // Dequeues, in FIFO order, a single chunk respecting the length of the // corresponding Enqueue call (in a nutshell: multiple Enqueue calls followed // by Dequeue calls will return the individual chunks without merging them). scoped_refptr<AudioChunk> DequeueSingleChunk(); // Dequeues all previously enqueued chunks, merging them in a single chunk. scoped_refptr<AudioChunk> DequeueAll(); // Removes and frees all the enqueued chunks. void Clear(); // Checks whether the buffer is empty. bool IsEmpty() const; private: typedef std::deque<scoped_refptr<AudioChunk> > ChunksContainer; ChunksContainer chunks_; int bytes_per_sample_; DISALLOW_COPY_AND_ASSIGN(AudioBuffer); }; } // namespace content #endif // CONTENT_BROWSER_SPEECH_AUDIO_BUFFER_H_