Confirmed users
656
edits
Line 313: | Line 313: | ||
<body> | <body> | ||
<input type="text" size="4" id="freq" value="440"><label for="hz">Hz</label> | <input type="text" size="4" id="freq" value="440"><label for="hz">Hz</label> | ||
<button onclick="start()">play</button> | <button onclick="start()">play</button> | ||
<button onclick="stop()">stop</button> | <button onclick="stop()">stop</button> | ||
<script type="text/javascript"> | <script type="text/javascript"> | ||
var | var sampleRate = 44100, | ||
portionSize = sampleRate / 10, | |||
prebufferSize = sampleRate / 2, | |||
freq = undefined; // no sound | |||
var audio = new Audio(); | |||
audio.mozSetup(1, sampleRate, 1); | |||
var currentWritePosition = 0; | |||
function | function getSoundData(t, size) { | ||
var soundData = new Float32Array(size); | |||
if (freq) { | |||
var k = 2* Math.PI * freq / sampleRate; | |||
for (var i=0; i<size; i++) { | |||
soundData[i] = Math.sin(k * (i + t)); | |||
} | |||
} | |||
return soundData; | |||
} | } | ||
function | function writeData() { | ||
while(audio.mozCurrentSampleOffset() + prebufferSize >= currentWritePosition) { | |||
var soundData = getSoundData(currentWritePosition, portionSize); | |||
audio.mozWriteAudio(soundData); | |||
currentWritePosition += portionSize; | |||
} | } | ||
} | } | ||
function | // initial write | ||
writeData(); | |||
var writeInterval = Math.floor(1000 * portionSize / sampleRate); | |||
setInterval(writeData, writeInterval); | |||
function start() { | |||
freq = parseFloat(document.getElementById("freq").value); | freq = parseFloat(document.getElementById("freq").value); | ||
} | } | ||
function stop() { | |||
freq = undefined; | |||
} | |||
</script> | </script> | ||
</body> | </body> |