/* |
|
* Copyright (c) 1999, 2013, 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 |
|
* under the terms of the GNU General Public License version 2 only, as |
|
* published by the Free Software Foundation. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
package javax.sound.sampled; |
|
import java.util.Collections; |
|
import java.util.HashMap; |
|
import java.util.Map; |
|
/** |
|
* <code>AudioFormat</code> is the class that specifies a particular arrangement of data in a sound stream. |
|
* By examining the information stored in the audio format, you can discover how to interpret the bits in the |
|
* binary sound data. |
|
* <p> |
|
* Every data line has an audio format associated with its data stream. The audio format of a source (playback) data line indicates |
|
* what kind of data the data line expects to receive for output. For a target (capture) data line, the audio format specifies the kind |
|
* of the data that can be read from the line. |
|
* Sound files also have audio formats, of course. The <code>{@link AudioFileFormat}</code> |
|
* class encapsulates an <code>AudioFormat</code> in addition to other, |
|
* file-specific information. Similarly, an <code>{@link AudioInputStream}</code> has an |
|
* <code>AudioFormat</code>. |
|
* <p> |
|
* The <code>AudioFormat</code> class accommodates a number of common sound-file encoding techniques, including |
|
* pulse-code modulation (PCM), mu-law encoding, and a-law encoding. These encoding techniques are predefined, |
|
* but service providers can create new encoding types. |
|
* The encoding that a specific format uses is named by its <code>encoding</code> field. |
|
*<p> |
|
* In addition to the encoding, the audio format includes other properties that further specify the exact |
|
* arrangement of the data. |
|
* These include the number of channels, sample rate, sample size, byte order, frame rate, and frame size. |
|
* Sounds may have different numbers of audio channels: one for mono, two for stereo. |
|
* The sample rate measures how many "snapshots" (samples) of the sound pressure are taken per second, per channel. |
|
* (If the sound is stereo rather than mono, two samples are actually measured at each instant of time: one for the left channel, |
|
* and another for the right channel; however, the sample rate still measures the number per channel, so the rate is the same |
|
* regardless of the number of channels. This is the standard use of the term.) |
|
* The sample size indicates how many bits are used to store each snapshot; 8 and 16 are typical values. |
|
* For 16-bit samples (or any other sample size larger than a byte), |
|
* byte order is important; the bytes in each sample are arranged in |
|
* either the "little-endian" or "big-endian" style. |
|
* For encodings like PCM, a frame consists of the set of samples for all channels at a given |
|
* point in time, and so the size of a frame (in bytes) is always equal to the size of a sample (in bytes) times |
|
* the number of channels. However, with some other sorts of encodings a frame can contain |
|
* a bundle of compressed data for a whole series of samples, as well as additional, non-sample |
|
* data. For such encodings, the sample rate and sample size refer to the data after it is decoded into PCM, |
|
* and so they are completely different from the frame rate and frame size. |
|
* |
|
* <p>An <code>AudioFormat</code> object can include a set of |
|
* properties. A property is a pair of key and value: the key |
|
* is of type <code>String</code>, the associated property |
|
* value is an arbitrary object. Properties specify |
|
* additional format specifications, like the bit rate for |
|
* compressed formats. Properties are mainly used as a means |
|
* to transport additional information of the audio format |
|
* to and from the service providers. Therefore, properties |
|
* are ignored in the {@link #matches(AudioFormat)} method. |
|
* However, methods which rely on the installed service |
|
* providers, like {@link AudioSystem#isConversionSupported |
|
* (AudioFormat, AudioFormat) isConversionSupported} may consider |
|
* properties, depending on the respective service provider |
|
* implementation. |
|
* |
|
* <p>The following table lists some common properties which |
|
* service providers should use, if applicable: |
|
* |
|
* <table border=0> |
|
* <caption>Audio Format Properties</caption> |
|
* <tr> |
|
* <th>Property key</th> |
|
* <th>Value type</th> |
|
* <th>Description</th> |
|
* </tr> |
|
* <tr> |
|
* <td>"bitrate"</td> |
|
* <td>{@link java.lang.Integer Integer}</td> |
|
* <td>average bit rate in bits per second</td> |
|
* </tr> |
|
* <tr> |
|
* <td>"vbr"</td> |
|
* <td>{@link java.lang.Boolean Boolean}</td> |
|
* <td><code>true</code>, if the file is encoded in variable bit |
|
* rate (VBR)</td> |
|
* </tr> |
|
* <tr> |
|
* <td>"quality"</td> |
|
* <td>{@link java.lang.Integer Integer}</td> |
|
* <td>encoding/conversion quality, 1..100</td> |
|
* </tr> |
|
* </table> |
|
* |
|
* <p>Vendors of service providers (plugins) are encouraged |
|
* to seek information about other already established |
|
* properties in third party plugins, and follow the same |
|
* conventions. |
|
* |
|
* @author Kara Kytle |
|
* @author Florian Bomers |
|
* @see DataLine#getFormat |
|
* @see AudioInputStream#getFormat |
|
* @see AudioFileFormat |
|
* @see javax.sound.sampled.spi.FormatConversionProvider |
|
* @since 1.3 |
|
*/ |
|
public class AudioFormat { |
|
// INSTANCE VARIABLES |
|
/** |
|
* The audio encoding technique used by this format. |
|
*/ |
|
protected Encoding encoding; |
|
/** |
|
* The number of samples played or recorded per second, for sounds that have this format. |
|
*/ |
|
protected float sampleRate; |
|
/** |
|
* The number of bits in each sample of a sound that has this format. |
|
*/ |
|
protected int sampleSizeInBits; |
|
/** |
|
* The number of audio channels in this format (1 for mono, 2 for stereo). |
|
*/ |
|
protected int channels; |
|
/** |
|
* The number of bytes in each frame of a sound that has this format. |
|
*/ |
|
protected int frameSize; |
|
/** |
|
* The number of frames played or recorded per second, for sounds that have this format. |
|
*/ |
|
protected float frameRate; |
|
/** |
|
* Indicates whether the audio data is stored in big-endian or little-endian order. |
|
*/ |
|
protected boolean bigEndian; |
|
/** The set of properties */ |
|
private HashMap<String, Object> properties; |
|
/** |
|
* Constructs an <code>AudioFormat</code> with the given parameters. |
|
* The encoding specifies the convention used to represent the data. |
|
* The other parameters are further explained in the {@link AudioFormat |
|
* class description}. |
|
* @param encoding the audio encoding technique |
|
* @param sampleRate the number of samples per second |
|
* @param sampleSizeInBits the number of bits in each sample |
|
* @param channels the number of channels (1 for mono, 2 for stereo, and so on) |
|
* @param frameSize the number of bytes in each frame |
|
* @param frameRate the number of frames per second |
|
* @param bigEndian indicates whether the data for a single sample |
|
* is stored in big-endian byte order (<code>false</code> |
|
* means little-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 = null; |
|
} |
|
/** |
|
* Constructs an <code>AudioFormat</code> with the given parameters. |
|
* The encoding specifies the convention used to represent the data. |
|
* The other parameters are further explained in the {@link AudioFormat |
|
* class description}. |
|
* @param encoding the audio encoding technique |
|
* @param sampleRate the number of samples per second |
|
* @param sampleSizeInBits the number of bits in each sample |
|
* @param channels the number of channels (1 for mono, 2 for |
|
* stereo, and so on) |
|
* @param frameSize the number of bytes in each frame |
|
* @param frameRate the number of frames per second |
|
* @param bigEndian indicates whether the data for a single sample |
|
* is stored in big-endian byte order |
|
* (<code>false</code> means little-endian) |
|
* @param properties a <code>Map<String,Object></code> object |
|
* containing format properties |
|
* |
|
* @since 1.5 |
|
*/ |
|
public AudioFormat(Encoding encoding, float sampleRate, |
|
int sampleSizeInBits, int channels, |
|
int frameSize, float frameRate, |
|
boolean bigEndian, Map<String, Object> properties) { |
|
this(encoding, sampleRate, sampleSizeInBits, channels, |
|
frameSize, frameRate, bigEndian); |
|
this.properties = new HashMap<String, Object>(properties); |
|
} |
|
/** |
|
* Constructs an <code>AudioFormat</code> with a linear PCM encoding and |
|
* the given parameters. The frame size is set to the number of bytes |
|
* required to contain one sample from each channel, and the frame rate |
|
* is set to the sample rate. |
|
* |
|
* @param sampleRate the number of samples per second |
|
* @param sampleSizeInBits the number of bits in each sample |
|
* @param channels the number of channels (1 for mono, 2 for stereo, and so on) |
|
* @param signed indicates whether the data is signed or unsigned |
|
* @param bigEndian indicates whether the data for a single sample |
|
* is stored in big-endian byte order (<code>false</code> |
|
* means little-endian) |
|
*/ |
|
public AudioFormat(float sampleRate, int sampleSizeInBits, |
|
int channels, boolean signed, boolean bigEndian) { |
|
this((signed == true ? Encoding.PCM_SIGNED : Encoding.PCM_UNSIGNED), |
|
sampleRate, |
|
sampleSizeInBits, |
|
channels, |
|
(channels == AudioSystem.NOT_SPECIFIED || sampleSizeInBits == AudioSystem.NOT_SPECIFIED)? |
|
AudioSystem.NOT_SPECIFIED: |
|
((sampleSizeInBits + 7) / 8) * channels, |
|
sampleRate, |
|
bigEndian); |
|
} |
|
/** |
|
* Obtains the type of encoding for sounds in this format. |
|
* |
|
* @return the encoding type |
|
* @see Encoding#PCM_SIGNED |
|
* @see Encoding#PCM_UNSIGNED |
|
* @see Encoding#ULAW |
|
* @see Encoding#ALAW |
|
*/ |
|
public Encoding getEncoding() { |
|
return encoding; |
|
} |
|
/** |
|
* Obtains the sample rate. |
|
* For compressed formats, the return value is the sample rate of the uncompressed |
|
* audio data. |
|
* When this AudioFormat is used for queries (e.g. {@link |
|
* AudioSystem#isConversionSupported(AudioFormat, AudioFormat) |
|
* AudioSystem.isConversionSupported}) or capabilities (e.g. {@link |
|
* DataLine.Info#getFormats() DataLine.Info.getFormats}), a sample rate of |
|
* <code>AudioSystem.NOT_SPECIFIED</code> means that any sample rate is |
|
* acceptable. <code>AudioSystem.NOT_SPECIFIED</code> is also returned when |
|
* the sample rate is not defined for this audio format. |
|
* @return the number of samples per second, |
|
* or <code>AudioSystem.NOT_SPECIFIED</code> |
|
* |
|
* @see #getFrameRate() |
|
* @see AudioSystem#NOT_SPECIFIED |
|
*/ |
|
public float getSampleRate() { |
|
return sampleRate; |
|
} |
|
/** |
|
* Obtains the size of a sample. |
|
* For compressed formats, the return value is the sample size of the |
|
* uncompressed audio data. |
|
* When this AudioFormat is used for queries (e.g. {@link |
|
* AudioSystem#isConversionSupported(AudioFormat, AudioFormat) |
|
* AudioSystem.isConversionSupported}) or capabilities (e.g. {@link |
|
* DataLine.Info#getFormats() DataLine.Info.getFormats}), a sample size of |
|
* <code>AudioSystem.NOT_SPECIFIED</code> means that any sample size is |
|
* acceptable. <code>AudioSystem.NOT_SPECIFIED</code> is also returned when |
|
* the sample size is not defined for this audio format. |
|
* @return the number of bits in each sample, |
|
* or <code>AudioSystem.NOT_SPECIFIED</code> |
|
* |
|
* @see #getFrameSize() |
|
* @see AudioSystem#NOT_SPECIFIED |
|
*/ |
|
public int getSampleSizeInBits() { |
|
return sampleSizeInBits; |
|
} |
|
/** |
|
* Obtains the number of channels. |
|
* When this AudioFormat is used for queries (e.g. {@link |
|
* AudioSystem#isConversionSupported(AudioFormat, AudioFormat) |
|
* AudioSystem.isConversionSupported}) or capabilities (e.g. {@link |
|
* DataLine.Info#getFormats() DataLine.Info.getFormats}), a return value of |
|
* <code>AudioSystem.NOT_SPECIFIED</code> means that any (positive) number of channels is |
|
* acceptable. |
|
* @return The number of channels (1 for mono, 2 for stereo, etc.), |
|
* or <code>AudioSystem.NOT_SPECIFIED</code> |
|
* |
|
* @see AudioSystem#NOT_SPECIFIED |
|
*/ |
|
public int getChannels() { |
|
return channels; |
|
} |
|
/** |
|
* Obtains the frame size in bytes. |
|
* When this AudioFormat is used for queries (e.g. {@link |
|
* AudioSystem#isConversionSupported(AudioFormat, AudioFormat) |
|
* AudioSystem.isConversionSupported}) or capabilities (e.g. {@link |
|
* DataLine.Info#getFormats() DataLine.Info.getFormats}), a frame size of |
|
* <code>AudioSystem.NOT_SPECIFIED</code> means that any frame size is |
|
* acceptable. <code>AudioSystem.NOT_SPECIFIED</code> is also returned when |
|
* the frame size is not defined for this audio format. |
|
* @return the number of bytes per frame, |
|
* or <code>AudioSystem.NOT_SPECIFIED</code> |
|
* |
|
* @see #getSampleSizeInBits() |
|
* @see AudioSystem#NOT_SPECIFIED |
|
*/ |
|
public int getFrameSize() { |
|
return frameSize; |
|
} |
|
/** |
|
* Obtains the frame rate in frames per second. |
|
* When this AudioFormat is used for queries (e.g. {@link |
|
* AudioSystem#isConversionSupported(AudioFormat, AudioFormat) |
|
* AudioSystem.isConversionSupported}) or capabilities (e.g. {@link |
|
* DataLine.Info#getFormats() DataLine.Info.getFormats}), a frame rate of |
|
* <code>AudioSystem.NOT_SPECIFIED</code> means that any frame rate is |
|
* acceptable. <code>AudioSystem.NOT_SPECIFIED</code> is also returned when |
|
* the frame rate is not defined for this audio format. |
|
* @return the number of frames per second, |
|
* or <code>AudioSystem.NOT_SPECIFIED</code> |
|
* |
|
* @see #getSampleRate() |
|
* @see AudioSystem#NOT_SPECIFIED |
|
*/ |
|
public float getFrameRate() { |
|
return frameRate; |
|
} |
|
/** |
|
* Indicates whether the audio data is stored in big-endian or little-endian |
|
* byte order. If the sample size is not more than one byte, the return value is |
|
* irrelevant. |
|
* @return <code>true</code> if the data is stored in big-endian byte order, |
|
* <code>false</code> if little-endian |
|
*/ |
|
public boolean isBigEndian() { |
|
return bigEndian; |
|
} |
|
/** |
|
* Obtain an unmodifiable map of properties. |
|
* The concept of properties is further explained in |
|
* the {@link AudioFileFormat class description}. |
|
* |
|
* @return a <code>Map<String,Object></code> object containing |
|
* all properties. If no properties are recognized, an empty map is |
|
* returned. |
|
* |
|
* @see #getProperty(String) |
|
* @since 1.5 |
|
*/ |
|
public Map<String,Object> properties() { |
|
Map<String,Object> ret; |
|
if (properties == null) { |
|
ret = new HashMap<String,Object>(0); |
|
} else { |
|
ret = (Map<String,Object>) (properties.clone()); |
|
} |
|
return (Map<String,Object>) Collections.unmodifiableMap(ret); |
|
} |
|
/** |
|
* Obtain the property value specified by the key. |
|
* The concept of properties is further explained in |
|
* the {@link AudioFileFormat class description}. |
|
* |
|
* <p>If the specified property is not defined for a |
|
* particular file format, this method returns |
|
* <code>null</code>. |
|
* |
|
* @param key the key of the desired property |
|
* @return the value of the property with the specified key, |
|
* or <code>null</code> if the property does not exist. |
|
* |
|
* @see #properties() |
|
* @since 1.5 |
|
*/ |
|
public Object getProperty(String key) { |
|
if (properties == null) { |
|
return null; |
|
} |
|
return properties.get(key); |
|
} |
|
/** |
|
* Indicates whether this format matches the one specified. |
|
* To match, two formats must have the same encoding, |
|
* and consistent values of the number of channels, sample rate, sample size, |
|
* frame rate, and frame size. |
|
* The values of the property are consistent if they are equal |
|
* or the specified format has the property value |
|
* {@code AudioSystem.NOT_SPECIFIED}. |
|
* The byte order (big-endian or little-endian) must be the same |
|
* if the sample size is greater than one byte. |
|
* |
|
* @param format format to test for match |
|
* @return {@code true} if this format matches the one specified, |
|
* {@code false} otherwise. |
|
*/ |
|
public boolean matches(AudioFormat format) { |
|
if (format.getEncoding().equals(getEncoding()) |
|
&& (format.getChannels() == AudioSystem.NOT_SPECIFIED |
|
|| format.getChannels() == getChannels()) |
|
&& (format.getSampleRate() == (float)AudioSystem.NOT_SPECIFIED |
|
|| format.getSampleRate() == getSampleRate()) |
|
&& (format.getSampleSizeInBits() == AudioSystem.NOT_SPECIFIED |
|
|| format.getSampleSizeInBits() == getSampleSizeInBits()) |
|
&& (format.getFrameRate() == (float)AudioSystem.NOT_SPECIFIED |
|
|| format.getFrameRate() == getFrameRate()) |
|
&& (format.getFrameSize() == AudioSystem.NOT_SPECIFIED |
|
|| format.getFrameSize() == getFrameSize()) |
|
&& (getSampleSizeInBits() <= 8 |
|
|| format.isBigEndian() == isBigEndian())) { |
|
return true; |
|
} |
|
return false; |
|
} |
|
/** |
|
* Returns a string that describes the format, such as: |
|
* "PCM SIGNED 22050 Hz 16 bit mono big-endian". The contents of the string |
|
* may vary between implementations of Java Sound. |
|
* |
|
* @return a string that describes the format parameters |
|
*/ |
|
public String toString() { |
|
String sEncoding = ""; |
|
if (getEncoding() != null) { |
|
sEncoding = getEncoding().toString() + " "; |
|
} |
|
String sSampleRate; |
|
if (getSampleRate() == (float) AudioSystem.NOT_SPECIFIED) { |
|
sSampleRate = "unknown sample rate, "; |
|
} else { |
|
sSampleRate = "" + getSampleRate() + " Hz, "; |
|
} |
|
String sSampleSizeInBits; |
|
if (getSampleSizeInBits() == (float) AudioSystem.NOT_SPECIFIED) { |
|
sSampleSizeInBits = "unknown bits per sample, "; |
|
} else { |
|
sSampleSizeInBits = "" + getSampleSizeInBits() + " bit, "; |
|
} |
|
String sChannels; |
|
if (getChannels() == 1) { |
|
sChannels = "mono, "; |
|
} else |
|
if (getChannels() == 2) { |
|
sChannels = "stereo, "; |
|
} else { |
|
if (getChannels() == AudioSystem.NOT_SPECIFIED) { |
|
sChannels = " unknown number of channels, "; |
|
} else { |
|
sChannels = ""+getChannels()+" channels, "; |
|
} |
|
} |
|
String sFrameSize; |
|
if (getFrameSize() == (float) AudioSystem.NOT_SPECIFIED) { |
|
sFrameSize = "unknown frame size, "; |
|
} else { |
|
sFrameSize = "" + getFrameSize()+ " bytes/frame, "; |
|
} |
|
String sFrameRate = ""; |
|
if (Math.abs(getSampleRate() - getFrameRate()) > 0.00001) { |
|
if (getFrameRate() == (float) AudioSystem.NOT_SPECIFIED) { |
|
sFrameRate = "unknown frame rate, "; |
|
} else { |
|
sFrameRate = getFrameRate() + " frames/second, "; |
|
} |
|
} |
|
String sEndian = ""; |
|
if ((getEncoding().equals(Encoding.PCM_SIGNED) |
|
|| getEncoding().equals(Encoding.PCM_UNSIGNED)) |
|
&& ((getSampleSizeInBits() > 8) |
|
|| (getSampleSizeInBits() == AudioSystem.NOT_SPECIFIED))) { |
|
if (isBigEndian()) { |
|
sEndian = "big-endian"; |
|
} else { |
|
sEndian = "little-endian"; |
|
} |
|
} |
|
return sEncoding |
|
+ sSampleRate |
|
+ sSampleSizeInBits |
|
+ sChannels |
|
+ sFrameSize |
|
+ sFrameRate |
|
+ sEndian; |
|
} |
|
/** |
|
* The <code>Encoding</code> class names the specific type of data representation |
|
* used for an audio stream. The encoding includes aspects of the |
|
* sound format other than the number of channels, sample rate, sample size, |
|
* frame rate, frame size, and byte order. |
|
* <p> |
|
* One ubiquitous type of audio encoding is pulse-code modulation (PCM), |
|
* which is simply a linear (proportional) representation of the sound |
|
* waveform. With PCM, the number stored in each sample is proportional |
|
* to the instantaneous amplitude of the sound pressure at that point in |
|
* time. The numbers may be signed or unsigned integers or floats. |
|
* Besides PCM, other encodings include mu-law and a-law, which are nonlinear |
|
* mappings of the sound amplitude that are often used for recording speech. |
|
* <p> |
|
* You can use a predefined encoding by referring to one of the static |
|
* objects created by this class, such as PCM_SIGNED or |
|
* PCM_UNSIGNED. Service providers can create new encodings, such as |
|
* compressed audio formats, and make |
|
* these available through the <code>{@link AudioSystem}</code> class. |
|
* <p> |
|
* The <code>Encoding</code> class is static, so that all |
|
* <code>AudioFormat</code> objects that have the same encoding will refer |
|
* to the same object (rather than different instances of the same class). |
|
* This allows matches to be made by checking that two format's encodings |
|
* are equal. |
|
* |
|
* @see AudioFormat |
|
* @see javax.sound.sampled.spi.FormatConversionProvider |
|
* |
|
* @author Kara Kytle |
|
* @since 1.3 |
|
*/ |
|
public static class Encoding { |
|
// ENCODING DEFINES |
|
/** |
|
* Specifies signed, linear PCM data. |
|
*/ |
|
public static final Encoding PCM_SIGNED = new Encoding("PCM_SIGNED"); |
|
/** |
|
* Specifies unsigned, linear PCM data. |
|
*/ |
|
public static final Encoding PCM_UNSIGNED = new Encoding("PCM_UNSIGNED"); |
|
/** |
|
* Specifies floating-point PCM data. |
|
* |
|
* @since 1.7 |
|
*/ |
|
public static final Encoding PCM_FLOAT = new Encoding("PCM_FLOAT"); |
|
/** |
|
* Specifies u-law encoded data. |
|
*/ |
|
public static final Encoding ULAW = new Encoding("ULAW"); |
|
/** |
|
* Specifies a-law encoded data. |
|
*/ |
|
public static final Encoding ALAW = new Encoding("ALAW"); |
|
// INSTANCE VARIABLES |
|
/** |
|
* Encoding name. |
|
*/ |
|
private String name; |
|
// CONSTRUCTOR |
|
/** |
|
* Constructs a new encoding. |
|
* @param name the name of the new type of encoding |
|
*/ |
|
public Encoding(String name) { |
|
this.name = name; |
|
} |
|
// METHODS |
|
/** |
|
* Finalizes the equals method |
|
*/ |
|
public final boolean equals(Object obj) { |
|
if (toString() == null) { |
|
return (obj != null) && (obj.toString() == null); |
|
} |
|
if (obj instanceof Encoding) { |
|
return toString().equals(obj.toString()); |
|
} |
|
return false; |
|
} |
|
/** |
|
* Finalizes the hashCode method |
|
*/ |
|
public final int hashCode() { |
|
if (toString() == null) { |
|
return 0; |
|
} |
|
return toString().hashCode(); |
|
} |
|
/** |
|
* Provides the <code>String</code> representation of the encoding. This <code>String</code> is |
|
* the same name that was passed to the constructor. For the predefined encodings, the name |
|
* is similar to the encoding's variable (field) name. For example, <code>PCM_SIGNED.toString()</code> returns |
|
* the name "pcm_signed". |
|
* |
|
* @return the encoding name |
|
*/ |
|
public final String toString() { |
|
return name; |
|
} |
|
} // class Encoding |
|
} |