/* MidiFilerReader.java -- MIDI file reading services
   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.midi.spi;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiFileFormat;
import javax.sound.midi.Sequence;

/**
 * The MidiFileReader abstract class defines the methods to be provided
 * by a MIDI file reader.
 * 
 * @author Anthony Green (green@redhat.com)
 * @since 1.3
 *
 */
public abstract class MidiFileReader
{
  /**
   * Read a MidiFileFormat from the given stream.
   * 
   * @param stream the stream from which to read the MIDI data
   * @return the MidiFileFormat object
   * @throws InvalidMidiDataException if the stream refers to invalid data
   * @throws IOException if an I/O exception occurs while reading
   */
  public abstract MidiFileFormat getMidiFileFormat(InputStream stream)
    throws InvalidMidiDataException, IOException;
  
  /**
   * Read a MidiFileFormat from the given stream.
   * 
   * @param url the url from which to read the MIDI data
   * @return the MidiFileFormat object
   * @throws InvalidMidiDataException if the url refers to invalid data
   * @throws IOException if an I/O exception occurs while reading
   */
  public abstract MidiFileFormat getMidiFileFormat(URL url)
    throws InvalidMidiDataException, IOException;  

  /**
   * Read a MidiFileFormat from the given stream.
   * 
   * @param file the file from which to read the MIDI data
   * @return the MidiFileFormat object
   * @throws InvalidMidiDataException if the file refers to invalid data
   * @throws IOException if an I/O exception occurs while reading
   */
  public abstract MidiFileFormat getMidiFileFormat(File file)
    throws InvalidMidiDataException, IOException; 
  
  /**
   * Read a Sequence from the given stream.
   * 
   * @param stream the stream from which to read the MIDI data
   * @return the Sequence object
   * @throws InvalidMidiDataException if the stream refers to invalid data
   * @throws IOException if an I/O exception occurs while reading
   */
  public abstract Sequence getSequence(InputStream stream)
    throws InvalidMidiDataException, IOException;
  
  /**
   * Read a Sequence from the given stream.
   * 
   * @param url the url from which to read the MIDI data
   * @return the Sequence object
   * @throws InvalidMidiDataException if the url refers to invalid data
   * @throws IOException if an I/O exception occurs while reading
   */
  public abstract Sequence getSequence(URL url)
    throws InvalidMidiDataException, IOException;  

  /**
   * Read a Sequence from the given stream.
   * 
   * @param file the file from which to read the MIDI data
   * @return the Sequence object
   * @throws InvalidMidiDataException if the file refers to invalid data
   * @throws IOException if an I/O exception occurs while reading
   */
  public abstract Sequence getSequence(File file)
    throws InvalidMidiDataException, IOException; 
}
