- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / test / data / third_party / spaceport / js / tests / audioLatency.js
1 define([ 'util/ensureCallback', 'util/cacheBust', 'util/timeout' ], function (ensureCallback, cacheBust, timeout) {
2     var MAX_LATENCY = 20;
3
4     function getPlayLatency(audio, callback) {
5         callback = ensureCallback(callback);
6
7         var startTime;
8
9         function update() {
10             var endTime = Date.now();
11
12             audio.removeEventListener('play', update, false);
13             audio.removeEventListener('timeupdate', update, false);
14             audio.pause();
15
16             callback(null, endTime - startTime);
17         }
18
19         audio.addEventListener('play', update, false);
20         audio.addEventListener('timeupdate', update, false);
21
22         startTime = Date.now();
23         audio.play();
24     }
25
26     function audioLatency(callback) {
27         callback = ensureCallback(callback);
28
29         if (!window.Audio) {
30             callback(new Error('Audio not supported'));
31             return;
32         }
33
34         var audio = new window.Audio();
35
36         function onCanPlayThrough() {
37             audio.removeEventListener('canplaythrough', onCanPlayThrough, false);
38
39             // Run the test twice: once for "cold" time, once for "warm" time.
40             getPlayLatency(audio, function (err, coldTime) {
41                 if (err) {
42                     callback(err);
43                     return;
44                 }
45
46                 getPlayLatency(audio, function (err, warmTime) {
47                     if (err) {
48                         callback(err);
49                         return;
50                     }
51
52                     callback(null, {
53                         pass: coldTime <= MAX_LATENCY && warmTime <= MAX_LATENCY,
54                         coldLatency: coldTime,
55                         warmLatency: warmTime
56                     });
57                 });
58             });
59         }
60
61         function onError() {
62             callback(new Error('Failed to load audio'));
63         }
64
65         var source = document.createElement('source');
66         source.src = cacheBust.url('assets/silence.wav');
67         source.addEventListener('error', onError, false);
68
69         audio.addEventListener('canplaythrough', onCanPlayThrough, false);
70         audio.addEventListener('error', onError, false);
71         audio.appendChild(source);
72         audio.play();
73
74         // Work around Webkit bug (present in Chrome <= 15, Safari <= 5, at
75         // time of writing) where the browser will decide it doesn't /need/
76         // to download all these pesky audio files.
77         window['audio__' + Math.random()] = audio;
78     }
79
80     return function (callback) {
81         callback = ensureCallback(callback);
82
83         timeout(5000, audioLatency, callback);
84     };
85 });