Index: content/browser/speech/speech_recognizer.cc |
diff --git a/content/browser/speech/speech_recognizer.cc b/content/browser/speech/speech_recognizer.cc |
index 295f156c7efba488efa9a8457bce92a4a94b20e2..db61a1bc1b0b73e1e2a7ca8a1639500e267416b0 100644 |
--- a/content/browser/speech/speech_recognizer.cc |
+++ b/content/browser/speech/speech_recognizer.cc |
@@ -169,6 +169,18 @@ void SpeechRecognizer::StopRecording() { |
} |
// Invoked in the audio thread. |
+void SpeechRecognizer::OnRecording(AudioInputController* controller) { |
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
+ NewRunnableMethod(this, &SpeechRecognizer::HandleOnRecording)); |
+} |
+ |
+void SpeechRecognizer::HandleOnRecording() { |
+ // Guard against the delegate freeing us until we finish our job. |
+ scoped_refptr<SpeechRecognizer> me(this); |
+ delegate_->OnRecording(caller_id_); |
+} |
+ |
+// Invoked in the audio thread. |
void SpeechRecognizer::OnError(AudioInputController* controller, |
int error_code) { |
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
@@ -210,6 +222,8 @@ void SpeechRecognizer::HandleOnData(string* data) { |
return; |
} |
+ bool speech_started = endpointer_.DidStartReceivingSpeech(); |
Satish
2011/10/04 20:36:33
suggest renaming to speech_was_heard to indicate t
Leandro Graciá Gil
2011/10/05 22:09:00
Done.
|
+ |
const short* samples = reinterpret_cast<const short*>(data->data()); |
DCHECK((data->length() % sizeof(short)) == 0); |
int num_samples = data->length() / sizeof(short); |
@@ -252,6 +266,9 @@ void SpeechRecognizer::HandleOnData(string* data) { |
return; |
} |
+ if (!speech_started && endpointer_.DidStartReceivingSpeech()) |
+ delegate_->DidSpeechInputStart(caller_id_); |
+ |
// Calculate the input volume to display in the UI, smoothing towards the |
// new level. |
float level = (rms - kAudioMeterMinDb) / |
@@ -273,6 +290,7 @@ void SpeechRecognizer::HandleOnData(string* data) { |
if (endpointer_.speech_input_complete()) { |
StopRecording(); |
+ delegate_->DidSpeechInputStop(caller_id_); |
Satish
2011/10/04 20:36:33
instead of invoking this here do it inside StopRec
Leandro Graciá Gil
2011/10/05 22:09:00
Done.
|
} |
// TODO(satish): Once we have streaming POST, start sending the data received |
@@ -280,17 +298,50 @@ void SpeechRecognizer::HandleOnData(string* data) { |
} |
void SpeechRecognizer::SetRecognitionResult( |
- bool error, const SpeechInputResultArray& result) { |
- if (error || result.empty()) { |
- InformErrorAndCancelRecognition(error ? RECOGNIZER_ERROR_NETWORK : |
- RECOGNIZER_ERROR_NO_RESULTS); |
+ bool error, const SpeechInputResult& result) { |
+ if (error) { |
+ // Request failed or received an invalid response that couldn't be parsed. |
+ InformErrorAndCancelRecognition(RECOGNIZER_ERROR_NETWORK); |
return; |
} |
- delegate_->SetRecognitionResult(caller_id_, error, result); |
+ switch (result.status) { |
+ case kStatusSuccess: |
+ break; |
+ |
+ case kStatusAborted: |
+ InformErrorAndCancelRecognition(RECOGNIZER_ERROR_INTERNAL); |
+ return; |
+ |
+ case kStatusBadGrammar: |
+ InformErrorAndCancelRecognition(RECOGNIZER_ERROR_INVALID_PARAMS); |
+ return; |
+ |
+ case kStatusAudio: |
+ InformErrorAndCancelRecognition(RECOGNIZER_ERROR_CAPTURE); |
+ return; |
+ |
+ case kStatusNetwork: |
+ InformErrorAndCancelRecognition(RECOGNIZER_ERROR_NETWORK); |
+ return; |
+ |
+ case kStatusNoSpeech: |
+ InformErrorAndCancelRecognition(RECOGNIZER_ERROR_NO_SPEECH); |
+ return; |
+ |
+ case kStatusNoMatch: |
+ InformErrorAndCancelRecognition(RECOGNIZER_ERROR_NO_RESULTS); |
+ return; |
+ |
+ default: |
+ NOTREACHED(); |
+ } |
+ |
+ StopRecording(); |
Satish
2011/10/04 20:36:33
why is this call required here? wouldn't recogniti
Leandro Graciá Gil
2011/10/05 22:09:00
Done.
|
// Guard against the delegate freeing us until we finish our job. |
scoped_refptr<SpeechRecognizer> me(this); |
+ delegate_->SetRecognitionResult(caller_id_, error, result); |
delegate_->DidCompleteRecognition(caller_id_); |
} |