从Gecko(firefox扩展)中的java对象检索的高效流式音频样本
我正在编写一个firefox扩展,它需要播放特定的PCM流。通过LiveConnect从java模块检索示例: Java代码:从Gecko(firefox扩展)中的java对象检索的高效流式音频样本,java,javascript,firefox-addon,gecko,liveconnect,Java,Javascript,Firefox Addon,Gecko,Liveconnect,我正在编写一个firefox扩展,它需要播放特定的PCM流。通过LiveConnect从java模块检索示例: Java代码: public class Synthesizer { ... public float[] synthesizeFloats(int[] symbols) { // Some code to generate 32bit float PCM samples ... return floatSamples; } .
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);
尖叫:函数(示例)
{
var start=0;
var=0;
开始=(新日期()).getTime();
var floatSamples=新的Float32Array(样本);
已用=(新日期()).getTime()-start;
Firebug.Console.log(“转换数组(2)-以毫秒为单位的运行时间”+运行时间);
var modulationProperties=this.defaultModulationProperties();
var audio=新音频();
音频.mozSetup(1,调制属性.sampleFrequency);
var=0;
while(书写
上面的代码工作起来很慢。看来,将java字节数组转换为Float32Array相当昂贵。转换是必要的,因为不能将java字节数组传递给mozWriteAudio函数
我的问题是:
如果您还有其他想法/指导,我们将不胜感激。我想您的前两个问题的答案是“不”。任何东西都不可能比
新的Float32Array(samples)
更快,而LiveConnect通常不是最快的。AFAIK Java代码只能在Java对象中进行通信,它无法返回正确的JavaScript对象。我对这个扩展编程非常陌生-在firefox扩展中使用Java代码有更好的选择吗?是的,显然使用JavaScript。这意味着您的扩展不需要拖拽额外的VM。好的-这是最后的选择。。。可以在firefox扩展中使用Java声音API吗?也就是说,使用LiveConnect?我用java实现了一个小包装器,以满足java声音API中的需要。我的包装器对象方法采用短[],我的javascript代码只需将samples
变量传递给它。不需要转换,而且性能令人满意,因为Javascript代码中没有进行转换。