diff options
author | primiano@chromium.org <primiano@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-28 00:32:09 +0000 |
---|---|---|
committer | primiano@chromium.org <primiano@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-28 00:32:09 +0000 |
commit | 55b67c2a6a1ea4846656de82fe2acd1e3d59048a (patch) | |
tree | 5e104103b85175ed53679d43202d6b4f7f55ce41 /content | |
parent | 3391a0773921b0539699ad4eab0a409e10194f84 (diff) | |
download | chromium_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.cc | 19 | ||||
-rw-r--r-- | content/browser/speech/audio_buffer.h | 16 | ||||
-rw-r--r-- | content/browser/speech/audio_encoder.cc | 2 | ||||
-rw-r--r-- | content/browser/speech/audio_encoder.h | 4 | ||||
-rw-r--r-- | content/browser/speech/endpointer/endpointer_unittest.cc | 5 | ||||
-rw-r--r-- | content/browser/speech/google_one_shot_remote_engine.cc | 15 | ||||
-rw-r--r-- | content/browser/speech/google_one_shot_remote_engine_unittest.cc | 9 | ||||
-rw-r--r-- | content/browser/speech/speech_recognizer_impl.cc | 9 | ||||
-rw-r--r-- | content/browser/speech/speech_recognizer_impl.h | 5 |
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. |