Эффективная потоковая передача аудиосэмплов, извлеченных из Java-объекта в Gecko (расширение Firefox)
Я пишу расширение Firefox, которое должно воспроизводить определенный поток PCM. Образцы извлекаются из Java-модуля через LiveConnect:
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?
- Существует ли реализация Java, которая позволяет воспроизводить звук PCM, который может использоваться в расширении Firefox? Использование этой реализации Java без использования кода JavaScript не потребует вышеуказанного преобразования.
Любые другие идеи / направления будут оценены.