我正在写一个需要播放某个PCM流的Firefox扩展。通过LiveConnect从java模块中检索样本:
Java代码:
public class Synthesizer
{
...
public
float[] synthesizeFloats(int[] symbols)
{
// Some code to generate 32bit float PCM samples
...
return floatSamples;
}
...
}Javascript代码:
scream: function(samples)
{
var start = 0;
var elapsed = 0;
start = (new Date()).getTime();
var floatSamples = new Float32Array(samples);
elapsed = (new Date()).getTime() - start;
Firebug.Console.log("Converting array (2) - Elapsed time in ms " + elapsed);
var modulationProperties = this.defaultModulationProperties();
var audio = new Audio();
audio.mozSetup(1, modulationProperties.sampleFrequency);
var written = 0;
while (written < floatSamples.length) {
written += audio.mozWriteAudio(floatSamples.subarray(written));
}
},
// Synthesizer class was loaded and instantiaded over LiveConnect
var samples = synthesizer.synthesizeFloats(symbols);
scream(samples);上面的代码有效,但速度很慢。看起来,将java字节数组转换为Float32Array非常昂贵。转换是必要的,因为不能将java字节数组传递给mozWriteAudio函数。
我的问题是:
有没有办法更有效地完成转换?
有没有办法让Java代码返回一个JavaScript Float32Array对象而不是java对象?
是否有可以播放可用于Firefox扩展的PCM音频的java实现?使用该JavaScript代码的Java实现不需要上述转换。
任何其他的想法/方向将不胜感激。