| /* An audio format |
| Copyright (C) 2005 Free Software Foundation, Inc. |
| |
| This file is part of GNU Classpath. |
| |
| GNU Classpath is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| GNU Classpath 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 for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Classpath; see the file COPYING. If not, write to the |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| 02110-1301 USA. |
| |
| Linking this library statically or dynamically with other modules is |
| making a combined work based on this library. Thus, the terms and |
| conditions of the GNU General Public License cover the whole |
| combination. |
| |
| As a special exception, the copyright holders of this library give you |
| permission to link this library with independent modules to produce an |
| executable, regardless of the license terms of these independent |
| modules, and to copy and distribute the resulting executable under |
| terms of your choice, provided that you also meet, for each linked |
| independent module, the terms and conditions of the license of that |
| module. An independent module is a module which is not derived from |
| or based on this library. If you modify this library, you may extend |
| this exception to your version of the library, but you are not |
| obligated to do so. If you do not wish to do so, delete this |
| exception statement from your version. */ |
| |
| |
| package javax.sound.sampled; |
| |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| /** |
| * This class describes an audio format, including its encoding, |
| * the number of channels, its frame rate, etc. |
| * @since 1.3 |
| */ |
| public class AudioFormat |
| { |
| /** |
| * This describes a given audio format encoding. |
| * @since 1.3 |
| */ |
| public static class Encoding |
| { |
| /** The ALAW encoding. */ |
| public static final Encoding ALAW = new Encoding("alaw"); |
| |
| /** The signed PCM encoding. */ |
| public static final Encoding PCM_SIGNED = new Encoding("pcm_signed"); |
| |
| /** The unsigned PCM encoding. */ |
| public static final Encoding PCM_UNSIGNED = new Encoding("pcm_unsigned"); |
| |
| /** The ULAW encoding. */ |
| public static final Encoding ULAW = new Encoding("ulaw"); |
| |
| private String name; |
| |
| /** |
| * Create a new encoding descriptor, given its name. |
| * @param name the name |
| */ |
| public Encoding(String name) |
| { |
| this.name = name; |
| } |
| |
| public final boolean equals(Object o) |
| { |
| return super.equals(o); |
| } |
| |
| public final int hashCode() |
| { |
| return super.hashCode(); |
| } |
| |
| /** |
| * Return the name of this encoding. |
| */ |
| public final String toString() |
| { |
| return name; |
| } |
| } |
| |
| /** |
| * True if the audio data is stored big-endian. |
| */ |
| protected boolean bigEndian; |
| |
| /** |
| * The number of channels of data in this format. |
| */ |
| protected int channels; |
| |
| /** |
| * The encoding of this format. |
| */ |
| protected Encoding encoding; |
| |
| /** |
| * The frame rate of this format. This is the number of frames |
| * per second. |
| */ |
| protected float frameRate; |
| |
| /** |
| * The number of bytes per frame in this format. |
| */ |
| protected int frameSize; |
| |
| /** |
| * The number of samples per second. |
| */ |
| protected float sampleRate; |
| |
| /** |
| * The number of bits in each sample. |
| */ |
| protected int sampleSizeInBits; |
| |
| private Map properties; |
| |
| /** |
| * Create a new audio format, given various attributes of it. |
| * The properties map for this format will be empty. |
| * |
| * @param encoding the encoding for this format |
| * @param sampleRate the sample rate |
| * @param sampleSizeInBits the sample size, in bits |
| * @param channels the number of channels |
| * @param frameSize the frame size, in bytes |
| * @param frameRate the frame rate, in frames per second |
| * @param bigEndian true if the data is stored big-endian |
| */ |
| public AudioFormat(Encoding encoding, float sampleRate, int sampleSizeInBits, |
| int channels, int frameSize, float frameRate, |
| boolean bigEndian) |
| { |
| this.encoding = encoding; |
| this.sampleRate = sampleRate; |
| this.sampleSizeInBits = sampleSizeInBits; |
| this.channels = channels; |
| this.frameSize = frameSize; |
| this.frameRate = frameRate; |
| this.bigEndian = bigEndian; |
| this.properties = Collections.EMPTY_MAP; |
| } |
| |
| /** |
| * Create a new audio format, given various attributes of it. |
| * The properties map is copied by this constructor, so changes |
| * to the argument Map will not affect the new object. |
| * |
| * @param encoding the encoding for this format |
| * @param sampleRate the sample rate |
| * @param sampleSizeInBits the sample size, in bits |
| * @param channels the number of channels |
| * @param frameSize the frame size, in bytes |
| * @param frameRate the frame rate, in frames per second |
| * @param bigEndian true if the data is stored big-endian |
| * @param properties a map describing properties of this format |
| */ |
| public AudioFormat(Encoding encoding, float sampleRate, int sampleSizeInBits, |
| int channels, int frameSize, float frameRate, |
| boolean bigEndian, Map properties) |
| { |
| this.encoding = encoding; |
| this.sampleRate = sampleRate; |
| this.sampleSizeInBits = sampleSizeInBits; |
| this.channels = channels; |
| this.frameSize = frameSize; |
| this.frameRate = frameRate; |
| this.bigEndian = bigEndian; |
| this.properties = Collections.unmodifiableMap(new HashMap(properties)); |
| } |
| |
| /** |
| * Create a new PCM-based audio format, given various attributes of it. |
| * The encoding will either be Encoding#PCM_SIGNED or Encoding#PCM_UNSIGNED. |
| * The frame size for this format will be derived from the sample size in |
| * bits and the number of channels, unless one of those is |
| * AudioSystem#NOT_SPECIFIED. The frame rate will be the same as the sample |
| * rate, and the properties map will be empty. |
| * |
| * @param sampleRate the sample rate |
| * @param sampleSizeInBits the sample size, in bits |
| * @param channels the number of channels |
| * @param signed true if this is a signed encoding |
| * @param bigEndian true if the data is stored big-endian |
| */ |
| public AudioFormat(float sampleRate, int sampleSizeInBits, |
| int channels, boolean signed, boolean bigEndian) |
| { |
| this.encoding = signed ? Encoding.PCM_SIGNED : Encoding.PCM_UNSIGNED; |
| this.sampleRate = sampleRate; |
| this.sampleSizeInBits = sampleSizeInBits; |
| this.channels = channels; |
| // It isn't clear whether channels can be NOT_SPECIFIED. |
| if (sampleSizeInBits == AudioSystem.NOT_SPECIFIED |
| || channels == AudioSystem.NOT_SPECIFIED) |
| this.frameSize = AudioSystem.NOT_SPECIFIED; |
| else |
| this.frameSize = (sampleSizeInBits + 7) / 8 * channels; |
| this.frameRate = sampleRate; |
| this.bigEndian = bigEndian; |
| this.properties = Collections.EMPTY_MAP; |
| } |
| |
| /** |
| * Return the number of channels in this format. |
| */ |
| public int getChannels() |
| { |
| return channels; |
| } |
| |
| /** |
| * Return the encoding of this format. |
| */ |
| public Encoding getEncoding() |
| { |
| return encoding; |
| } |
| |
| /** |
| * Return the frame rate of this format. |
| */ |
| public float getFrameRate() |
| { |
| return frameRate; |
| } |
| |
| /** |
| * Return the frame size of this format. |
| */ |
| public int getFrameSize() |
| { |
| return frameSize; |
| } |
| |
| /** |
| * Given a key, return a property associated with this format; |
| * or null if this property is not set. |
| * @param key the name of the property |
| * @return the value of the property, or null if the property is not set |
| */ |
| public Object getProperty(String key) |
| { |
| return properties.get(key); |
| } |
| |
| /** |
| * Return the sample rate of this format. |
| */ |
| public float getSampleRate() |
| { |
| return sampleRate; |
| } |
| |
| /** |
| * Return the sample size of this format, in bits. |
| */ |
| public int getSampleSizeInBits() |
| { |
| return sampleSizeInBits; |
| } |
| |
| /** |
| * Return true if this format is big endian, false otherwise. |
| * This only matters for formats whose sample size is greater than |
| * one byte. |
| */ |
| public boolean isBigEndian() |
| { |
| return bigEndian; |
| } |
| |
| /** |
| * Return true if this audio format matches another. |
| * @param fmt the format to match against |
| * @return true if they match, false otherwise |
| */ |
| public boolean matches(AudioFormat fmt) |
| { |
| if (! encoding.equals(fmt.encoding) |
| || channels != fmt.channels |
| || sampleSizeInBits != fmt.sampleSizeInBits |
| || frameSize != fmt.frameSize) |
| return false; |
| if (sampleRate != AudioSystem.NOT_SPECIFIED |
| && fmt.sampleRate != AudioSystem.NOT_SPECIFIED |
| && sampleRate != fmt.sampleRate) |
| return false; |
| if (frameRate != AudioSystem.NOT_SPECIFIED |
| && fmt.frameRate != AudioSystem.NOT_SPECIFIED |
| && frameRate != fmt.frameRate) |
| return false; |
| if (sampleSizeInBits > 8) |
| return bigEndian == fmt.bigEndian; |
| return true; |
| } |
| |
| /** |
| * Return a read-only Map holding the properties associated with |
| * this format. |
| */ |
| public Map properties() |
| { |
| return properties; |
| } |
| |
| /** |
| * Return a description of this format. |
| */ |
| public String toString() |
| { |
| StringBuffer result = new StringBuffer(); |
| result.append(encoding); |
| result.append(" "); |
| result.append(sampleRate); |
| result.append(" Hz "); |
| result.append(sampleSizeInBits); |
| result.append(" bits "); |
| result.append(channels); |
| result.append(" channels"); |
| if (sampleSizeInBits > 8) |
| result.append(bigEndian ? " big endian" : " little endian"); |
| return result.toString(); |
| } |
| } |