Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(195)

Side by Side Diff: content/test/data/media/webrtc_test_audio.js

Issue 216523003: Tighten up webrtc audio tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Further tweaks to combat flakes on Android. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Audio test utilities. 5 // Audio test utilities.
6 6
7 // GetStats reports audio output energy in the [0, 32768] range.
8 var MAX_AUDIO_OUTPUT_ENERGY = 32768;
9
7 // Gathers |numSamples| samples at |frequency| number of times per second and 10 // Gathers |numSamples| samples at |frequency| number of times per second and
8 // calls back |callback| with an array with numbers in the [0, 32768] range. 11 // calls back |callback| with an array with numbers in the [0, 32768] range.
9 function gatherAudioLevelSamples(peerConnection, numSamples, frequency, 12 function gatherAudioLevelSamples(peerConnection, numSamples, frequency,
10 callback) { 13 callback) {
11 console.log('Gathering ' + numSamples + ' audio samples...'); 14 console.log('Gathering ' + numSamples + ' audio samples...');
12 var audioLevelSamples = [] 15 var audioLevelSamples = []
13 var gatherSamples = setInterval(function() { 16 var gatherSamples = setInterval(function() {
14 peerConnection.getStats(function(response) { 17 peerConnection.getStats(function(response) {
15 audioLevelSamples.push(getAudioLevelFromStats_(response)); 18 audioLevelSamples.push(getAudioLevelFromStats_(response));
16 if (audioLevelSamples.length == numSamples) { 19 if (audioLevelSamples.length == numSamples) {
17 console.log('Gathered all samples.'); 20 console.log('Gathered all samples.');
18 clearInterval(gatherSamples); 21 clearInterval(gatherSamples);
19 callback(audioLevelSamples); 22 callback(audioLevelSamples);
20 } 23 }
21 }); 24 });
22 }, 1000 / frequency); 25 }, 1000 / frequency);
23 } 26 }
24 27
25 // Tries to identify the beep-every-second signal generated by the fake audio 28 // Tries to identify the beep-every-half-second signal generated by the fake
26 // media/audio/fake_audio_input_stream.cc. Fails the test if we can't see a 29 // audio device in media/video/capture/fake_video_capture_device.cc. Fails the
27 // signal. 30 // test if we can't see a signal. The samples should have been gathered over at
31 // least two seconds since we expect to see at least three "peaks" in there
32 // (we should see either 3 or 4 depending on how things line up).
28 function verifyAudioIsPlaying(samples) { 33 function verifyAudioIsPlaying(samples) {
29 var average = 0; 34 var numPeaks = 0;
30 for (var i = 0; i < samples.length; ++i) 35 var threshold = MAX_AUDIO_OUTPUT_ENERGY * 0.7;
31 average += samples[i] / samples.length; 36 var currentlyOverThreshold = false;
32 37
33 var largest = 0; 38 // Detect when we have been been over the threshold and is going back again
34 for (var i = 0; i < samples.length; ++i) 39 // (i.e. count peaks). We should see about one peak per second.
35 largest = Math.max(largest, samples[i]); 40 for (var i = 0; i < samples.length; ++i) {
41 if (currentlyOverThreshold && samples[i] < threshold)
42 numPeaks++;
43 currentlyOverThreshold = samples[i] >= threshold;
44 }
36 45
37 console.log('Average audio level: ' + average + ', largest: ' + largest); 46 console.log('Number of peaks identified: ' + numPeaks);
38 47
39 // TODO(phoglund): Make a more sophisticated curve-fitting algorithm. We want 48 if (numPeaks < 2)
40 // to see a number of peaks with relative silence between them. The following 49 failTest('Expected to see at least two peaks in audio signal, got ' +
41 // seems to work fine on a nexus 7. 50 numPeaks + '. Dumping samples for analysis: "' + samples + '"');
42 if (average < 3000 || average > 8000)
43 failTest('Unexpected avg audio level: got ' + average + ', expected it ' +
44 'to be 4000 < avg < 8000.');
45 if (largest < 25000)
46 failTest('Too low max audio level: got ' + largest + ', expected > 30000.');
47 } 51 }
48 52
49 // If silent (like when muted), we should get very near zero audio level. 53 // If silent (like when muted), we should get very near zero audio level.
50 function verifyIsSilent(samples) { 54 function verifyIsSilent(samples) {
51 var average = 0; 55 var average = 0;
52 for (var i = 0; i < samples.length; ++i) 56 for (var i = 0; i < samples.length; ++i)
53 average += samples[i] / samples.length; 57 average += samples[i] / samples.length;
54 58
55 console.log('Average audio level: ' + average); 59 console.log('Average audio level: ' + average);
56 if (average > 500) 60 if (average > 500)
(...skipping 10 matching lines...) Expand all
67 var report = reports[i]; 71 var report = reports[i];
68 if (report.names().indexOf('audioOutputLevel') != -1) { 72 if (report.names().indexOf('audioOutputLevel') != -1) {
69 audioOutputLevels.push(report.stat('audioOutputLevel')); 73 audioOutputLevels.push(report.stat('audioOutputLevel'));
70 } 74 }
71 } 75 }
72 // Should only be one audio level reported, otherwise we get confused. 76 // Should only be one audio level reported, otherwise we get confused.
73 assertEquals(1, audioOutputLevels.length); 77 assertEquals(1, audioOutputLevels.length);
74 78
75 return audioOutputLevels[0]; 79 return audioOutputLevels[0];
76 } 80 }
OLDNEW
« no previous file with comments | « content/test/data/media/peerconnection-call.html ('k') | media/video/capture/fake_video_capture_device.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698