mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-12 08:53:12 +00:00
8146239: Support of PCM_FLOAT for the AU file format
Reviewed-by: amenkov
This commit is contained in:
parent
4333fe028f
commit
aa5097cc9d
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2016, 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
|
||||
@ -45,11 +45,12 @@ final class AuFileFormat extends AudioFileFormat {
|
||||
static final int AU_LINEAR_24 = 4; /* 24-bit linear PCM */
|
||||
static final int AU_LINEAR_32 = 5; /* 32-bit linear PCM */
|
||||
static final int AU_FLOAT = 6; /* 32-bit IEEE floating point */
|
||||
static final int AU_DOUBLE = 7; /* 64-bit IEEE floating point */
|
||||
static final int AU_ADPCM_G721 = 23; /* 4-bit CCITT g.721 ADPCM */
|
||||
static final int AU_ADPCM_G722 = 24; /* CCITT g.722 ADPCM */
|
||||
static final int AU_ADPCM_G723_3 = 25; /* CCITT g.723 3-bit ADPCM */
|
||||
static final int AU_ADPCM_G723_5 = 26; /* CCITT g.723 5-bit ADPCM */
|
||||
// we don't support these ...
|
||||
// static final int AU_DOUBLE = 7; /* 64-bit IEEE floating point */
|
||||
// static final int AU_ADPCM_G721 = 23; /* 4-bit CCITT g.721 ADPCM */
|
||||
// static final int AU_ADPCM_G722 = 24; /* CCITT g.722 ADPCM */
|
||||
// static final int AU_ADPCM_G723_3 = 25; /* CCITT g.723 3-bit ADPCM */
|
||||
// static final int AU_ADPCM_G723_5 = 26; /* CCITT g.723 5-bit ADPCM */
|
||||
static final int AU_ALAW_8 = 27; /* 8-bit ISDN A-law */
|
||||
|
||||
static final int AU_HEADERSIZE = 24;
|
||||
@ -64,24 +65,28 @@ final class AuFileFormat extends AudioFileFormat {
|
||||
|
||||
auType = -1;
|
||||
|
||||
if( AudioFormat.Encoding.ALAW.equals(encoding) ) {
|
||||
if( format.getSampleSizeInBits()==8 ) {
|
||||
if (AudioFormat.Encoding.ALAW.equals(encoding)) {
|
||||
if (format.getSampleSizeInBits() == 8) {
|
||||
auType = AU_ALAW_8;
|
||||
}
|
||||
} else if( AudioFormat.Encoding.ULAW.equals(encoding) ) {
|
||||
if( format.getSampleSizeInBits()==8 ) {
|
||||
} else if (AudioFormat.Encoding.ULAW.equals(encoding)) {
|
||||
if (format.getSampleSizeInBits() == 8) {
|
||||
auType = AU_ULAW_8;
|
||||
}
|
||||
} else if( AudioFormat.Encoding.PCM_SIGNED.equals(encoding) ) {
|
||||
if( format.getSampleSizeInBits()==8 ) {
|
||||
} else if (AudioFormat.Encoding.PCM_SIGNED.equals(encoding)) {
|
||||
if (format.getSampleSizeInBits() == 8) {
|
||||
auType = AU_LINEAR_8;
|
||||
} else if( format.getSampleSizeInBits()==16 ) {
|
||||
} else if (format.getSampleSizeInBits() == 16) {
|
||||
auType = AU_LINEAR_16;
|
||||
} else if( format.getSampleSizeInBits()==24 ) {
|
||||
} else if (format.getSampleSizeInBits() == 24) {
|
||||
auType = AU_LINEAR_24;
|
||||
} else if( format.getSampleSizeInBits()==32 ) {
|
||||
} else if (format.getSampleSizeInBits() == 32) {
|
||||
auType = AU_LINEAR_32;
|
||||
}
|
||||
} else if (AudioFormat.Encoding.PCM_FLOAT.equals(encoding)) {
|
||||
if (format.getSampleSizeInBits() == 32) {
|
||||
auType = AU_FLOAT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2016, 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
|
||||
@ -30,6 +30,7 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.sound.sampled.AudioFileFormat;
|
||||
import javax.sound.sampled.AudioFileFormat.Type;
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.UnsupportedAudioFileException;
|
||||
@ -56,7 +57,7 @@ public final class AuFileReader extends SunFileReader {
|
||||
|
||||
final int headerSize = dis.readInt();
|
||||
final int dataSize = dis.readInt();
|
||||
final int encoding_local = dis.readInt();
|
||||
final int auType = dis.readInt();
|
||||
final int sampleRate = dis.readInt();
|
||||
final int channels = dis.readInt();
|
||||
if (channels <= 0) {
|
||||
@ -65,40 +66,38 @@ public final class AuFileReader extends SunFileReader {
|
||||
|
||||
final int sampleSizeInBits;
|
||||
final AudioFormat.Encoding encoding;
|
||||
switch (encoding_local) {
|
||||
case AuFileFormat.AU_ULAW_8:
|
||||
encoding = AudioFormat.Encoding.ULAW;
|
||||
sampleSizeInBits = 8;
|
||||
break;
|
||||
case AuFileFormat.AU_ALAW_8:
|
||||
encoding = AudioFormat.Encoding.ALAW;
|
||||
sampleSizeInBits = 8;
|
||||
break;
|
||||
case AuFileFormat.AU_LINEAR_8:
|
||||
// $$jb: 04.29.99: 8bit linear is *signed*, not *unsigned*
|
||||
encoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
sampleSizeInBits = 8;
|
||||
break;
|
||||
case AuFileFormat.AU_LINEAR_16:
|
||||
encoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
sampleSizeInBits = 16;
|
||||
break;
|
||||
case AuFileFormat.AU_LINEAR_24:
|
||||
encoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
|
||||
sampleSizeInBits = 24;
|
||||
break;
|
||||
case AuFileFormat.AU_LINEAR_32:
|
||||
encoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
|
||||
sampleSizeInBits = 32;
|
||||
break;
|
||||
// $jb: 03.19.99: we don't support these ...
|
||||
/* case AuFileFormat.AU_FLOAT:
|
||||
encoding = new AudioFormat.FLOAT;
|
||||
sampleSizeInBits = 32;
|
||||
break;
|
||||
case AuFileFormat.AU_DOUBLE:
|
||||
switch (auType) {
|
||||
case AuFileFormat.AU_ULAW_8:
|
||||
encoding = AudioFormat.Encoding.ULAW;
|
||||
sampleSizeInBits = 8;
|
||||
break;
|
||||
case AuFileFormat.AU_ALAW_8:
|
||||
encoding = AudioFormat.Encoding.ALAW;
|
||||
sampleSizeInBits = 8;
|
||||
break;
|
||||
case AuFileFormat.AU_LINEAR_8:
|
||||
// $$jb: 04.29.99: 8bit linear is *signed*, not *unsigned*
|
||||
encoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
sampleSizeInBits = 8;
|
||||
break;
|
||||
case AuFileFormat.AU_LINEAR_16:
|
||||
encoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
sampleSizeInBits = 16;
|
||||
break;
|
||||
case AuFileFormat.AU_LINEAR_24:
|
||||
encoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
sampleSizeInBits = 24;
|
||||
break;
|
||||
case AuFileFormat.AU_LINEAR_32:
|
||||
encoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
sampleSizeInBits = 32;
|
||||
break;
|
||||
case AuFileFormat.AU_FLOAT:
|
||||
encoding = AudioFormat.Encoding.PCM_FLOAT;
|
||||
sampleSizeInBits = 32;
|
||||
break;
|
||||
// we don't support these ...
|
||||
/* case AuFileFormat.AU_DOUBLE:
|
||||
encoding = new AudioFormat.DOUBLE;
|
||||
sampleSizeInBits = 8;
|
||||
break;
|
||||
@ -117,9 +116,9 @@ public final class AuFileReader extends SunFileReader {
|
||||
SamplePerUnit = 8;
|
||||
break;
|
||||
*/
|
||||
default:
|
||||
// unsupported filetype, throw exception
|
||||
throw new UnsupportedAudioFileException("not a valid AU file");
|
||||
default:
|
||||
// unsupported filetype, throw exception
|
||||
throw new UnsupportedAudioFileException("not a valid AU file");
|
||||
}
|
||||
|
||||
final int frameSize = calculatePCMFrameSize(sampleSizeInBits, channels);
|
||||
@ -136,7 +135,6 @@ public final class AuFileReader extends SunFileReader {
|
||||
final AudioFormat format = new AudioFormat(encoding, sampleRate,
|
||||
sampleSizeInBits, channels,
|
||||
frameSize, sampleRate, true);
|
||||
return new AuFileFormat(AudioFileFormat.Type.AU, dataSize + headerSize,
|
||||
format, length);
|
||||
return new AuFileFormat(Type.AU, dataSize + headerSize, format, length);
|
||||
}
|
||||
}
|
||||
|
||||
@ -39,6 +39,7 @@ import java.io.SequenceInputStream;
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.sound.sampled.AudioFileFormat;
|
||||
import javax.sound.sampled.AudioFileFormat.Type;
|
||||
import javax.sound.sampled.AudioFormat;
|
||||
import javax.sound.sampled.AudioInputStream;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
@ -59,32 +60,32 @@ public final class AuFileWriter extends SunFileWriter {
|
||||
* Constructs a new AuFileWriter object.
|
||||
*/
|
||||
public AuFileWriter() {
|
||||
super(new AudioFileFormat.Type[]{AudioFileFormat.Type.AU});
|
||||
super(new Type[]{Type.AU});
|
||||
}
|
||||
|
||||
@Override
|
||||
public AudioFileFormat.Type[] getAudioFileTypes(AudioInputStream stream) {
|
||||
public Type[] getAudioFileTypes(AudioInputStream stream) {
|
||||
|
||||
AudioFileFormat.Type[] filetypes = new AudioFileFormat.Type[types.length];
|
||||
Type[] filetypes = new Type[types.length];
|
||||
System.arraycopy(types, 0, filetypes, 0, types.length);
|
||||
|
||||
// make sure we can write this stream
|
||||
AudioFormat format = stream.getFormat();
|
||||
AudioFormat.Encoding encoding = format.getEncoding();
|
||||
|
||||
if( (AudioFormat.Encoding.ALAW.equals(encoding)) ||
|
||||
(AudioFormat.Encoding.ULAW.equals(encoding)) ||
|
||||
(AudioFormat.Encoding.PCM_SIGNED.equals(encoding)) ||
|
||||
(AudioFormat.Encoding.PCM_UNSIGNED.equals(encoding)) ) {
|
||||
|
||||
if (AudioFormat.Encoding.ALAW.equals(encoding)
|
||||
|| AudioFormat.Encoding.ULAW.equals(encoding)
|
||||
|| AudioFormat.Encoding.PCM_SIGNED.equals(encoding)
|
||||
|| AudioFormat.Encoding.PCM_UNSIGNED.equals(encoding)
|
||||
|| AudioFormat.Encoding.PCM_FLOAT.equals(encoding)) {
|
||||
return filetypes;
|
||||
}
|
||||
|
||||
return new AudioFileFormat.Type[0];
|
||||
return new Type[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public int write(AudioInputStream stream, AudioFileFormat.Type fileType, OutputStream out) throws IOException {
|
||||
public int write(AudioInputStream stream, Type fileType, OutputStream out) throws IOException {
|
||||
Objects.requireNonNull(stream);
|
||||
Objects.requireNonNull(fileType);
|
||||
Objects.requireNonNull(out);
|
||||
@ -101,7 +102,7 @@ public final class AuFileWriter extends SunFileWriter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int write(AudioInputStream stream, AudioFileFormat.Type fileType, File out) throws IOException {
|
||||
public int write(AudioInputStream stream, Type fileType, File out) throws IOException {
|
||||
Objects.requireNonNull(stream);
|
||||
Objects.requireNonNull(fileType);
|
||||
Objects.requireNonNull(out);
|
||||
@ -141,61 +142,35 @@ public final class AuFileWriter extends SunFileWriter {
|
||||
* Returns the AudioFileFormat describing the file that will be written from this AudioInputStream.
|
||||
* Throws IllegalArgumentException if not supported.
|
||||
*/
|
||||
private AudioFileFormat getAudioFileFormat(AudioFileFormat.Type type, AudioInputStream stream) {
|
||||
private AudioFileFormat getAudioFileFormat(Type type, AudioInputStream stream) {
|
||||
if (!isFileTypeSupported(type, stream)) {
|
||||
throw new IllegalArgumentException("File type " + type + " not supported.");
|
||||
}
|
||||
|
||||
AudioFormat format = null;
|
||||
AuFileFormat fileFormat = null;
|
||||
AudioFormat.Encoding encoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
|
||||
AudioFormat streamFormat = stream.getFormat();
|
||||
AudioFormat.Encoding streamEncoding = streamFormat.getEncoding();
|
||||
|
||||
|
||||
int sampleSizeInBits;
|
||||
int fileSize;
|
||||
|
||||
if( (AudioFormat.Encoding.ALAW.equals(streamEncoding)) ||
|
||||
(AudioFormat.Encoding.ULAW.equals(streamEncoding)) ) {
|
||||
|
||||
encoding = streamEncoding;
|
||||
sampleSizeInBits = streamFormat.getSampleSizeInBits();
|
||||
|
||||
} else if ( streamFormat.getSampleSizeInBits()==8 ) {
|
||||
AudioFormat.Encoding encoding = streamFormat.getEncoding();
|
||||
|
||||
if (AudioFormat.Encoding.PCM_UNSIGNED.equals(encoding)) {
|
||||
encoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
sampleSizeInBits=8;
|
||||
|
||||
} else {
|
||||
|
||||
encoding = AudioFormat.Encoding.PCM_SIGNED;
|
||||
sampleSizeInBits=streamFormat.getSampleSizeInBits();
|
||||
}
|
||||
|
||||
// We always write big endian au files, this is by far the standard
|
||||
AudioFormat format = new AudioFormat(encoding,
|
||||
streamFormat.getSampleRate(),
|
||||
streamFormat.getSampleSizeInBits(),
|
||||
streamFormat.getChannels(),
|
||||
streamFormat.getFrameSize(),
|
||||
streamFormat.getFrameRate(), true);
|
||||
|
||||
format = new AudioFormat( encoding,
|
||||
streamFormat.getSampleRate(),
|
||||
sampleSizeInBits,
|
||||
streamFormat.getChannels(),
|
||||
streamFormat.getFrameSize(),
|
||||
streamFormat.getFrameRate(),
|
||||
true); // AU is always big endian
|
||||
|
||||
|
||||
if( stream.getFrameLength()!=AudioSystem.NOT_SPECIFIED ) {
|
||||
int fileSize;
|
||||
if (stream.getFrameLength() != AudioSystem.NOT_SPECIFIED) {
|
||||
fileSize = (int)stream.getFrameLength()*streamFormat.getFrameSize() + AuFileFormat.AU_HEADERSIZE;
|
||||
} else {
|
||||
fileSize = AudioSystem.NOT_SPECIFIED;
|
||||
}
|
||||
|
||||
fileFormat = new AuFileFormat( AudioFileFormat.Type.AU,
|
||||
fileSize,
|
||||
format,
|
||||
(int)stream.getFrameLength() );
|
||||
|
||||
return fileFormat;
|
||||
return new AuFileFormat(Type.AU, fileSize, format,
|
||||
(int) stream.getFrameLength());
|
||||
}
|
||||
|
||||
private InputStream getFileStream(AuFileFormat auFileFormat, AudioInputStream audioStream) throws IOException {
|
||||
@ -212,7 +187,7 @@ public final class AuFileWriter extends SunFileWriter {
|
||||
if (dataSizeInBytes>0x7FFFFFFFl) {
|
||||
dataSizeInBytes=UNKNOWN_SIZE;
|
||||
}
|
||||
int encoding_local = auFileFormat.getAuType();
|
||||
int auType = auFileFormat.getAuType();
|
||||
int sampleRate = (int)format.getSampleRate();
|
||||
int channels = format.getChannels();
|
||||
|
||||
@ -222,43 +197,17 @@ public final class AuFileWriter extends SunFileWriter {
|
||||
DataOutputStream dos = null;
|
||||
SequenceInputStream auStream = null;
|
||||
|
||||
AudioFormat audioStreamFormat = null;
|
||||
AudioFormat.Encoding encoding = null;
|
||||
InputStream codedAudioStream = audioStream;
|
||||
|
||||
// if we need to do any format conversion, do it here.
|
||||
|
||||
codedAudioStream = audioStream;
|
||||
|
||||
audioStreamFormat = audioStream.getFormat();
|
||||
encoding = audioStreamFormat.getEncoding();
|
||||
|
||||
// if we need to do any format conversion, we do it here.
|
||||
//$$ fb 2001-07-13: Bug 4391108
|
||||
if( (AudioFormat.Encoding.PCM_UNSIGNED.equals(encoding)) ||
|
||||
(AudioFormat.Encoding.PCM_SIGNED.equals(encoding)
|
||||
&& !audioStreamFormat.isBigEndian()) ) {
|
||||
// We always write big endian au files, this is by far the standard
|
||||
codedAudioStream = AudioSystem.getAudioInputStream( new AudioFormat (
|
||||
AudioFormat.Encoding.PCM_SIGNED,
|
||||
audioStreamFormat.getSampleRate(),
|
||||
audioStreamFormat.getSampleSizeInBits(),
|
||||
audioStreamFormat.getChannels(),
|
||||
audioStreamFormat.getFrameSize(),
|
||||
audioStreamFormat.getFrameRate(),
|
||||
true),
|
||||
audioStream );
|
||||
|
||||
|
||||
}
|
||||
audioStream = AudioSystem.getAudioInputStream(format, audioStream);
|
||||
|
||||
baos = new ByteArrayOutputStream();
|
||||
dos = new DataOutputStream(baos);
|
||||
|
||||
|
||||
dos.writeInt(AuFileFormat.AU_SUN_MAGIC);
|
||||
dos.writeInt(headerSize);
|
||||
dos.writeInt((int)dataSizeInBytes);
|
||||
dos.writeInt(encoding_local);
|
||||
dos.writeInt(auType);
|
||||
dos.writeInt(sampleRate);
|
||||
dos.writeInt(channels);
|
||||
|
||||
@ -269,7 +218,7 @@ public final class AuFileWriter extends SunFileWriter {
|
||||
header = baos.toByteArray();
|
||||
headerStream = new ByteArrayInputStream( header );
|
||||
auStream = new SequenceInputStream(headerStream,
|
||||
new NoCloseInputStream(codedAudioStream));
|
||||
new NoCloseInputStream(audioStream));
|
||||
|
||||
return auStream;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user