diff -r fd16c54261b3 -r 90ce3da70b43 jdk/src/share/classes/com/sun/media/sound/WaveFileFormat.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/WaveFileFormat.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,140 @@ +/* + * Copyright 1999-2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package com.sun.media.sound; + +import java.util.Vector; +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; +import java.lang.IllegalArgumentException; + +import java.io.BufferedOutputStream; +import java.io.DataOutputStream; +import java.io.FileOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.SequenceInputStream; + +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioSystem; + + +/** + * WAVE file format class. + * + * @author Jan Borgersen + */ + +class WaveFileFormat extends AudioFileFormat { + + /** + * Wave format type. + */ + private int waveType; + + //$$fb 2001-07-13: added management of header size in this class + //$$fb 2002-04-16: Fix for 4636355: RIFF audio headers could be _more_ spec compliant + private static final int STANDARD_HEADER_SIZE = 28; + + //$$fb 2002-04-16: Fix for 4636355: RIFF audio headers could be _more_ spec compliant + /** + * fmt_ chunk size in bytes + */ + private static final int STANDARD_FMT_CHUNK_SIZE = 16; + + // magic numbers + static final int RIFF_MAGIC = 1380533830; + static final int WAVE_MAGIC = 1463899717; + static final int FMT_MAGIC = 0x666d7420; // "fmt " + static final int DATA_MAGIC = 0x64617461; // "data" + + // encodings + static final int WAVE_FORMAT_UNKNOWN = 0x0000; + static final int WAVE_FORMAT_PCM = 0x0001; + static final int WAVE_FORMAT_ADPCM = 0x0002; + static final int WAVE_FORMAT_ALAW = 0x0006; + static final int WAVE_FORMAT_MULAW = 0x0007; + static final int WAVE_FORMAT_OKI_ADPCM = 0x0010; + static final int WAVE_FORMAT_DIGISTD = 0x0015; + static final int WAVE_FORMAT_DIGIFIX = 0x0016; + static final int WAVE_IBM_FORMAT_MULAW = 0x0101; + static final int WAVE_IBM_FORMAT_ALAW = 0x0102; + static final int WAVE_IBM_FORMAT_ADPCM = 0x0103; + static final int WAVE_FORMAT_DVI_ADPCM = 0x0011; + static final int WAVE_FORMAT_SX7383 = 0x1C07; + + + WaveFileFormat( AudioFileFormat aff ) { + + this( aff.getType(), aff.getByteLength(), aff.getFormat(), aff.getFrameLength() ); + } + + WaveFileFormat(AudioFileFormat.Type type, int lengthInBytes, AudioFormat format, int lengthInFrames) { + + super(type,lengthInBytes,format,lengthInFrames); + + AudioFormat.Encoding encoding = format.getEncoding(); + + if( encoding.equals(AudioFormat.Encoding.ALAW) ) { + waveType = WAVE_FORMAT_ALAW; + } else if( encoding.equals(AudioFormat.Encoding.ULAW) ) { + waveType = WAVE_FORMAT_MULAW; + } else if( encoding.equals(AudioFormat.Encoding.PCM_SIGNED) || + encoding.equals(AudioFormat.Encoding.PCM_UNSIGNED) ) { + waveType = WAVE_FORMAT_PCM; + } else { + waveType = WAVE_FORMAT_UNKNOWN; + } + } + + int getWaveType() { + + return waveType; + } + + int getHeaderSize() { + return getHeaderSize(getWaveType()); + } + + static int getHeaderSize(int waveType) { + //$$fb 2002-04-16: Fix for 4636355: RIFF audio headers could be _more_ spec compliant + // use dynamic format chunk size + return STANDARD_HEADER_SIZE + getFmtChunkSize(waveType); + } + + static int getFmtChunkSize(int waveType) { + //$$fb 2002-04-16: Fix for 4636355: RIFF audio headers could be _more_ spec compliant + // add 2 bytes for "codec specific data length" for non-PCM codecs + int result = STANDARD_FMT_CHUNK_SIZE; + if (waveType != WAVE_FORMAT_PCM) { + result += 2; // WORD for "codec specific data length" + } + return result; + } +}