1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/**
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @fileoverview Bridge that sends TTS messages from content scripts or
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * other pages to the main background page.
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.provide('cvox.ChromeTts');
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.require('cvox.ChromeTtsBase');
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.require('cvox.HostFactory');
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/**
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @constructor
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @extends {cvox.ChromeTtsBase}
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts = function() {
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  goog.base(this);
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  this.addBridgeListener();
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.inherits(cvox.ChromeTts, cvox.ChromeTtsBase);
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/**
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Current call id, used for matching callback functions.
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @type {number}
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.callId = 1;
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/**
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Maps call ids to callback functions.
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @type {Object.<number, Function>}
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.functionMap = new Object();
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** @override */
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.speak = function(textString, queueMode, properties) {
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!properties) {
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    properties = {};
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  goog.base(this, 'speak', textString, queueMode, properties);
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cvox.ExtensionBridge.send(
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      this.createMessageForProperties_(textString, queueMode, properties));
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** @override */
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.isSpeaking = function() {
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cvox.ChromeTts.superClass_.isSpeaking.call(this);
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** @override */
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.stop = function() {
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cvox.ChromeTts.superClass_.stop.call(this);
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cvox.ExtensionBridge.send(
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      {'target': 'TTS',
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       'action': 'stop'});
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** @override */
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.increaseOrDecreaseProperty =
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    function(propertyName, increase) {
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cvox.ExtensionBridge.send(
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      {'target': 'TTS',
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       'action': 'increaseOrDecrease',
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       'property': propertyName,
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       'increase': increase});
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/**
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Increases a TTS speech property.
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {string} property_name The name of the property to increase.
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {boolean} announce Whether to announce that the property is
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * changing.
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.increaseProperty = function(property_name, announce) {
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  goog.base(this, 'increaseProperty', property_name, announce);
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cvox.ExtensionBridge.send(
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      {'target': 'TTS',
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       'action': 'increase' + property_name,
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       'announce': announce});
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/**
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Listens for TTS_COMPLETED message and executes the callback function.
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.addBridgeListener = function() {
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cvox.ExtensionBridge.addMessageListener(
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      function(msg, port) {
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        var message = msg['message'];
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        if (message == 'TTS_CALLBACK') {
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          var id = msg['id'];
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          var func = cvox.ChromeTts.functionMap[id];
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          if (func != undefined) {
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            func();
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            delete cvox.ChromeTts.functionMap[id];
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          }
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        }
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      });
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/**
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Creates a message suitable for sending as a speak action to background tts.
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {string} textString The string of text to be spoken.
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {number=} queueMode The queue mode: cvox.AbstractTts.QUEUE_MODE_FLUSH,
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *        for flush, cvox.AbstractTts.QUEUE_MODE_QUEUE for adding to queue.
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {Object=} properties Speech properties to use for this utterance.
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @return {Object} A message.
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @private
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.createMessageForProperties_ =
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    function(textString, queueMode, properties) {
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  var message = {'target': 'TTS',
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 'action': 'speak',
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 'text': textString,
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 'queueMode': queueMode,
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 'properties': properties};
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (properties['startCallback'] != undefined) {
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    cvox.ChromeTts.functionMap[cvox.ChromeTts.callId] =
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        properties['startCallback'];
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    message['startCallbackId'] = cvox.ChromeTts.callId++;
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (properties['endCallback'] != undefined) {
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    cvox.ChromeTts.functionMap[cvox.ChromeTts.callId] =
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        properties['endCallback'];
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    message['endCallbackId'] = cvox.ChromeTts.callId++;
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return message;
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    };
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.HostFactory.ttsConstructor = cvox.ChromeTts;
138