OLD | NEW |
| (Empty) |
1 // Copyright 2014 The ChromeOS IME Authors. All Rights Reserved. | |
2 // limitations under the License. | |
3 // See the License for the specific language governing permissions and | |
4 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
5 // distributed under the License is distributed on an "AS-IS" BASIS, | |
6 // Unless required by applicable law or agreed to in writing, software | |
7 // | |
8 // http://www.apache.org/licenses/LICENSE-2.0 | |
9 // | |
10 // You may obtain a copy of the License at | |
11 // you may not use this file except in compliance with the License. | |
12 // Licensed under the Apache License, Version 2.0 (the "License"); | |
13 // | |
14 goog.provide('i18n.input.chrome.inputview.SoundController'); | |
15 | |
16 goog.require('goog.Disposable'); | |
17 goog.require('goog.dom'); | |
18 goog.require('i18n.input.chrome.inputview.Sounds'); | |
19 goog.require('i18n.input.chrome.inputview.elements.ElementType'); | |
20 | |
21 goog.scope(function() { | |
22 var Sounds = i18n.input.chrome.inputview.Sounds; | |
23 var ElementType = i18n.input.chrome.inputview.elements.ElementType; | |
24 var keyToSoundIdOnKeyUp = {}; | |
25 var keyToSoundIdOnKeyRepeat = {}; | |
26 | |
27 | |
28 /** | |
29 * Sound controller for the keyboard. | |
30 * | |
31 * @param {!boolean} enabled Whether sounds is enabled by default. | |
32 * @param {?number} opt_volume The default volume for sound tracks. | |
33 * @constructor | |
34 * @extends {goog.Disposable} | |
35 */ | |
36 i18n.input.chrome.inputview.SoundController = function(enabled, opt_volume) { | |
37 | |
38 /** | |
39 * Collection of all the sound pools. | |
40 * | |
41 * @type {!Object.<string, !Object>} | |
42 */ | |
43 this.sounds_ = {}; | |
44 | |
45 this.enabled_ = enabled; | |
46 | |
47 /** | |
48 * The default volume for all audio tracks. Tracks with volume 0 will be | |
49 * skipped. | |
50 * | |
51 * @type {number} | |
52 */ | |
53 this.volume_ = opt_volume || this.DEFAULT_VOLUME; | |
54 | |
55 if (enabled) | |
56 this.initialize(); | |
57 }; | |
58 goog.inherits(i18n.input.chrome.inputview.SoundController, goog.Disposable); | |
59 | |
60 | |
61 var Controller = i18n.input.chrome.inputview.SoundController; | |
62 | |
63 | |
64 /** | |
65 * @define {number} The size of the pool to use for playing audio sounds. | |
66 */ | |
67 Controller.prototype.POOL_SIZE = 10; | |
68 | |
69 | |
70 /** | |
71 * @define {number} The default audio track volume. | |
72 */ | |
73 Controller.prototype.DEFAULT_VOLUME = 0.6; | |
74 | |
75 | |
76 /** | |
77 * Initializes the sound controller. | |
78 */ | |
79 Controller.prototype.initialize = function() { | |
80 for (var sound in Sounds) { | |
81 this.addSound_(Sounds[sound]); | |
82 } | |
83 keyToSoundIdOnKeyUp[ElementType.BACKSPACE_KEY] = Sounds.NONE; | |
84 keyToSoundIdOnKeyUp[ElementType.ENTER_KEY] = Sounds.RETURN; | |
85 keyToSoundIdOnKeyUp[ElementType.SPACE_KEY] = Sounds.SPACEBAR; | |
86 keyToSoundIdOnKeyRepeat[ElementType.BACKSPACE_KEY] = Sounds.DELETE; | |
87 }; | |
88 | |
89 | |
90 /** | |
91 * Caches the specified sound on the keyboard. | |
92 * | |
93 * @param {string} soundId The name of the .wav file in the "sounds" | |
94 directory. | |
95 * @private | |
96 */ | |
97 Controller.prototype.addSound_ = function(soundId) { | |
98 if (soundId == Sounds.NONE || this.sounds_[soundId]) | |
99 return; | |
100 var pool = []; | |
101 // Create sound pool. | |
102 for (var i = 0; i < this.POOL_SIZE; i++) { | |
103 var audio = goog.dom.createDom('audio', { | |
104 preload: 'auto', | |
105 id: soundId, | |
106 src: 'sounds/' + soundId + '.wav', | |
107 volume: this.volume_ | |
108 }); | |
109 pool.push(audio); | |
110 } | |
111 this.sounds_[soundId] = pool; | |
112 }; | |
113 | |
114 | |
115 /** | |
116 * Sets the volume for the specified sound. | |
117 * | |
118 * @param {string} soundId The id of the sound. | |
119 * @param {number} volume The volume to set. | |
120 */ | |
121 Controller.prototype.setVolume = function(soundId, volume) { | |
122 var pool = this.sounds_[soundId]; | |
123 if (!pool) { | |
124 console.error('Cannot find sound: ' + soundId); | |
125 return; | |
126 } | |
127 // Change volume for all sounds in the pool. | |
128 for (var i = 0; i < pool.length; i++) { | |
129 pool[i].volume = volume; | |
130 } | |
131 }; | |
132 | |
133 | |
134 /** | |
135 * Enables or disable playing sounds on keypress. | |
136 * @param {!boolean} enabled | |
137 */ | |
138 Controller.prototype.setEnabled = function(enabled) { | |
139 this.enabled_ = enabled; | |
140 if (this.enabled_) | |
141 this.initialize(); | |
142 }; | |
143 | |
144 | |
145 /** | |
146 * Sets the volume for all sounds on the keyboard. | |
147 * | |
148 * @param {number} volume The volume of the sounds. | |
149 */ | |
150 Controller.prototype.setMasterVolume = function(volume) { | |
151 this.volume_ = volume; | |
152 for (var id in this.sounds_) { | |
153 this.setVolume(id, volume); | |
154 } | |
155 }; | |
156 | |
157 | |
158 /** | |
159 * Plays the specified sound. | |
160 * | |
161 * @param {string} soundId The id of the audio tag. | |
162 * @private | |
163 */ | |
164 Controller.prototype.playSound_ = function(soundId) { | |
165 // If master volume is zero, ignore the request. | |
166 if (!this.enabled_ || this.volume_ == 0 || soundId == Sounds.NONE) | |
167 return; | |
168 var pool = this.sounds_[soundId]; | |
169 if (!pool) { | |
170 console.error('Cannot find sound: ' + soundId); | |
171 return; | |
172 } | |
173 // Search the sound pool for a free resource. | |
174 for (var i = 0; i < pool.length; i++) { | |
175 if (pool[i].paused) { | |
176 pool[i].play(); | |
177 return; | |
178 } | |
179 } | |
180 }; | |
181 | |
182 | |
183 /** | |
184 * On key up. | |
185 * | |
186 * @param {ElementType} key The key released. | |
187 */ | |
188 Controller.prototype.onKeyUp = function(key) { | |
189 var sound = keyToSoundIdOnKeyUp[key] || Sounds.STANDARD; | |
190 this.playSound_(sound); | |
191 }; | |
192 | |
193 | |
194 /** | |
195 * On key repeat. | |
196 * | |
197 * @param {ElementType} key The key that is being repeated. | |
198 */ | |
199 Controller.prototype.onKeyRepeat = function(key) { | |
200 var sound = keyToSoundIdOnKeyRepeat[key] || Sounds.NONE; | |
201 this.playSound_(sound); | |
202 }; | |
203 | |
204 | |
205 /** @override */ | |
206 Controller.prototype.disposeInternal = function() { | |
207 for (var soundId in this.sounds_) { | |
208 var pool = this.sounds_[soundId]; | |
209 for (var i = 0; i < pool.length; i++) { | |
210 var tag = pool[i]; | |
211 if (tag && tag.loaded) { | |
212 tag.pause(); | |
213 tag.autoplay = false; | |
214 tag.loop = false; | |
215 tag.currentTime = 0; | |
216 } | |
217 } | |
218 delete this.sounds_[soundId]; | |
219 } | |
220 this.sounds_ = {}; | |
221 keyToSoundIdOnKeyUp = {}; | |
222 keyToSoundIdOnKeyRepeat = {}; | |
223 goog.base(this, 'disposeInternal'); | |
224 }; | |
225 | |
226 }); // goog.scope | |
OLD | NEW |