1 // Copyright (c) 2012 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 #include "content/browser/speech/audio_buffer.h"
6
7 #include "base/logging.h"
8 #include "base/stl_util.h"
9
10 namespace content {
11
AudioChunk(int bytes_per_sample)12 AudioChunk::AudioChunk(int bytes_per_sample)
13 : bytes_per_sample_(bytes_per_sample) {
14 }
15
AudioChunk(const uint8 * data,size_t length,int bytes_per_sample)16 AudioChunk::AudioChunk(const uint8* data, size_t length, int bytes_per_sample)
17 : data_string_(reinterpret_cast<const char*>(data), length),
18 bytes_per_sample_(bytes_per_sample) {
19 DCHECK_EQ(length % bytes_per_sample, 0U);
20 }
21
IsEmpty() const22 bool AudioChunk::IsEmpty() const {
23 return data_string_.empty();
24 }
25
NumSamples() const26 size_t AudioChunk::NumSamples() const {
27 return data_string_.size() / bytes_per_sample_;
28 }
29
AsString() const30 const std::string& AudioChunk::AsString() const {
31 return data_string_;
32 }
33
GetSample16(size_t index) const34 int16 AudioChunk::GetSample16(size_t index) const {
35 DCHECK(index < (data_string_.size() / sizeof(int16)));
36 return SamplesData16()[index];
37 }
38
SamplesData16() const39 const int16* AudioChunk::SamplesData16() const {
40 return reinterpret_cast<const int16*>(data_string_.data());
41 }
42
43
AudioBuffer(int bytes_per_sample)44 AudioBuffer::AudioBuffer(int bytes_per_sample)
45 : bytes_per_sample_(bytes_per_sample) {
46 DCHECK(bytes_per_sample == 1 ||
47 bytes_per_sample == 2 ||
48 bytes_per_sample == 4);
49 }
50
~AudioBuffer()51 AudioBuffer::~AudioBuffer() {
52 Clear();
53 }
54
Enqueue(const uint8 * data,size_t length)55 void AudioBuffer::Enqueue(const uint8* data, size_t length) {
56 chunks_.push_back(new AudioChunk(data, length, bytes_per_sample_));
57 }
58
DequeueSingleChunk()59 scoped_refptr<AudioChunk> AudioBuffer::DequeueSingleChunk() {
60 DCHECK(!chunks_.empty());
61 scoped_refptr<AudioChunk> chunk(chunks_.front());
62 chunks_.pop_front();
63 return chunk;
64 }
65
DequeueAll()66 scoped_refptr<AudioChunk> AudioBuffer::DequeueAll() {
67 scoped_refptr<AudioChunk> chunk(new AudioChunk(bytes_per_sample_));
68 size_t resulting_length = 0;
69 ChunksContainer::const_iterator it;
70 // In order to improve performance, calulate in advance the total length
71 // and then copy the chunks.
72 for (it = chunks_.begin(); it != chunks_.end(); ++it) {
73 resulting_length += (*it)->data_string_.length();
74 }
75 chunk->data_string_.reserve(resulting_length);
76 for (it = chunks_.begin(); it != chunks_.end(); ++it) {
77 chunk->data_string_.append((*it)->data_string_);
78 }
79 Clear();
80 return chunk;
81 }
82
Clear()83 void AudioBuffer::Clear() {
84 chunks_.clear();
85 }
86
IsEmpty() const87 bool AudioBuffer::IsEmpty() const {
88 return chunks_.empty();
89 }
90
91 } // namespace content
92