Я написал программу, которая использует класс звуковой библиотеки 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();
}
}