Index: content/browser/speech/speech_recognition_manager_impl.h |
diff --git a/content/browser/speech/speech_recognition_manager_impl.h b/content/browser/speech/speech_recognition_manager_impl.h |
index 9a0c967168a5368e2236ce3a2f4b8e6799f167e8..18775543ef4a927e03aa27ce8fda6c4f8945685a 100644 |
--- a/content/browser/speech/speech_recognition_manager_impl.h |
+++ b/content/browser/speech/speech_recognition_manager_impl.h |
@@ -9,69 +9,70 @@ |
#include <string> |
#include "base/basictypes.h" |
+#include "base/callback.h" |
#include "base/compiler_specific.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/memory/scoped_ptr.h" |
#include "base/memory/singleton.h" |
+#include "content/browser/speech/speech_recognizer_impl.h" |
+#include "content/common/content_export.h" |
#include "content/public/browser/speech_recognition_event_listener.h" |
#include "content/public/browser/speech_recognition_manager.h" |
-#include "ui/gfx/rect.h" |
+#include "content/public/browser/speech_recognition_session_context.h" |
+#include "content/public/common/speech_recognition_error.h" |
namespace content { |
class ResourceContext; |
class SpeechRecognitionManagerDelegate; |
-class SpeechRecognitionPreferences; |
+struct SpeechRecognitionSessionConfig; |
+struct SpeechRecognitionError; |
Satish
2012/04/19 13:03:19
order alphabetically
Primiano Tucci (use gerrit)
2012/04/20 16:06:43
Done.
|
struct SpeechRecognitionResult; |
-class SpeechRecognizer; |
-} |
- |
-namespace net { |
-class URLRequestContextGetter; |
} |
namespace speech { |
-class InputTagSpeechDispatcherHost; |
- |
-class CONTENT_EXPORT SpeechRecognitionManagerImpl |
- : NON_EXPORTED_BASE(public content::SpeechRecognitionManager), |
- NON_EXPORTED_BASE(public content::SpeechRecognitionEventListener) { |
+// This is the manager for speech recognition in the browser process. |
+// The manager is unique for each renderer, and can serve several requests. Each |
+// recognition request corresponds to a session, initiated via |CreateSession|. |
+// In every moment the manager has at most one "interactive" session (identified |
+// by |interactive_session_id_|), that is the session that is currently holding |
+// user attention (showing a bubble). For privacy reasons, only the interactive |
Satish
2012/04/19 13:03:19
since the bubble concept is not applicable for all
Primiano Tucci (use gerrit)
2012/04/20 16:06:43
Done.
|
+// session is allowed to capture audio from the microphone. However, after audio |
+// capture is completed, a session can be detached and can live in parallel |
+// with other sessions, while waiting for its results. |
+// |
+// More in details, SpeechRecognitionManager has the following responsibilities: |
+// - Handles requests received from various render views and makes sure only |
+// one of them accesses the audio device coherently. |
Satish
2012/04/19 13:03:19
coherently -> at any given time
Primiano Tucci (use gerrit)
2012/04/20 16:06:43
Done.
|
+// - Relays recognition results/status/error events of each session to the |
+// corresponding listener (demuxing on the base of their session_id). |
+// - Handles the instantiation of SpeechRecognitionEngine objects when |
+// requested by SpeechRecognitionSessions. |
+class CONTENT_EXPORT SpeechRecognitionManagerImpl : |
+ public NON_EXPORTED_BASE(content::SpeechRecognitionManager), |
+ public NON_EXPORTED_BASE(content::SpeechRecognitionEventListener) { |
public: |
static SpeechRecognitionManagerImpl* GetInstance(); |
- // SpeechRecognitionManager implementation: |
- virtual void StartRecognitionForRequest(int session_id) OVERRIDE; |
- virtual void CancelRecognitionForRequest(int session_id) OVERRIDE; |
- virtual void FocusLostForRequest(int session_id) OVERRIDE; |
+ // SpeechRecognitionManager implementation. |
+ virtual int CreateSession( |
+ content::SpeechRecognitionSessionConfig& config, |
+ SpeechRecognitionEventListener* event_listener) OVERRIDE; |
+ virtual void StartSession(int session_id) OVERRIDE; |
+ virtual void AbortSession(int session_id) OVERRIDE; |
+ virtual void AbortAllSessionsForListener( |
+ content::SpeechRecognitionEventListener* listener) OVERRIDE; |
+ virtual void StopAudioCaptureForSession(int session_id) OVERRIDE; |
+ virtual void DetachSession(int session_id) OVERRIDE; |
+ virtual content::SpeechRecognitionSessionContext& GetSessionContext( |
+ int session_id) const OVERRIDE; |
+ virtual int LookupSessionByContext( |
+ base::Callback<bool( |
+ const content::SpeechRecognitionSessionContext&)> matcher) |
+ const OVERRIDE; |
virtual bool HasAudioInputDevices() OVERRIDE; |
virtual bool IsCapturingAudio() OVERRIDE; |
virtual string16 GetAudioInputDeviceModel() OVERRIDE; |
virtual void ShowAudioInputSettings() OVERRIDE; |
- // Handlers for requests from render views. |
- |
- // |delegate| is a weak pointer and should remain valid until |
- // its |DidCompleteRecognition| method is called or recognition is cancelled. |
- // |render_process_id| is the ID of the renderer process initiating the |
- // request. |
- // |element_rect| is the display bounds of the html element requesting speech |
- // input (in page coordinates). |
- virtual void StartRecognition( |
- InputTagSpeechDispatcherHost* delegate, |
- int session_id, |
- int render_process_id, |
- int render_view_id, |
- const gfx::Rect& element_rect, |
- const std::string& language, |
- const std::string& grammar, |
- const std::string& origin_url, |
- net::URLRequestContextGetter* context_getter, |
- content::SpeechRecognitionPreferences* speech_recognition_prefs); |
- virtual void CancelRecognition(int session_id); |
- virtual void CancelAllRequestsWithDelegate( |
- InputTagSpeechDispatcherHost* delegate); |
- virtual void StopRecording(int session_id); |
- |
// SpeechRecognitionEventListener methods. |
virtual void OnRecognitionStart(int session_id) OVERRIDE; |
virtual void OnAudioStart(int session_id) OVERRIDE; |
@@ -84,8 +85,8 @@ class CONTENT_EXPORT SpeechRecognitionManagerImpl |
int session_id, const content::SpeechRecognitionResult& result) OVERRIDE; |
virtual void OnRecognitionError( |
int session_id, const content::SpeechRecognitionError& error) OVERRIDE; |
- virtual void OnAudioLevelsChange( |
- int session_id, float volume, float noise_volume) OVERRIDE; |
+ virtual void OnAudioLevelsChange(int session_id, float volume, |
+ float noise_volume) OVERRIDE; |
protected: |
// Private constructor to enforce singleton. |
@@ -93,34 +94,83 @@ class CONTENT_EXPORT SpeechRecognitionManagerImpl |
SpeechRecognitionManagerImpl(); |
virtual ~SpeechRecognitionManagerImpl(); |
- bool HasPendingRequest(int session_id) const; |
- |
private: |
- struct Request { |
- Request(); |
- ~Request(); |
+ enum FSMState { |
+ STATE_IDLE = 0, |
+ STATE_INTERACTIVE, |
+ STATE_DETACHABLE, |
+ STATE_DETACHED, |
+ STATE_ABORTING, |
+ STATE_ENDED_WITH_ERROR, |
+ STATE_MAX_VALUE = STATE_ENDED_WITH_ERROR |
+ }; |
- InputTagSpeechDispatcherHost* delegate; |
- scoped_refptr<content::SpeechRecognizer> recognizer; |
- bool is_active; // Set to true when recording or recognition is going on. |
+ enum FSMEvent { |
+ EVENT_ABORT = 0, |
+ EVENT_START, |
+ EVENT_STOP_CAPTURE, |
+ EVENT_DETACH, |
+ EVENT_AUDIO_ENDED, |
+ EVENT_RECOGNITION_ENDED, |
+ EVENT_RECOGNITION_RESULT, |
+ EVENT_RECOGNITION_ERROR, |
+ EVENT_MAX_VALUE = EVENT_RECOGNITION_ERROR |
}; |
- struct SpeechRecognitionParams; |
+ struct Session { |
+ Session(); |
+ ~Session(); |
- InputTagSpeechDispatcherHost* GetDelegate(int session_id) const; |
+ int id; |
+ content::SpeechRecognitionEventListener* event_listener; |
+ content::SpeechRecognitionSessionContext context; |
+ scoped_refptr<SpeechRecognizerImpl> recognizer; |
+ FSMState state; |
+ bool error_occurred; |
+ }; |
- void CheckRenderViewTypeAndStartRecognition( |
- const SpeechRecognitionParams& params); |
- void ProceedStartingRecognition(const SpeechRecognitionParams& params); |
+ struct FSMEventArgs { |
+ explicit FSMEventArgs(FSMEvent event_value); |
+ ~FSMEventArgs(); |
- void CancelRecognitionAndInformDelegate(int session_id); |
+ FSMEvent event; |
+ const content::SpeechRecognitionResult* speech_result; |
+ const content::SpeechRecognitionError* speech_error; |
+ }; |
- typedef std::map<int, Request> SpeechRecognizerMap; |
- SpeechRecognizerMap requests_; |
- std::string request_info_; |
- bool can_report_metrics_; |
- int recording_session_id_; |
- scoped_ptr<content::SpeechRecognitionManagerDelegate> delegate_; |
+ // Entry point for pushing any external event into the session handling FSM. |
+ void DispatchEvent(int session_id, FSMEventArgs args); |
+ |
+ // Defines the behavior of the session handling FSM, selecting the appropriate |
+ // transition according to the session, its current state and the event. |
+ FSMState ExecuteTransitionAndGetNextState(Session& session, |
+ const FSMEventArgs& event_args); |
+ |
+ // The methods below handle transitions of the session handling FSM. |
+ FSMState SessionStart(Session& session, const FSMEventArgs& event_args); |
+ FSMState SessionAbort(Session& session, const FSMEventArgs& event_args); |
+ FSMState SessionStopAudioCapture(Session& session, |
+ const FSMEventArgs& event_args); |
+ FSMState SessionDetach(Session& session, const FSMEventArgs& event_args); |
+ FSMState SessionReportError(Session& session, const FSMEventArgs& event_args); |
+ FSMState SessionReportNoMatch(Session& session, |
+ const FSMEventArgs& event_args); |
+ FSMState SessionDelete(Session& session, const FSMEventArgs& event_args); |
+ FSMState SessionSetDetachable(Session& session, |
+ const FSMEventArgs& event_args); |
+ FSMState DoNothing(Session& session, const FSMEventArgs& event_args); |
+ FSMState NotFeasible(Session& session, const FSMEventArgs& event_args); |
+ |
+ bool SessionExists(int session_id) const; |
+ content::SpeechRecognitionEventListener* GetListener(int session_id) const; |
+ int GetNextSessionID(); |
+ |
+ typedef std::map<int, Session> SessionsTable; |
+ SessionsTable sessions_; |
+ int interactive_session_id_; |
Satish
2012/04/19 13:03:19
interactive -> active ?
Primiano Tucci (use gerrit)
2012/04/20 16:06:43
A session can be active but not interactive (while
|
+ int last_session_id_; |
+ bool is_dispatching_event_; |
+ content::SpeechRecognitionManagerDelegate* delegate_; |
}; |
} // namespace speech |