SourceDataLine не работает на OpenJDK-11 - PullRequest
0 голосов
/ 21 октября 2018

Я написал программу, которая использует класс звуковой библиотеки Java SourceDataLine.

Я написал ее, используя openjdk 8 в Linux Mint 19, для чего используется Pulse-Audio.

Затем я переключилсяна openjdk 11 и хотя он работает без ошибок, звук не выводится.

Как только я снова переключаюсь на openjdk 8, звук снова работает.

Не думаю, что проблема заключается ввнутри кода, но здесь это в любом случае.Это довольно просто.Он просто играет немного белизны.

import java.io.*;
import javax.sound.sampled.*;

/**
 * SourcDataLineTest
 */
public class SourceDataLineTest {

final int bytesPerSmp = 2;

final int smpRate = 48000;
final int bitsPerSmp = bytesPerSmp * 8;
final int channels = 1;
final int framesSizeInBytes = bytesPerSmp * channels;
final int frameRate = (int)smpRate;
final boolean isBigEndian = false;
final int bufferSizeInBytes = 2048;

private SourceDataLine line;
boolean mStarted;

private byte[] mPrime;

public SourceDataLineTest () 
{
    try {
        AudioFormat af = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED , smpRate, bitsPerSmp, channels, framesSizeInBytes, frameRate, isBigEndian);
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, af);
        line = (SourceDataLine) AudioSystem.getLine(info);
        line.open(af, bufferSizeInBytes);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    float[] fPrime = new float[32168];
    mPrime = new byte[fPrime.length * bytesPerSmp];
    AudUtil.floatAudioToByte(fPrime, mPrime, bytesPerSmp);
}

void writeToLine(byte[] buffer)
{
    int position = 0;
    while (position < buffer.length) {
        int len = line.available();
        if (position + len >= buffer.length)
            len = buffer.length - position;
        line.write(buffer , position , len);
        position += len;

        if (!mStarted && line.available() == 0)
            line.start();
    }
}

void play()
{
    assert !mStarted;

    // generate while noise
    float[] data = new float[32768];
    AudUtil.generateWhiteNoise(data);

    // convert to bytes
    byte[] byteData = new byte[data.length * bytesPerSmp];
    AudUtil.floatAudioToByte(data , byteData, bytesPerSmp);

    // play a bunch of whitenoise
    for (int i = 0; i < 40; i++)
        writeToLine(byteData);

    mStarted = false;
    line.stop();
}

void close() {
    assert !mStarted;
    line.close();
}

}

...