summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorprimiano@chromium.org <primiano@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-28 00:32:09 +0000
committerprimiano@chromium.org <primiano@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-28 00:32:09 +0000
commit55b67c2a6a1ea4846656de82fe2acd1e3d59048a (patch)
tree5e104103b85175ed53679d43202d6b4f7f55ce41 /content
parent3391a0773921b0539699ad4eab0a409e10194f84 (diff)
downloadchromium_src-55b67c2a6a1ea4846656de82fe2acd1e3d59048a.zip
chromium_src-55b67c2a6a1ea4846656de82fe2acd1e3d59048a.tar.gz
chromium_src-55b67c2a6a1ea4846656de82fe2acd1e3d59048a.tar.bz2
Speech refactoring: Turned AudioChunk into a refcounted class (CL1.4)
BUG=116954 TEST=Run content_unittests. Review URL: http://codereview.chromium.org/9861019 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@129316 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/browser/speech/audio_buffer.cc19
-rw-r--r--content/browser/speech/audio_buffer.h16
-rw-r--r--content/browser/speech/audio_encoder.cc2
-rw-r--r--content/browser/speech/audio_encoder.h4
-rw-r--r--content/browser/speech/endpointer/endpointer_unittest.cc5
-rw-r--r--content/browser/speech/google_one_shot_remote_engine.cc15
-rw-r--r--content/browser/speech/google_one_shot_remote_engine_unittest.cc9
-rw-r--r--content/browser/speech/speech_recognizer_impl.cc9
-rw-r--r--content/browser/speech/speech_recognizer_impl.h5
9 files changed, 46 insertions, 38 deletions
diff --git a/content/browser/speech/audio_buffer.cc b/content/browser/speech/audio_buffer.cc
index 5b887d7..ef49004 100644
--- a/content/browser/speech/audio_buffer.cc
+++ b/content/browser/speech/audio_buffer.cc
@@ -52,19 +52,18 @@ AudioBuffer::~AudioBuffer() {
}
void AudioBuffer::Enqueue(const uint8* data, size_t length) {
- AudioChunk* chunk = new AudioChunk(data, length, bytes_per_sample_);
- chunks_.push_back(chunk);
+ chunks_.push_back(new AudioChunk(data, length, bytes_per_sample_));
}
-scoped_ptr<AudioChunk> AudioBuffer::DequeueSingleChunk() {
+scoped_refptr<AudioChunk> AudioBuffer::DequeueSingleChunk() {
DCHECK(!chunks_.empty());
- AudioChunk* chunk = *chunks_.begin();
- chunks_.weak_erase(chunks_.begin());
- return scoped_ptr<AudioChunk>(chunk);
+ scoped_refptr<AudioChunk> chunk(chunks_.front());
+ chunks_.pop_front();
+ return chunk;
}
-scoped_ptr<AudioChunk> AudioBuffer::DequeueAll() {
- AudioChunk* chunk = new AudioChunk(bytes_per_sample_);
+scoped_refptr<AudioChunk> AudioBuffer::DequeueAll() {
+ scoped_refptr<AudioChunk> chunk(new AudioChunk(bytes_per_sample_));
size_t resulting_length = 0;
ChunksContainer::const_iterator it;
// In order to improve performance, calulate in advance the total length
@@ -77,11 +76,11 @@ scoped_ptr<AudioChunk> AudioBuffer::DequeueAll() {
chunk->data_string_.append((*it)->data_string_);
}
Clear();
- return scoped_ptr<AudioChunk>(chunk);
+ return chunk;
}
void AudioBuffer::Clear() {
- chunks_.erase(chunks_.begin(), chunks_.end());
+ chunks_.clear();
}
bool AudioBuffer::IsEmpty() const {
diff --git a/content/browser/speech/audio_buffer.h b/content/browser/speech/audio_buffer.h
index c1d5103..fffba8c 100644
--- a/content/browser/speech/audio_buffer.h
+++ b/content/browser/speech/audio_buffer.h
@@ -6,17 +6,18 @@
#define CONTENT_BROWSER_SPEECH_AUDIO_BUFFER_H_
#pragma once
+#include <deque>
#include <string>
#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/memory/scoped_vector.h"
+#include "base/memory/ref_counted.h"
#include "content/common/content_export.h"
namespace speech {
// Models a chunk derived from an AudioBuffer.
-class CONTENT_EXPORT AudioChunk {
+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);
@@ -30,6 +31,9 @@ class CONTENT_EXPORT AudioChunk {
friend class AudioBuffer;
private:
+ ~AudioChunk() {}
+ friend class base::RefCountedThreadSafe<AudioChunk>;
+
std::string data_string_;
int bytes_per_sample_;
@@ -49,10 +53,10 @@ class AudioBuffer {
// 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_ptr<AudioChunk> DequeueSingleChunk();
+ scoped_refptr<AudioChunk> DequeueSingleChunk();
// Dequeues all previously enqueued chunks, merging them in a single chunk.
- scoped_ptr<AudioChunk> DequeueAll();
+ scoped_refptr<AudioChunk> DequeueAll();
// Removes and frees all the enqueued chunks.
void Clear();
@@ -61,7 +65,7 @@ class AudioBuffer {
bool IsEmpty() const;
private:
- typedef ScopedVector<AudioChunk> ChunksContainer;
+ typedef std::deque<scoped_refptr<AudioChunk> > ChunksContainer;
ChunksContainer chunks_;
int bytes_per_sample_;
diff --git a/content/browser/speech/audio_encoder.cc b/content/browser/speech/audio_encoder.cc
index 92ccdce..b98b94f 100644
--- a/content/browser/speech/audio_encoder.cc
+++ b/content/browser/speech/audio_encoder.cc
@@ -191,7 +191,7 @@ AudioEncoder::AudioEncoder(const std::string& mime_type, int bits_per_sample)
AudioEncoder::~AudioEncoder() {
}
-scoped_ptr<AudioChunk> AudioEncoder::GetEncodedDataAndClear() {
+scoped_refptr<AudioChunk> AudioEncoder::GetEncodedDataAndClear() {
return encoded_audio_buffer_.DequeueAll();
}
diff --git a/content/browser/speech/audio_encoder.h b/content/browser/speech/audio_encoder.h
index 65ceb97..43bfa1fe 100644
--- a/content/browser/speech/audio_encoder.h
+++ b/content/browser/speech/audio_encoder.h
@@ -9,7 +9,7 @@
#include <string>
#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
+#include "base/memory/ref_counted.h"
#include "content/browser/speech/audio_buffer.h"
namespace speech {
@@ -38,7 +38,7 @@ class AudioEncoder {
virtual void Flush() = 0;
// Merges, retrieves and clears all the accumulated encoded audio chunks.
- scoped_ptr<AudioChunk> GetEncodedDataAndClear();
+ scoped_refptr<AudioChunk> GetEncodedDataAndClear();
const std::string& mime_type() { return mime_type_; }
int bits_per_sample() { return bits_per_sample_; }
diff --git a/content/browser/speech/endpointer/endpointer_unittest.cc b/content/browser/speech/endpointer/endpointer_unittest.cc
index 37f2339..bdf8cc4 100644
--- a/content/browser/speech/endpointer/endpointer_unittest.cc
+++ b/content/browser/speech/endpointer/endpointer_unittest.cc
@@ -117,8 +117,9 @@ class EndpointerFrameProcessor : public FrameProcessor {
: endpointer_(endpointer) {}
EpStatus ProcessFrame(int64 time, int16* samples, int frame_size) {
- AudioChunk frame(reinterpret_cast<uint8*>(samples), kFrameSize * 2, 2);
- endpointer_->ProcessAudio(frame, NULL);
+ scoped_refptr<AudioChunk> frame(
+ new AudioChunk(reinterpret_cast<uint8*>(samples), kFrameSize * 2, 2));
+ endpointer_->ProcessAudio(*frame, NULL);
int64 ep_time;
return endpointer_->Status(&ep_time);
}
diff --git a/content/browser/speech/google_one_shot_remote_engine.cc b/content/browser/speech/google_one_shot_remote_engine.cc
index 09c2b28..7d374fe 100644
--- a/content/browser/speech/google_one_shot_remote_engine.cc
+++ b/content/browser/speech/google_one_shot_remote_engine.cc
@@ -7,7 +7,6 @@
#include <vector>
#include "base/json/json_reader.h"
-#include "base/memory/scoped_ptr.h"
#include "base/string_number_conversions.h"
#include "base/string_util.h"
#include "base/values.h"
@@ -242,7 +241,7 @@ void GoogleOneShotRemoteEngine::TakeAudioChunk(const AudioChunk& data) {
DCHECK(encoder_.get());
DCHECK_EQ(data.bytes_per_sample(), config_.audio_num_bits_per_sample / 8);
encoder_->Encode(data);
- scoped_ptr<AudioChunk> encoded_data(encoder_->GetEncodedDataAndClear());
+ scoped_refptr<AudioChunk> encoded_data(encoder_->GetEncodedDataAndClear());
url_fetcher_->AppendChunkToUpload(encoded_data->AsString(), false);
}
@@ -254,12 +253,14 @@ void GoogleOneShotRemoteEngine::AudioChunksEnded() {
// of silence in case encoder had no data already.
std::vector<int16> samples(
config_.audio_sample_rate * kAudioPacketIntervalMs / 1000);
- AudioChunk dummy_chunk(reinterpret_cast<uint8*>(&samples[0]),
- samples.size() * sizeof(int16),
- encoder_->bits_per_sample() / 8);
- encoder_->Encode(dummy_chunk);
+ scoped_refptr<AudioChunk> dummy_chunk(
+ new AudioChunk(reinterpret_cast<uint8*>(&samples[0]),
+ samples.size() * sizeof(int16),
+ encoder_->bits_per_sample() / 8));
+ encoder_->Encode(*dummy_chunk);
encoder_->Flush();
- scoped_ptr<AudioChunk> encoded_dummy_data(encoder_->GetEncodedDataAndClear());
+ scoped_refptr<AudioChunk> encoded_dummy_data(
+ encoder_->GetEncodedDataAndClear());
DCHECK(!encoded_dummy_data->IsEmpty());
encoder_.reset();
diff --git a/content/browser/speech/google_one_shot_remote_engine_unittest.cc b/content/browser/speech/google_one_shot_remote_engine_unittest.cc
index fab2b5f..6a018e9 100644
--- a/content/browser/speech/google_one_shot_remote_engine_unittest.cc
+++ b/content/browser/speech/google_one_shot_remote_engine_unittest.cc
@@ -48,12 +48,13 @@ void GoogleOneShotRemoteEngineTest::CreateAndTestRequest(
bool success, const std::string& http_response) {
GoogleOneShotRemoteEngine client(NULL);
unsigned char dummy_audio_buffer_data[2] = {'\0', '\0'};
- AudioChunk dummy_audio_chunk(&dummy_audio_buffer_data[0],
- sizeof(dummy_audio_buffer_data),
- 2 /* bytes per sample */);
+ scoped_refptr<AudioChunk> dummy_audio_chunk(
+ new AudioChunk(&dummy_audio_buffer_data[0],
+ sizeof(dummy_audio_buffer_data),
+ 2 /* bytes per sample */));
client.set_delegate(this);
client.StartRecognition();
- client.TakeAudioChunk(dummy_audio_chunk);
+ client.TakeAudioChunk(*dummy_audio_chunk);
client.AudioChunksEnded();
TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
ASSERT_TRUE(fetcher);
diff --git a/content/browser/speech/speech_recognizer_impl.cc b/content/browser/speech/speech_recognizer_impl.cc
index 2e8cc48..3c15e2e 100644
--- a/content/browser/speech/speech_recognizer_impl.cc
+++ b/content/browser/speech/speech_recognizer_impl.cc
@@ -211,15 +211,16 @@ void SpeechRecognizerImpl::OnData(AudioInputController* controller,
const uint8* data, uint32 size) {
if (size == 0) // This could happen when recording stops and is normal.
return;
- AudioChunk* raw_audio = new AudioChunk(data, static_cast<size_t>(size),
- kNumBitsPerAudioSample / 8);
+ scoped_refptr<AudioChunk> raw_audio(
+ new AudioChunk(data,
+ static_cast<size_t>(size),
+ kNumBitsPerAudioSample / 8));
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
base::Bind(&SpeechRecognizerImpl::HandleOnData,
this, raw_audio));
}
-void SpeechRecognizerImpl::HandleOnData(AudioChunk* raw_audio) {
- scoped_ptr<AudioChunk> free_raw_audio_on_return(raw_audio);
+void SpeechRecognizerImpl::HandleOnData(scoped_refptr<AudioChunk> raw_audio) {
// Check if we are still recording and if not discard this buffer, as
// recording might have been stopped after this buffer was posted to the queue
// by |OnData|.
diff --git a/content/browser/speech/speech_recognizer_impl.h b/content/browser/speech/speech_recognizer_impl.h
index e4b8756..8e9adcc 100644
--- a/content/browser/speech/speech_recognizer_impl.h
+++ b/content/browser/speech/speech_recognizer_impl.h
@@ -6,6 +6,7 @@
#define CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_IMPL_H_
#include "base/basictypes.h"
+#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "content/browser/speech/endpointer/endpointer.h"
#include "content/browser/speech/speech_recognition_engine.h"
@@ -81,8 +82,8 @@ class CONTENT_EXPORT SpeechRecognizerImpl
void HandleOnError(int error_code); // Handles OnError in the IO thread.
- // Handles OnData in the IO thread. Takes ownership of |raw_audio|.
- void HandleOnData(AudioChunk* raw_audio);
+ // Handles OnData in the IO thread.
+ void HandleOnData(scoped_refptr<AudioChunk> raw_audio);
// Helper method which closes the audio controller and frees it asynchronously
// without blocking the IO thread.