播放来自多个缓冲区的声音,或制作一个缓冲区Java声音API

时间:2014-03-20 14:16:15

标签: java multithreading audio

我正在使用带有录制声音的缓冲区数组。我从服务器获取它们。它们都在一个线程中进行复活。 现在,我有4个线程 - 从/向服务器(主)读取/写入,录音,使用声音数据(从多个缓冲区到1)和声音播放线程。

但我有一个biiig问题 - 声音“编辑”线程无法跟上播放线程。我在编辑线程时做了什么 - 将所有缓冲区相加并将其除以缓冲区数。如果我只是做ObSound .put(buffer [0]) - 声音还可以。但是如果我将从那个缓冲区的第一个元素到最后一个元素 - 声音将“bug”。或者实际上它将“冻结”第二个,然后继续。继续。并且它的声音很棒,它会非常有趣。我认为你不喜欢我在“歌曲”中所说的意思。

Soo,我怎么从n声音缓冲区只有一个声音缓冲区?或者我如何“玩”它们?

我的部分代码:

static public void playSound() {
    while (ObSound.peek() == null)
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } 
    Byte[] Buff3 = ObSound.poll();              
    PlaySound.write(ArrayUtils.toPrimitive(Buff3),0,Buff3.length);
}
static public void recordSound() {
    MicRec.read(buff, 0, buff.length);
    try {
        MicOS.write(buff,0,buff.length);
        MicOS.flush();  
    } catch (IOException e) {
        e.printStackTrace();
    }
}

//How do i make 1 buffer
        Byte[] Buff2 = new Byte[buff2.length];
        for (int j = 0;j<buff2.length;j+=2) {
            long summ = 0;
            for (int i1 = 0;i1<totalTh;i1++) {
                summ += ((buff4[i1][j+1] & 0xFF) << 8) | (buff4[i1][j] & 0xFF); 
            }
            byte res = (byte)(summ / totalTh);                  
            Buff2[j] = (byte)(res & 0xff);
            Buff2[j+1] = (byte)((res >> 8) & 0xff);
        }

编辑:

Finnaly,发现了问题!实际上有两个问题:

res-byte的类型.Anad beacos res-summ为2个字节,他不能持有。第二个问题 - 由于某种原因,有时recordSound返回长度为“声音数组”的x2,以及那个beacos - 它正在删除结束它的第一个很简单 - 只需改变类型。

但如何解决第二个问题呢?当我们检测到数组更长的buff2.length - 只是削减它,一部分“处理”,第二部分 - 不要触摸。但是怎么做?呃,双面队列会有所帮助(又名Deque http://docs.oracle.com/javase/7/docs/api/java/util/Deque.html).PROFIT,its正在工作!

Ty evryone for“help”=)

0 个答案:

没有答案