| Index: content/browser/speech/input_tag_speech_dispatcher_host.cc
|
| diff --git a/content/browser/speech/input_tag_speech_dispatcher_host.cc b/content/browser/speech/input_tag_speech_dispatcher_host.cc
|
| index 29eebb6493c730c5c949c370f83b768ceb3acea0..8f6b30443d4c6470e849e8bc3e1acc665672fa1b 100644
|
| --- a/content/browser/speech/input_tag_speech_dispatcher_host.cc
|
| +++ b/content/browser/speech/input_tag_speech_dispatcher_host.cc
|
| @@ -4,113 +4,31 @@
|
|
|
| #include "content/browser/speech/input_tag_speech_dispatcher_host.h"
|
|
|
| +#include "base/bind.h"
|
| #include "base/lazy_instance.h"
|
| #include "content/browser/speech/speech_recognition_manager_impl.h"
|
| #include "content/browser/speech/speech_recognizer_impl.h"
|
| #include "content/common/speech_recognition_messages.h"
|
| #include "content/public/browser/speech_recognition_preferences.h"
|
| +#include "content/public/browser/speech_recognition_session_config.h"
|
| +#include "content/public/browser/speech_recognition_session_context.h"
|
|
|
| using content::BrowserThread;
|
| +using content::SpeechRecognitionSessionConfig;
|
| +using content::SpeechRecognitionSessionContext;
|
|
|
| -namespace speech {
|
| -
|
| -//----------------------------- Sessions -----------------------------
|
| -
|
| -// TODO(primiano) Remove session handling from here in the next CL. The manager
|
| -// shall be the only one in charge of keeping all the context information for
|
| -// all recognition sessions.
|
| -
|
| -// A singleton class to map the tuple
|
| -// (render-process-id, render-view-id, requestid) to a single ID which is passed
|
| -// through rest of the speech code.
|
| -class InputTagSpeechDispatcherHost::Sessions {
|
| - public:
|
| - // Creates a new ID for a given tuple.
|
| - int CreateId(int render_process_id, int render_view_id, int request_id);
|
| -
|
| - // Returns the ID for a tuple assuming the ID was created earlier.
|
| - int GetId(int render_process_id, int render_view_id, int request_id);
|
| -
|
| - // Removes the ID and associated tuple from the map.
|
| - void RemoveId(int id);
|
| -
|
| - // Getters for the various tuple elements for the given ID.
|
| - int render_process_id(int id);
|
| - int render_view_id(int id);
|
| - int request_id(int id);
|
| -
|
| - private:
|
| - struct SessionInfo {
|
| - int render_process_id;
|
| - int render_view_id;
|
| - int request_id;
|
| - };
|
| - friend struct base::DefaultLazyInstanceTraits<Sessions>;
|
| -
|
| - Sessions();
|
| -
|
| - std::map<int, SessionInfo> sessions_;
|
| - int next_id_;
|
| -};
|
| -
|
| -static base::LazyInstance<InputTagSpeechDispatcherHost::Sessions>
|
| - g_sessions = LAZY_INSTANCE_INITIALIZER;
|
| -
|
| -InputTagSpeechDispatcherHost::Sessions::Sessions()
|
| - : next_id_(1) {
|
| -}
|
| -
|
| -int InputTagSpeechDispatcherHost::Sessions::GetId(int render_process_id,
|
| - int render_view_id,
|
| - int request_id) {
|
| - for (std::map<int, SessionInfo>::iterator it = sessions_.begin();
|
| - it != sessions_.end(); it++) {
|
| - const SessionInfo& item = it->second;
|
| - if (item.render_process_id == render_process_id &&
|
| - item.render_view_id == render_view_id &&
|
| - item.request_id == request_id) {
|
| - return it->first;
|
| - }
|
| - }
|
| -
|
| - // Not finding an entry here is valid since a cancel/stop may have been issued
|
| - // by the renderer and before it received our response the user may have
|
| - // clicked the button to stop again. The caller of this method should take
|
| - // care of this case.
|
| - return 0;
|
| -}
|
| -
|
| -int InputTagSpeechDispatcherHost::Sessions::CreateId(int render_process_id,
|
| - int render_view_id,
|
| - int request_id) {
|
| - SessionInfo info;
|
| - info.render_process_id = render_process_id;
|
| - info.render_view_id = render_view_id;
|
| - info.request_id = request_id;
|
| - sessions_[next_id_] = info;
|
| - return next_id_++;
|
| -}
|
| -
|
| -void InputTagSpeechDispatcherHost::Sessions::RemoveId(int id) {
|
| - sessions_.erase(id);
|
| -}
|
| -
|
| -int InputTagSpeechDispatcherHost::Sessions::render_process_id(
|
| - int id) {
|
| - return sessions_[id].render_process_id;
|
| +namespace {
|
| +bool IsSameContext(int render_process_id,
|
| + int render_view_id,
|
| + int render_request_id,
|
| + const SpeechRecognitionSessionContext& context) {
|
| + return context.render_process_id == render_process_id &&
|
| + context.render_view_id == render_view_id &&
|
| + context.render_request_id == render_request_id;
|
| }
|
| +} // namespace
|
|
|
| -int InputTagSpeechDispatcherHost::Sessions::render_view_id(
|
| - int id) {
|
| - return sessions_[id].render_view_id;
|
| -}
|
| -
|
| -int InputTagSpeechDispatcherHost::Sessions::request_id(int id) {
|
| - return sessions_[id].request_id;
|
| -}
|
| -
|
| -//----------------------- InputTagSpeechDispatcherHost ----------------------
|
| -
|
| +namespace speech {
|
| SpeechRecognitionManagerImpl* InputTagSpeechDispatcherHost::manager_;
|
|
|
| void InputTagSpeechDispatcherHost::set_manager(
|
| @@ -120,11 +38,11 @@ void InputTagSpeechDispatcherHost::set_manager(
|
|
|
| InputTagSpeechDispatcherHost::InputTagSpeechDispatcherHost(
|
| int render_process_id,
|
| - net::URLRequestContextGetter* context_getter,
|
| + net::URLRequestContextGetter* url_request_context_getter,
|
| content::SpeechRecognitionPreferences* recognition_preferences)
|
| : render_process_id_(render_process_id),
|
| may_have_pending_requests_(false),
|
| - context_getter_(context_getter),
|
| + url_request_context_getter_(url_request_context_getter),
|
| recognition_preferences_(recognition_preferences) {
|
| // This is initialized by Browser. Do not add any non-trivial
|
| // initialization here, instead do it lazily when required (e.g. see the
|
| @@ -138,7 +56,7 @@ InputTagSpeechDispatcherHost::~InputTagSpeechDispatcherHost() {
|
| // we don't end up creating the speech input manager for web pages which don't
|
| // use speech input.
|
| if (may_have_pending_requests_)
|
| - manager()->CancelAllRequestsWithDelegate(this);
|
| + manager()->AbortAllSessionsForListener(this);
|
| }
|
|
|
| SpeechRecognitionManagerImpl* InputTagSpeechDispatcherHost::manager() {
|
| @@ -173,69 +91,100 @@ bool InputTagSpeechDispatcherHost::OnMessageReceived(
|
| void InputTagSpeechDispatcherHost::OnStartRecognition(
|
| const InputTagSpeechHostMsg_StartRecognition_Params ¶ms) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - int session_id = g_sessions.Get().CreateId(
|
| - render_process_id_, params.render_view_id, params.request_id);
|
| - manager()->StartRecognition(this, session_id,
|
| - render_process_id_,
|
| - params.render_view_id, params.element_rect,
|
| - params.language, params.grammar,
|
| - params.origin_url,
|
| - context_getter_.get(),
|
| - recognition_preferences_.get());
|
| +
|
| + SpeechRecognitionSessionContext context;
|
| + context.render_process_id = render_process_id_;
|
| + context.render_view_id = params.render_view_id;
|
| + context.render_request_id = params.request_id;
|
| + context.element_rect = params.element_rect;
|
| +
|
| + SpeechRecognitionSessionConfig config;
|
| + config.language = params.language;
|
| + config.grammar = params.grammar;
|
| + config.origin_url = params.origin_url;
|
| + config.initial_context = context;
|
| + config.url_request_context_getter = url_request_context_getter_.get();
|
| + config.filter_profanities = recognition_preferences_->FilterProfanities();
|
| +
|
| + int session_id = manager()->CreateSession(config, this);
|
| + if (session_id == content::SpeechRecognitionManager::kSessionIDInvalid)
|
| + return;
|
| +
|
| + manager()->StartSession(session_id);
|
| }
|
|
|
| void InputTagSpeechDispatcherHost::OnCancelRecognition(int render_view_id,
|
| int request_id) {
|
| - int session_id = g_sessions.Get().GetId(
|
| - render_process_id_, render_view_id, request_id);
|
| - if (session_id) {
|
| - manager()->CancelRecognition(session_id);
|
| - // Request sequence ended so remove mapping.
|
| - g_sessions.Get().RemoveId(session_id);
|
| - }
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + int session_id = manager()->LookupSessionByContext(
|
| + base::Bind(&IsSameContext,
|
| + render_process_id_,
|
| + render_view_id,
|
| + request_id));
|
| + if (session_id != content::SpeechRecognitionManager::kSessionIDInvalid)
|
| + manager()->AbortSession(session_id);
|
| }
|
|
|
| void InputTagSpeechDispatcherHost::OnStopRecording(int render_view_id,
|
| int request_id) {
|
| - int session_id = g_sessions.Get().GetId(
|
| - render_process_id_, render_view_id, request_id);
|
| - if (session_id)
|
| - manager()->StopRecording(session_id);
|
| -}
|
| -
|
| -void InputTagSpeechDispatcherHost::SetRecognitionResult(
|
| - int session_id, const content::SpeechRecognitionResult& result) {
|
| - VLOG(1) << "InputTagSpeechDispatcherHost::SetRecognitionResult enter";
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - int session_render_view_id = g_sessions.Get().render_view_id(session_id);
|
| - int session_request_id = g_sessions.Get().request_id(session_id);
|
| - Send(new InputTagSpeechMsg_SetRecognitionResult(session_render_view_id,
|
| - session_request_id,
|
| - result));
|
| - VLOG(1) << "InputTagSpeechDispatcherHost::SetRecognitionResult exit";
|
| + int session_id = manager()->LookupSessionByContext(
|
| + base::Bind(&IsSameContext,
|
| + render_process_id_,
|
| + render_view_id,
|
| + request_id));
|
| + if (session_id != content::SpeechRecognitionManager::kSessionIDInvalid)
|
| + manager()->StopAudioCaptureForSession(session_id);
|
| +}
|
| +
|
| +// -------- SpeechRecognitionEventListener interface implementation -----------
|
| +void InputTagSpeechDispatcherHost::OnRecognitionResult(
|
| + int session_id, const content::SpeechRecognitionResult& result) {
|
| + VLOG(1) << "InputTagSpeechDispatcherHost::OnRecognitionResult enter";
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + const SpeechRecognitionSessionContext& context =
|
| + manager()->GetSessionContext(session_id);
|
| +
|
| + Send(new InputTagSpeechMsg_SetRecognitionResult(
|
| + context.render_view_id,
|
| + context.render_request_id,
|
| + result));
|
| + VLOG(1) << "InputTagSpeechDispatcherHost::OnRecognitionResult exit";
|
| }
|
|
|
| -void InputTagSpeechDispatcherHost::DidCompleteRecording(int session_id) {
|
| - VLOG(1) << "InputTagSpeechDispatcherHost::DidCompleteRecording enter";
|
| +void InputTagSpeechDispatcherHost::OnAudioEnd(int session_id) {
|
| + VLOG(1) << "InputTagSpeechDispatcherHost::OnAudioEnd enter";
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - int session_render_view_id = g_sessions.Get().render_view_id(session_id);
|
| - int session_request_id = g_sessions.Get().request_id(session_id);
|
| - Send(new InputTagSpeechMsg_RecordingComplete(session_render_view_id,
|
| - session_request_id));
|
| - VLOG(1) << "InputTagSpeechDispatcherHost::DidCompleteRecording exit";
|
| +
|
| + const SpeechRecognitionSessionContext& context =
|
| + manager()->GetSessionContext(session_id);
|
| +
|
| + Send(new InputTagSpeechMsg_RecordingComplete(context.render_view_id,
|
| + context.render_request_id));
|
| + VLOG(1) << "InputTagSpeechDispatcherHost::OnAudioEnd exit";
|
| }
|
|
|
| -void InputTagSpeechDispatcherHost::DidCompleteRecognition(int session_id) {
|
| - VLOG(1) << "InputTagSpeechDispatcherHost::DidCompleteRecognition enter";
|
| +void InputTagSpeechDispatcherHost::OnRecognitionEnd(int session_id) {
|
| + VLOG(1) << "InputTagSpeechDispatcherHost::OnRecognitionEnd enter";
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - int session_render_view_id =
|
| - g_sessions.Get().render_view_id(session_id);
|
| - int session_request_id = g_sessions.Get().request_id(session_id);
|
| - Send(new InputTagSpeechMsg_RecognitionComplete(session_render_view_id,
|
| - session_request_id));
|
| - // Request sequence ended, so remove mapping.
|
| - g_sessions.Get().RemoveId(session_id);
|
| - VLOG(1) << "InputTagSpeechDispatcherHost::DidCompleteRecognition exit";
|
| -}
|
| + const SpeechRecognitionSessionContext& context =
|
| + manager()->GetSessionContext(session_id);
|
| + Send(new InputTagSpeechMsg_RecognitionComplete(context.render_view_id,
|
| + context.render_request_id));
|
| + VLOG(1) << "InputTagSpeechDispatcherHost::OnRecognitionEnd exit";
|
| +}
|
| +
|
| +// The events below are currently not used by x-webkit-speech implementation.
|
| +void InputTagSpeechDispatcherHost::OnRecognitionStart(int session_id) {}
|
| +void InputTagSpeechDispatcherHost::OnAudioStart(int session_id) {}
|
| +void InputTagSpeechDispatcherHost::OnSoundStart(int session_id) {}
|
| +void InputTagSpeechDispatcherHost::OnSoundEnd(int session_id) {}
|
| +void InputTagSpeechDispatcherHost::OnRecognitionError(
|
| + int session_id, const content::SpeechRecognitionError& error) {}
|
| +void InputTagSpeechDispatcherHost::OnAudioLevelsChange(
|
| + int session_id, float volume, float noise_volume) {}
|
| +void InputTagSpeechDispatcherHost::OnEnvironmentEstimationComplete(
|
| + int session_id) {}
|
|
|
| } // namespace speech
|
|
|