зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1118622 - Apply the gain to AnalyserNode data prior to sending on the main thread. r=ehsan
This commit is contained in:
Родитель
c2d3f30227
Коммит
052a2913a9
|
@ -66,9 +66,21 @@ public:
|
|||
|
||||
MutexAutoLock lock(NodeMutex());
|
||||
|
||||
if (Node() &&
|
||||
aInput.mChannelData.Length() > 0) {
|
||||
nsRefPtr<TransferBuffer> transfer = new TransferBuffer(aStream, aInput);
|
||||
if (Node()) {
|
||||
// If the input is silent, we sill need to send a silent buffer
|
||||
if (aOutput->IsNull()) {
|
||||
AllocateAudioBlock(1, aOutput);
|
||||
float* samples = static_cast<float*>(
|
||||
const_cast<void*>(aOutput->mChannelData[0]));
|
||||
PodZero(samples, WEBAUDIO_BLOCK_SIZE);
|
||||
}
|
||||
uint32_t channelCount = aOutput->mChannelData.Length();
|
||||
for (uint32_t channel = 0; channel < channelCount; ++channel) {
|
||||
float* samples = static_cast<float*>(
|
||||
const_cast<void*>(aOutput->mChannelData[channel]));
|
||||
AudioBlockInPlaceScale(samples, aOutput->mVolume);
|
||||
}
|
||||
nsRefPtr<TransferBuffer> transfer = new TransferBuffer(aStream, *aOutput);
|
||||
NS_DispatchToMainThread(transfer);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ support-files =
|
|||
webaudio.js
|
||||
|
||||
[test_analyserNode.html]
|
||||
[test_analyserScale.html]
|
||||
[test_analyserNodeOutput.html]
|
||||
[test_analyserNodePassThrough.html]
|
||||
[test_AudioBuffer.html]
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test AnalyserNode when the input is scaled </title>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script type="text/javascript" src="webaudio.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||
</head>
|
||||
<body>
|
||||
<pre id="test">
|
||||
<script class="testbody" type="text/javascript">
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
addLoadEvent(function() {
|
||||
|
||||
var context = new AudioContext();
|
||||
|
||||
var gain = context.createGain();
|
||||
var analyser = context.createAnalyser();
|
||||
var osc = context.createOscillator();
|
||||
|
||||
|
||||
osc.connect(gain);
|
||||
gain.connect(analyser);
|
||||
|
||||
osc.start();
|
||||
|
||||
var array = new Uint8Array(analyser.frequencyBinCount);
|
||||
|
||||
function getAnalyserData() {
|
||||
gain.gain.setValueAtTime(currentGain, context.currentTime);
|
||||
analyser.getByteTimeDomainData(array);
|
||||
var inrange = true;
|
||||
var max = -1;
|
||||
for (var i = 0; i < array.length; i++) {
|
||||
if (array[i] > max) {
|
||||
max = Math.abs(array[i] - 128);
|
||||
}
|
||||
}
|
||||
if (max <= currentGain * 128) {
|
||||
ok(true, "Analyser got scaled data for " + currentGain);
|
||||
currentGain = tests.shift();
|
||||
if (currentGain == undefined) {
|
||||
SimpleTest.finish();
|
||||
return;
|
||||
}
|
||||
}
|
||||
requestAnimationFrame(getAnalyserData);
|
||||
}
|
||||
|
||||
var tests = [1.0, 0.5, 0.0];
|
||||
var currentGain = tests.shift();
|
||||
requestAnimationFrame(getAnalyserData);
|
||||
});
|
||||
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
Загрузка…
Ссылка в новой задаче