mirror of
https://github.com/autc04/Retro68.git
synced 2025-01-05 22:32:37 +00:00
757 lines
25 KiB
Java
757 lines
25 KiB
Java
/* Main interface to audio system
|
|
Copyright (C) 2005, 2012 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 gnu.classpath.ServiceFactory;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.OutputStream;
|
|
import java.net.URL;
|
|
import java.util.HashSet;
|
|
import java.util.Iterator;
|
|
|
|
import javax.sound.sampled.spi.AudioFileReader;
|
|
import javax.sound.sampled.spi.AudioFileWriter;
|
|
import javax.sound.sampled.spi.FormatConversionProvider;
|
|
import javax.sound.sampled.spi.MixerProvider;
|
|
|
|
/**
|
|
* This clas is the primary interface to the audio system. It contains
|
|
* a number of static methods which can be used to access this package's
|
|
* functionality.
|
|
*
|
|
* @since 1.3
|
|
*/
|
|
public class AudioSystem
|
|
{
|
|
/**
|
|
* A constant which can be passed to a number of methods in this package,
|
|
* to indicate an unspecified value.
|
|
*/
|
|
public static final int NOT_SPECIFIED = -1;
|
|
|
|
// This class is not instantiable.
|
|
private AudioSystem()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Return the file format of a given File.
|
|
* @param f the file to check
|
|
* @return the format of the file
|
|
* @throws UnsupportedAudioFileException if the file's format is not
|
|
* recognized
|
|
* @throws IOException if there is an I/O error reading the file
|
|
*/
|
|
public static AudioFileFormat getAudioFileFormat(File f)
|
|
throws UnsupportedAudioFileException, IOException
|
|
{
|
|
Iterator<AudioFileReader> i = ServiceFactory.lookupProviders(AudioFileReader.class);
|
|
while (i.hasNext())
|
|
{
|
|
AudioFileReader reader = i.next();
|
|
try
|
|
{
|
|
return reader.getAudioFileFormat(f);
|
|
}
|
|
catch (UnsupportedAudioFileException _)
|
|
{
|
|
// Try the next provider.
|
|
}
|
|
}
|
|
throw new UnsupportedAudioFileException("file type not recognized");
|
|
}
|
|
|
|
/**
|
|
* Return the file format of a given input stream.
|
|
* @param is the input stream to check
|
|
* @return the format of the stream
|
|
* @throws UnsupportedAudioFileException if the stream's format is not
|
|
* recognized
|
|
* @throws IOException if there is an I/O error reading the stream
|
|
*/
|
|
public static AudioFileFormat getAudioFileFormat(InputStream is)
|
|
throws UnsupportedAudioFileException, IOException
|
|
{
|
|
Iterator<AudioFileReader> i = ServiceFactory.lookupProviders(AudioFileReader.class);
|
|
while (i.hasNext())
|
|
{
|
|
AudioFileReader reader = i.next();
|
|
try
|
|
{
|
|
return reader.getAudioFileFormat(is);
|
|
}
|
|
catch (UnsupportedAudioFileException _)
|
|
{
|
|
// Try the next provider.
|
|
}
|
|
}
|
|
throw new UnsupportedAudioFileException("input stream type not recognized");
|
|
}
|
|
|
|
/**
|
|
* Return the file format of a given URL.
|
|
* @param url the URL to check
|
|
* @return the format of the URL
|
|
* @throws UnsupportedAudioFileException if the URL's format is not
|
|
* recognized
|
|
* @throws IOException if there is an I/O error reading the URL
|
|
*/
|
|
public static AudioFileFormat getAudioFileFormat(URL url)
|
|
throws UnsupportedAudioFileException, IOException
|
|
{
|
|
Iterator<AudioFileReader> i = ServiceFactory.lookupProviders(AudioFileReader.class);
|
|
while (i.hasNext())
|
|
{
|
|
AudioFileReader reader = i.next();
|
|
try
|
|
{
|
|
return reader.getAudioFileFormat(url);
|
|
}
|
|
catch (UnsupportedAudioFileException _)
|
|
{
|
|
// Try the next provider.
|
|
}
|
|
}
|
|
throw new UnsupportedAudioFileException("URL type not recognized");
|
|
}
|
|
|
|
/**
|
|
* Return an array of all the supported AudioFileFormat types.
|
|
* @return an array of unique types
|
|
*/
|
|
public static AudioFileFormat.Type[] getAudioFileTypes()
|
|
{
|
|
HashSet<AudioFileFormat.Type> result
|
|
= new HashSet<AudioFileFormat.Type>();
|
|
Iterator<AudioFileWriter> i = ServiceFactory.lookupProviders(AudioFileWriter.class);
|
|
while (i.hasNext())
|
|
{
|
|
AudioFileWriter writer = i.next();
|
|
AudioFileFormat.Type[] types = writer.getAudioFileTypes();
|
|
for (int j = 0; j < types.length; ++j)
|
|
result.add(types[j]);
|
|
}
|
|
return result.toArray(new AudioFileFormat.Type[result.size()]);
|
|
}
|
|
|
|
/**
|
|
* Return an array of all the supported AudioFileFormat types which match the
|
|
* given audio input stream
|
|
* @param ais the audio input stream
|
|
* @return an array of unique types
|
|
*/
|
|
public static AudioFileFormat.Type[] getAudioFileTypes(AudioInputStream ais)
|
|
{
|
|
HashSet<AudioFileFormat.Type> result
|
|
= new HashSet<AudioFileFormat.Type>();
|
|
Iterator<AudioFileWriter> i = ServiceFactory.lookupProviders(AudioFileWriter.class);
|
|
while (i.hasNext())
|
|
{
|
|
AudioFileWriter writer = i.next();
|
|
AudioFileFormat.Type[] types = writer.getAudioFileTypes(ais);
|
|
for (int j = 0; j < types.length; ++j)
|
|
result.add(types[j]);
|
|
}
|
|
return result.toArray(new AudioFileFormat.Type[result.size()]);
|
|
}
|
|
|
|
/**
|
|
* Given an audio input stream, this will try to create a new audio input
|
|
* stream whose encoding matches the given target encoding. If no provider
|
|
* offers this conversion, an exception is thrown.
|
|
* @param targ the target encoding
|
|
* @param ais the original audio stream
|
|
* @return a new audio stream
|
|
* @throws IllegalArgumentException if the conversion cannot be made
|
|
*/
|
|
public static AudioInputStream getAudioInputStream(AudioFormat.Encoding targ,
|
|
AudioInputStream ais)
|
|
{
|
|
Iterator<FormatConversionProvider> i =
|
|
ServiceFactory.lookupProviders(FormatConversionProvider.class);
|
|
while (i.hasNext())
|
|
{
|
|
FormatConversionProvider prov = i.next();
|
|
if (! prov.isConversionSupported(targ, ais.getFormat()))
|
|
continue;
|
|
return prov.getAudioInputStream(targ, ais);
|
|
}
|
|
throw new IllegalArgumentException("encoding not supported for stream");
|
|
}
|
|
|
|
/**
|
|
* Given an audio input stream, this will try to create a new audio input
|
|
* stream whose format matches the given target format. If no provider
|
|
* offers this conversion, an exception is thrown.
|
|
* @param targ the target format
|
|
* @param ais the original audio stream
|
|
* @return a new audio stream
|
|
* @throws IllegalArgumentException if the conversion cannot be made
|
|
*/
|
|
public static AudioInputStream getAudioInputStream(AudioFormat targ,
|
|
AudioInputStream ais)
|
|
{
|
|
Iterator<FormatConversionProvider> i =
|
|
ServiceFactory.lookupProviders(FormatConversionProvider.class);
|
|
while (i.hasNext())
|
|
{
|
|
FormatConversionProvider prov = i.next();
|
|
if (! prov.isConversionSupported(targ, ais.getFormat()))
|
|
continue;
|
|
return prov.getAudioInputStream(targ, ais);
|
|
}
|
|
throw new IllegalArgumentException("format not supported for stream");
|
|
}
|
|
|
|
/**
|
|
* Return an audio input stream for the file.
|
|
* @param f the file to read
|
|
* @return an audio input stream for the file
|
|
* @throws UnsupportedAudioFileException if the file's audio format is not
|
|
* recognized
|
|
* @throws IOException if there is an error while reading the file
|
|
*/
|
|
public static AudioInputStream getAudioInputStream(File f)
|
|
throws UnsupportedAudioFileException, IOException
|
|
{
|
|
Iterator<AudioFileReader> i = ServiceFactory.lookupProviders(AudioFileReader.class);
|
|
while (i.hasNext())
|
|
{
|
|
AudioFileReader reader = i.next();
|
|
try
|
|
{
|
|
return reader.getAudioInputStream(f);
|
|
}
|
|
catch (UnsupportedAudioFileException _)
|
|
{
|
|
// Try the next provider.
|
|
}
|
|
}
|
|
throw new UnsupportedAudioFileException("file type not recognized");
|
|
}
|
|
|
|
/**
|
|
* Return an audio input stream given an input stream.
|
|
* @param is the input stream
|
|
* @return an audio input stream
|
|
* @throws UnsupportedAudioFileException if the input stream's audio format
|
|
* is not supported by any of the installed providers
|
|
* @throws IOException if there is an error while reading the input stream
|
|
*/
|
|
public static AudioInputStream getAudioInputStream(InputStream is)
|
|
throws UnsupportedAudioFileException, IOException
|
|
{
|
|
Iterator<AudioFileReader> i = ServiceFactory.lookupProviders(AudioFileReader.class);
|
|
while (i.hasNext())
|
|
{
|
|
AudioFileReader reader = i.next();
|
|
try
|
|
{
|
|
return reader.getAudioInputStream(is);
|
|
}
|
|
catch (UnsupportedAudioFileException _)
|
|
{
|
|
// Try the next provider.
|
|
}
|
|
}
|
|
throw new UnsupportedAudioFileException("input stream type not recognized");
|
|
}
|
|
|
|
/**
|
|
* Return an audio input stream for the given URL.
|
|
* @param url the URL
|
|
* @return an audio input stream
|
|
* @throws UnsupportedAudioFileException if the URL's audio format is not
|
|
* supported by any of the installed providers
|
|
* @throws IOException if there is an error while reading the URL
|
|
*/
|
|
public static AudioInputStream getAudioInputStream(URL url)
|
|
throws UnsupportedAudioFileException, IOException
|
|
{
|
|
Iterator<AudioFileReader> i = ServiceFactory.lookupProviders(AudioFileReader.class);
|
|
while (i.hasNext())
|
|
{
|
|
AudioFileReader reader = i.next();
|
|
try
|
|
{
|
|
return reader.getAudioInputStream(url);
|
|
}
|
|
catch (UnsupportedAudioFileException _)
|
|
{
|
|
// Try the next provider.
|
|
}
|
|
}
|
|
throw new UnsupportedAudioFileException("URL type not recognized");
|
|
}
|
|
|
|
/**
|
|
* Return a new clip which can be used for playing back an audio stream.
|
|
* @throws LineUnavailableException if a clip is not available for some
|
|
* reason
|
|
* @throws SecurityException if a clip cannot be made for security reasons
|
|
* @since 1.5
|
|
*/
|
|
public static Clip getClip()
|
|
throws LineUnavailableException
|
|
{
|
|
Mixer.Info[] infos = getMixerInfo();
|
|
for (int i = 0; i < infos.length; ++i)
|
|
{
|
|
Mixer mix = getMixer(infos[i]);
|
|
Line[] lines = mix.getSourceLines();
|
|
for (int j = 0; j < lines.length; ++j)
|
|
{
|
|
if (lines[j] instanceof Clip)
|
|
return (Clip) lines[j];
|
|
}
|
|
}
|
|
throw new LineUnavailableException("no Clip available");
|
|
}
|
|
|
|
/**
|
|
* Return a new clip which can be used for playing back an audio stream.
|
|
* The clip is obtained from the indicated mixer.
|
|
* @param info the mixer to use
|
|
* @throws LineUnavailableException if a clip is not available for some
|
|
* reason
|
|
* @throws SecurityException if a clip cannot be made for security reasons
|
|
* @since 1.5
|
|
*/
|
|
public static Clip getClip(Mixer.Info info)
|
|
throws LineUnavailableException
|
|
{
|
|
Mixer mix = getMixer(info);
|
|
Line[] lines = mix.getSourceLines();
|
|
for (int j = 0; j < lines.length; ++j)
|
|
{
|
|
if (lines[j] instanceof Clip)
|
|
return (Clip) lines[j];
|
|
}
|
|
throw new LineUnavailableException("no Clip available");
|
|
}
|
|
|
|
/**
|
|
* Return a line matching the provided description. All the providers
|
|
* on the system are searched for a matching line.
|
|
* @param info description of the line
|
|
* @return the matching line
|
|
* @throws LineUnavailableException if no provider supplies a matching line
|
|
*/
|
|
public static Line getLine(Line.Info info) throws LineUnavailableException
|
|
{
|
|
Mixer.Info[] infos = getMixerInfo();
|
|
for (int i = 0; i < infos.length; ++i)
|
|
{
|
|
Mixer mix = getMixer(infos[i]);
|
|
try
|
|
{
|
|
return mix.getLine(info);
|
|
}
|
|
catch (LineUnavailableException _)
|
|
{
|
|
// Try the next provider.
|
|
}
|
|
}
|
|
throw new LineUnavailableException("no Clip available");
|
|
}
|
|
|
|
/**
|
|
* Return a mixer matching the provided description. All the providers
|
|
* on the system are searched for a matching mixer.
|
|
* @param info description of the mixer
|
|
* @return the matching mixer
|
|
* @throws IllegalArgumentException if no provider supplies a matching mixer
|
|
*/
|
|
public static Mixer getMixer(Mixer.Info info)
|
|
{
|
|
Iterator<MixerProvider> i = ServiceFactory.lookupProviders(MixerProvider.class);
|
|
while (i.hasNext())
|
|
{
|
|
MixerProvider prov = i.next();
|
|
if (prov.isMixerSupported(info))
|
|
return prov.getMixer(info);
|
|
}
|
|
throw new IllegalArgumentException("mixer not found");
|
|
}
|
|
|
|
/**
|
|
* Return an array of descriptions of all the mixers provided on the system.
|
|
*/
|
|
public static Mixer.Info[] getMixerInfo()
|
|
{
|
|
HashSet<Mixer.Info> result = new HashSet<Mixer.Info>();
|
|
Iterator<MixerProvider> i = ServiceFactory.lookupProviders(MixerProvider.class);
|
|
while (i.hasNext())
|
|
{
|
|
MixerProvider prov = i.next();
|
|
Mixer.Info[] is = prov.getMixerInfo();
|
|
for (int j = 0; j < is.length; ++j)
|
|
result.add(is[j]);
|
|
}
|
|
return result.toArray(new Mixer.Info[result.size()]);
|
|
}
|
|
|
|
/**
|
|
* Return a source data line matching the given audio format.
|
|
* @param fmt the audio format
|
|
* @throws LineUnavailableException if no source data line matching
|
|
* this format is available
|
|
* @since 1.5
|
|
*/
|
|
public static SourceDataLine getSourceDataLine(AudioFormat fmt)
|
|
throws LineUnavailableException
|
|
{
|
|
DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt);
|
|
Mixer.Info[] mixers = getMixerInfo();
|
|
for (int i = 0; i < mixers.length; ++i)
|
|
{
|
|
Mixer mix = getMixer(mixers[i]);
|
|
if (mix.isLineSupported(info))
|
|
return (SourceDataLine) mix.getLine(info);
|
|
}
|
|
throw new LineUnavailableException("source data line not found");
|
|
}
|
|
|
|
/**
|
|
* Return a target data line matching the given audio format.
|
|
* @param fmt the audio format
|
|
* @throws LineUnavailableException if no target data line matching
|
|
* this format is available
|
|
* @since 1.5
|
|
*/
|
|
public static SourceDataLine getSourceDataLine(AudioFormat fmt,
|
|
Mixer.Info mixer)
|
|
throws LineUnavailableException
|
|
{
|
|
DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt);
|
|
Mixer mix = getMixer(mixer);
|
|
if (mix.isLineSupported(info))
|
|
return (SourceDataLine) mix.getLine(info);
|
|
throw new LineUnavailableException("source data line not found");
|
|
}
|
|
|
|
/**
|
|
* Return an array of descriptions of all the source lines matching
|
|
* the given line description.
|
|
* @param info description of the lines to match
|
|
*/
|
|
public static Line.Info[] getSourceLineInfo(Line.Info info)
|
|
{
|
|
HashSet<Line.Info> result = new HashSet<Line.Info>();
|
|
Mixer.Info[] infos = getMixerInfo();
|
|
for (int i = 0; i < infos.length; ++i)
|
|
{
|
|
Mixer mix = getMixer(infos[i]);
|
|
Line.Info[] srcs = mix.getSourceLineInfo(info);
|
|
for (int j = 0; j < srcs.length; ++j)
|
|
result.add(srcs[j]);
|
|
}
|
|
return result.toArray(new Line.Info[result.size()]);
|
|
}
|
|
|
|
/**
|
|
* Find and return a target data line matching the given audio format.
|
|
* @param fmt the format to match
|
|
* @throws LineUnavailableException if no matching line was found
|
|
* @since 1.5
|
|
*/
|
|
public static TargetDataLine getTargetDataLine(AudioFormat fmt)
|
|
throws LineUnavailableException
|
|
{
|
|
DataLine.Info info = new DataLine.Info(TargetDataLine.class, fmt);
|
|
Mixer.Info[] mixers = getMixerInfo();
|
|
for (int i = 0; i < mixers.length; ++i)
|
|
{
|
|
Mixer mix = getMixer(mixers[i]);
|
|
if (mix.isLineSupported(info))
|
|
return (TargetDataLine) mix.getLine(info);
|
|
}
|
|
throw new LineUnavailableException("target data line not found");
|
|
}
|
|
|
|
/**
|
|
* Return a target data line matching the given audio format and
|
|
* mixer.
|
|
* @param fmt the audio format
|
|
* @param mixer the mixer description
|
|
* @return a target data line
|
|
* @throws LineUnavailableException if no matching target data line was
|
|
* found
|
|
* @since 1.5
|
|
*/
|
|
public static TargetDataLine getTargetDataLine(AudioFormat fmt,
|
|
Mixer.Info mixer)
|
|
throws LineUnavailableException
|
|
{
|
|
DataLine.Info info = new DataLine.Info(TargetDataLine.class, fmt);
|
|
Mixer mix = getMixer(mixer);
|
|
if (mix.isLineSupported(info))
|
|
return (TargetDataLine) mix.getLine(info);
|
|
throw new LineUnavailableException("target data line not found");
|
|
}
|
|
|
|
/**
|
|
* Given a source encoding, return an array of all target encodings to which
|
|
* data in this form can be converted.
|
|
* @param source the source encoding
|
|
*/
|
|
public static AudioFormat.Encoding[] getTargetEncodings(AudioFormat.Encoding source)
|
|
{
|
|
HashSet<AudioFormat.Encoding> result
|
|
= new HashSet<AudioFormat.Encoding>();
|
|
Iterator<FormatConversionProvider> i =
|
|
ServiceFactory.lookupProviders(FormatConversionProvider.class);
|
|
while (i.hasNext())
|
|
{
|
|
FormatConversionProvider prov = i.next();
|
|
if (! prov.isSourceEncodingSupported(source))
|
|
continue;
|
|
AudioFormat.Encoding[] es = prov.getTargetEncodings();
|
|
for (int j = 0; j < es.length; ++j)
|
|
result.add(es[j]);
|
|
}
|
|
return result.toArray(new AudioFormat.Encoding[result.size()]);
|
|
}
|
|
|
|
/**
|
|
* Given a source format, return an array of all the target encodings to
|
|
* which data in this format can be converted.
|
|
* @param source the source format
|
|
*/
|
|
public static AudioFormat.Encoding[] getTargetEncodings(AudioFormat source)
|
|
{
|
|
HashSet<AudioFormat.Encoding> result
|
|
= new HashSet<AudioFormat.Encoding>();
|
|
Iterator<FormatConversionProvider> i =
|
|
ServiceFactory.lookupProviders(FormatConversionProvider.class);
|
|
while (i.hasNext())
|
|
{
|
|
FormatConversionProvider prov = i.next();
|
|
AudioFormat.Encoding[] es = prov.getTargetEncodings(source);
|
|
for (int j = 0; j < es.length; ++j)
|
|
result.add(es[j]);
|
|
}
|
|
return result.toArray(new AudioFormat.Encoding[result.size()]);
|
|
}
|
|
|
|
/**
|
|
* Given a target encoding and a source audio format, return an array of all
|
|
* matching audio formats to which data in this source format can be converted.
|
|
* @param encoding the target encoding
|
|
* @param sourceFmt the source format
|
|
*/
|
|
public static AudioFormat[] getTargetFormats(AudioFormat.Encoding encoding,
|
|
AudioFormat sourceFmt)
|
|
{
|
|
HashSet<AudioFormat> result = new HashSet<AudioFormat>();
|
|
Iterator<FormatConversionProvider> i =
|
|
ServiceFactory.lookupProviders(FormatConversionProvider.class);
|
|
while (i.hasNext())
|
|
{
|
|
FormatConversionProvider prov = i.next();
|
|
AudioFormat[] es = prov.getTargetFormats(encoding, sourceFmt);
|
|
for (int j = 0; j < es.length; ++j)
|
|
result.add(es[j]);
|
|
}
|
|
return result.toArray(new AudioFormat[result.size()]);
|
|
}
|
|
|
|
/**
|
|
* Given a line description, return an array of descriptions of all
|
|
* the matching target lines.
|
|
* @param info the line description
|
|
*/
|
|
public static Line.Info[] getTargetLineInfo(Line.Info info)
|
|
{
|
|
HashSet<Line.Info> result = new HashSet<Line.Info>();
|
|
Mixer.Info[] infos = getMixerInfo();
|
|
for (int i = 0; i < infos.length; ++i)
|
|
{
|
|
Mixer mix = getMixer(infos[i]);
|
|
Line.Info[] targs = mix.getTargetLineInfo(info);
|
|
for (int j = 0; j < targs.length; ++j)
|
|
result.add(targs[j]);
|
|
}
|
|
return result.toArray(new Line.Info[result.size()]);
|
|
}
|
|
|
|
/**
|
|
* Return true if the currently installed providers are able to
|
|
* convert data from the given source format to the given target encoding.
|
|
* @param targ the target encoding
|
|
* @param source the source format
|
|
*/
|
|
public static boolean isConversionSupported(AudioFormat.Encoding targ,
|
|
AudioFormat source)
|
|
{
|
|
Iterator<FormatConversionProvider> i
|
|
= ServiceFactory.lookupProviders(FormatConversionProvider.class);
|
|
while (i.hasNext())
|
|
{
|
|
FormatConversionProvider prov = i.next();
|
|
if (prov.isConversionSupported(targ, source))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Return true if the currently installed providers are able to convert
|
|
* the given source format to the given target format.
|
|
* @param targ the target format
|
|
* @param source the source format
|
|
*/
|
|
public static boolean isConversionSupported(AudioFormat targ,
|
|
AudioFormat source)
|
|
{
|
|
Iterator<FormatConversionProvider> i
|
|
= ServiceFactory.lookupProviders(FormatConversionProvider.class);
|
|
while (i.hasNext())
|
|
{
|
|
FormatConversionProvider prov = i.next();
|
|
if (prov.isConversionSupported(targ, source))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private static boolean isFileTypeSupported(AudioFileFormat.Type[] types,
|
|
AudioFileFormat.Type type)
|
|
{
|
|
for (int i = 0; i < types.length; ++i)
|
|
{
|
|
if (types[i].equals(type))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Return true if the given audio file format is supported by one of
|
|
* the providers installed on the system.
|
|
* @param type the audio file format type
|
|
*/
|
|
public static boolean isFileTypeSupported(AudioFileFormat.Type type)
|
|
{
|
|
return isFileTypeSupported(getAudioFileTypes(), type);
|
|
}
|
|
|
|
/**
|
|
* Return true if the given audio file format is supported for the
|
|
* given audio input stream by one of the providers installed on the
|
|
* system.
|
|
* @param type the audio file format type
|
|
* @param ais the audio input stream
|
|
*/
|
|
public static boolean isFileTypeSupported(AudioFileFormat.Type type,
|
|
AudioInputStream ais)
|
|
{
|
|
return isFileTypeSupported(getAudioFileTypes(ais), type);
|
|
}
|
|
|
|
/**
|
|
* Return true if some provider on the system supplies a line
|
|
* matching the argument.
|
|
* @param info the line to match
|
|
*/
|
|
public static boolean isLineSupported(Line.Info info)
|
|
{
|
|
Mixer.Info[] infos = getMixerInfo();
|
|
for (int i = 0; i < infos.length; ++i)
|
|
{
|
|
if (getMixer(infos[i]).isLineSupported(info))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Write an audio input stream to the given file, using the specified
|
|
* audio file format. All the providers installed on the system will
|
|
* be searched to find one that supports this operation.
|
|
* @param ais the audio input stream to write
|
|
* @param type the desired audio file format type
|
|
* @param out the file to write to
|
|
* @return the number of bytes written
|
|
* @throws IOException if an I/O error occurs while writing
|
|
* @throws IllegalArgumentException if the file type is not supported
|
|
*/
|
|
public static int write(AudioInputStream ais, AudioFileFormat.Type type,
|
|
File out)
|
|
throws IOException
|
|
{
|
|
Iterator<AudioFileWriter> i = ServiceFactory.lookupProviders(AudioFileWriter.class);
|
|
while (i.hasNext())
|
|
{
|
|
AudioFileWriter w = i.next();
|
|
if (w.isFileTypeSupported(type, ais))
|
|
return w.write(ais, type, out);
|
|
}
|
|
throw new IllegalArgumentException("file type not supported by system");
|
|
}
|
|
|
|
/**
|
|
* Write an audio input stream to the given output stream, using the
|
|
* specified audio file format. All the providers installed on the
|
|
* system will be searched to find one that supports this operation.
|
|
* @param ais the audio input stream to write
|
|
* @param type the desired audio file format type
|
|
* @param os the output stream to write to
|
|
* @return the number of bytes written
|
|
* @throws IOException if an I/O error occurs while writing
|
|
* @throws IllegalArgumentException if the file type is not supported
|
|
*/
|
|
public static int write(AudioInputStream ais, AudioFileFormat.Type type,
|
|
OutputStream os)
|
|
throws IOException
|
|
{
|
|
Iterator<AudioFileWriter> i = ServiceFactory.lookupProviders(AudioFileWriter.class);
|
|
while (i.hasNext())
|
|
{
|
|
AudioFileWriter w = i.next();
|
|
if (w.isFileTypeSupported(type, ais))
|
|
return w.write(ais, type, os);
|
|
}
|
|
throw new IllegalArgumentException("file type not supported by system");
|
|
}
|
|
}
|