Эффективная потоковая передача аудиосэмплов, извлеченных из 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.

Мои вопросы:

  1. Есть ли способ сделать преобразование более эффективно?
  2. Есть ли способ заставить Java-код возвращать объект Javascript Float32Array вместо объекта Java?
  3. Существует ли реализация Java, которая позволяет воспроизводить звук PCM, который может использоваться в расширении Firefox? Использование этой реализации Java без использования кода JavaScript не потребует вышеуказанного преобразования.

Любые другие идеи / направления будут оценены.

0 ответов

Другие вопросы по тегам