1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_RENDERER_TTS_DISPATCHER_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_RENDERER_TTS_DISPATCHER_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
11b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/compiler_specific.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/public/renderer/render_process_observer.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSpeechSynthesizer.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSpeechSynthesizerClient.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace IPC {
18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class Message;
19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
20b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct TtsVoice;
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// TtsDispatcher is a delegate for methods used by Blink for speech synthesis
240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// APIs. It's the complement of TtsDispatcherHost (owned by RenderViewHost).
250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Each TtsDispatcher is owned by the WebSpeechSynthesizerClient in Blink;
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// it registers itself to listen to IPC upon construction and unregisters
270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// itself when deleted. There can be multiple TtsDispatchers alive at once,
280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// so each one routes IPC messages to its WebSpeechSynthesizerClient only if
290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// the utterance id (which is globally unique) matches.
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TtsDispatcher
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : public blink::WebSpeechSynthesizer,
32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      public content::RenderProcessObserver {
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit TtsDispatcher(blink::WebSpeechSynthesizerClient* client);
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~TtsDispatcher();
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // RenderProcessObserver override.
40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // blink::WebSpeechSynthesizer implementation.
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void updateVoiceList() OVERRIDE;
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void speak(const blink::WebSpeechSynthesisUtterance& utterance)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OVERRIDE;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void pause() OVERRIDE;
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void resume() OVERRIDE;
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void cancel() OVERRIDE;
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebSpeechSynthesisUtterance FindUtterance(int utterance_id);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnSetVoiceList(const std::vector<TtsVoice>& voices);
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnDidStartSpeaking(int utterance_id);
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnDidFinishSpeaking(int utterance_id);
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnDidPauseSpeaking(int utterance_id);
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnDidResumeSpeaking(int utterance_id);
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnWordBoundary(int utterance_id, int char_index);
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnSentenceBoundary(int utterance_id, int char_index);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnMarkerEvent(int utterance_id, int char_index);
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnWasInterrupted(int utterance_id);
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnWasCancelled(int utterance_id);
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnSpeakingErrorOccurred(int utterance_id,
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const std::string& error_message);
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The WebKit client class that we use to send events back to the JS world.
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Weak reference, this will be valid as long as this object exists.
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebSpeechSynthesizerClient* synthesizer_client_;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Next utterance id, used to map response IPCs to utterance objects.
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static int next_utterance_id_;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Map from id to utterance objects.
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::hash_map<int, blink::WebSpeechSynthesisUtterance> utterance_id_map_;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TtsDispatcher);
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROME_RENDERER_TTS_DISPATCHER_H_
79