8238925: Enhance WAV file playback
Reviewed-by: prr, amenkov, rhalade, mschoene
This commit is contained in:
parent
8fdbb29079
commit
45cace2867
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1067,7 +1067,7 @@ final class DirectAudioDevice extends AbstractMixer {
|
||||
public void open(AudioInputStream stream) throws LineUnavailableException, IOException {
|
||||
|
||||
// $$fb part of fix for 4679187: Clip.open() throws unexpected Exceptions
|
||||
Toolkit.isFullySpecifiedAudioFormat(format);
|
||||
Toolkit.isFullySpecifiedAudioFormat(stream.getFormat());
|
||||
|
||||
synchronized (mixer) {
|
||||
byte[] streamData = null;
|
||||
@ -1078,11 +1078,18 @@ final class DirectAudioDevice extends AbstractMixer {
|
||||
}
|
||||
int lengthInFrames = (int)stream.getFrameLength();
|
||||
int bytesRead = 0;
|
||||
int frameSize = stream.getFormat().getFrameSize();
|
||||
if (lengthInFrames != AudioSystem.NOT_SPECIFIED) {
|
||||
// read the data from the stream into an array in one fell swoop.
|
||||
int arraysize = lengthInFrames * stream.getFormat().getFrameSize();
|
||||
streamData = new byte[arraysize];
|
||||
|
||||
int arraysize = lengthInFrames * frameSize;
|
||||
if (arraysize < 0) {
|
||||
throw new IllegalArgumentException("Audio data < 0");
|
||||
}
|
||||
try {
|
||||
streamData = new byte[arraysize];
|
||||
} catch (OutOfMemoryError e) {
|
||||
throw new IOException("Audio data is too big");
|
||||
}
|
||||
int bytesRemaining = arraysize;
|
||||
int thisRead = 0;
|
||||
while (bytesRemaining > 0 && thisRead >= 0) {
|
||||
@ -1100,9 +1107,14 @@ final class DirectAudioDevice extends AbstractMixer {
|
||||
// we use a slightly modified version of ByteArrayOutputStream
|
||||
// to get direct access to the byte array (we don't want a new array
|
||||
// to be allocated)
|
||||
int MAX_READ_LIMIT = 16384;
|
||||
int maxReadLimit = Math.max(16384, frameSize);
|
||||
DirectBAOS dbaos = new DirectBAOS();
|
||||
byte[] tmp = new byte[MAX_READ_LIMIT];
|
||||
byte[] tmp;
|
||||
try {
|
||||
tmp = new byte[maxReadLimit];
|
||||
} catch (OutOfMemoryError e) {
|
||||
throw new IOException("Audio data is too big");
|
||||
}
|
||||
int thisRead = 0;
|
||||
while (thisRead >= 0) {
|
||||
thisRead = stream.read(tmp, 0, tmp.length);
|
||||
@ -1116,7 +1128,7 @@ final class DirectAudioDevice extends AbstractMixer {
|
||||
} // while
|
||||
streamData = dbaos.getInternalBuffer();
|
||||
}
|
||||
lengthInFrames = bytesRead / stream.getFormat().getFrameSize();
|
||||
lengthInFrames = bytesRead / frameSize;
|
||||
|
||||
// now try to open the device
|
||||
open(stream.getFormat(), streamData, lengthInFrames);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -164,6 +164,14 @@ public final class Toolkit {
|
||||
|
||||
|
||||
static void isFullySpecifiedAudioFormat(AudioFormat format) {
|
||||
// Our code requires a positive frame size, that's probably is not
|
||||
// necessary for non-linear encodings, but for now
|
||||
// IllegalArgumentException is better than ArithmeticException
|
||||
if (format.getFrameSize() <= 0) {
|
||||
throw new IllegalArgumentException("invalid frame size: "
|
||||
+((format.getFrameSize() == -1) ?
|
||||
"NOT_SPECIFIED":String.valueOf(format.getFrameSize())));
|
||||
}
|
||||
if (!format.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED)
|
||||
&& !format.getEncoding().equals(AudioFormat.Encoding.PCM_UNSIGNED)
|
||||
&& !format.getEncoding().equals(AudioFormat.Encoding.ULAW)
|
||||
@ -186,11 +194,6 @@ public final class Toolkit {
|
||||
+((format.getSampleSizeInBits()==-1)?
|
||||
"NOT_SPECIFIED":String.valueOf(format.getSampleSizeInBits())));
|
||||
}
|
||||
if (format.getFrameSize() <= 0) {
|
||||
throw new IllegalArgumentException("invalid frame size: "
|
||||
+((format.getFrameSize()==-1)?
|
||||
"NOT_SPECIFIED":String.valueOf(format.getFrameSize())));
|
||||
}
|
||||
if (format.getChannels() <= 0) {
|
||||
throw new IllegalArgumentException("invalid number of channels: "
|
||||
+((format.getChannels()==-1)?
|
||||
|
Loading…
x
Reference in New Issue
Block a user