text:  /************************************************************************/
   /*                                                                      */
   /*                Centre for Speech Technology Research                 */
   /*                     University of Edinburgh, UK                      */
   /*                       Copyright (c) 1996,1997                        */
   /*                        All Rights Reserved.                          */
   /*                                                                      */
   /*  Permission is hereby granted, free of charge, to use and distribute */
   /*  this software and its documentation without restriction, including  */
   /*  without limitation the rights to use, copy, modify, merge, publish, */
   /*  distribute, sublicense, and/or sell copies of this work, and to     */
   /*  permit persons to whom this work is furnished to do so, subject to  */
   /*  the following conditions:                                           */
   /*   1. The code must retain the above copyright notice, this list of   */
   /*      conditions and the following disclaimer.                        */
   /*   2. Any modifications must be clearly marked as such.               */
   /*   3. Original authors' names are not deleted.                        */
   /*   4. The authors' names are not used to endorse or promote products  */
   /*      derived from this software without specific prior written       */
   /*      permission.                                                     */
   /*                                                                      */
   /*  THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK       */
   /*  DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING     */
   /*  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT  */
   /*  SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE    */
   /*  FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES   */
   /*  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN  */
   /*  AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,         */
   /*  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF      */
   /*  THIS SOFTWARE.                                                      */
   /*                                                                      */
   /*************************************************************************/
   /*                                                                       */
   /*                 Author: Richard Caley (rjc@cstr.ed.ac.uk)             */
   /* --------------------------------------------------------------------  */
   /* Wave file formats known to the speech tools.                         */
   /*                                                                       */
   /*************************************************************************/
  
  #ifndef __EST_WAVEFILE_H__
  #define __EST_WAVEFILE_H__
  
  #include "EST_TNamedEnum.h"
  #include "EST_String.h"
  #include "EST_Token.h"
  #include "EST_rw_status.h"
  #include "EST_Wave.h"
  #include "EST_wave_aux.h"
  
  typedef enum EST_WaveFileType{
    wff_none,
    wff_nist,
    wff_esps,
    wff_est,
    wff_audlab,
    wff_snd,
    wff_aiff,
    wff_riff,
    wff_raw,
    wff_ulaw,
    wff_alaw
  } EST_WaveFileType;
  
  class EST_WaveFile {
  public:
  
    // We have to use #defines for what should be done with just
    // typedefs because Sun CC thinks you shouldn't be allowed to
    // declare a member function via a typedef.
  
  #define LoadWaveFileArgs const EST_String filename, \
  				EST_Wave &wv, \
  				int rate, EST_sample_type_t stype, \
  				int bo, int nc, \
  				int offset, int length
  
  #define SaveWaveFileArgs const EST_String filename, \
  				const EST_Wave &wv, \
  				EST_sample_type_t stype, int bo
  
  #define LoadWave_TokenStreamArgs EST_TokenStream &ts, \
  				EST_Wave &wv, \
  				int rate, EST_sample_type_t stype, \
  				int bo, int nc, \
  				int offset, int length
  
  #define SaveWave_TokenStreamArgs FILE *fp, \
  				    const EST_Wave &wv, \
  				    EST_sample_type_t stype, int bo
  
    typedef EST_read_status  Load_TokenStream(LoadWave_TokenStreamArgs);
  
    typedef EST_write_status Save_TokenStream(SaveWave_TokenStreamArgs);
  
    typedef struct Info {
      bool recognise;
      Load_TokenStream *load;
      Save_TokenStream *save;
      Save_TokenStream *save_header;
      Save_TokenStream *save_data;
      const char *description;
    } Info;
  
    static EST_write_status save_nist(SaveWave_TokenStreamArgs);
    static EST_write_status save_nist_header(SaveWave_TokenStreamArgs);
    static EST_write_status save_nist_data(SaveWave_TokenStreamArgs);
    static EST_read_status load_nist(LoadWave_TokenStreamArgs);
  
    static EST_write_status save_est(SaveWave_TokenStreamArgs);
    static EST_write_status save_est_header(SaveWave_TokenStreamArgs);
    static EST_write_status save_est_data(SaveWave_TokenStreamArgs);
    static EST_read_status load_est(LoadWave_TokenStreamArgs);
  
    static EST_write_status save_esps(SaveWave_TokenStreamArgs);
    static EST_write_status save_esps_header(SaveWave_TokenStreamArgs);
    static EST_write_status save_esps_data(SaveWave_TokenStreamArgs);
    static EST_read_status load_esps(LoadWave_TokenStreamArgs);
  
    static EST_write_status save_audlab(SaveWave_TokenStreamArgs);
    static EST_write_status save_audlab_header(SaveWave_TokenStreamArgs);
    static EST_write_status save_audlab_data(SaveWave_TokenStreamArgs);
    static EST_read_status load_audlab(LoadWave_TokenStreamArgs);
  
    static EST_write_status save_snd(SaveWave_TokenStreamArgs);
    static EST_write_status save_snd_header(SaveWave_TokenStreamArgs);
    static EST_write_status save_snd_data(SaveWave_TokenStreamArgs);
    static EST_read_status load_snd(LoadWave_TokenStreamArgs);
  
    static EST_write_status save_aiff(SaveWave_TokenStreamArgs);
    static EST_write_status save_aiff_header(SaveWave_TokenStreamArgs);
    static EST_write_status save_aiff_data(SaveWave_TokenStreamArgs);
    static EST_read_status load_aiff(LoadWave_TokenStreamArgs);
  
    static EST_write_status save_riff(SaveWave_TokenStreamArgs);
    static EST_write_status save_riff_header(SaveWave_TokenStreamArgs);
    static EST_write_status save_riff_data(SaveWave_TokenStreamArgs);
    static EST_read_status load_riff(LoadWave_TokenStreamArgs);
  
    static EST_write_status save_raw(SaveWave_TokenStreamArgs);
    static EST_write_status save_raw_header(SaveWave_TokenStreamArgs);
    static EST_write_status save_raw_data(SaveWave_TokenStreamArgs);
    static EST_read_status load_raw(LoadWave_TokenStreamArgs);
  
    static EST_write_status save_ulaw(SaveWave_TokenStreamArgs);
    static EST_write_status save_ulaw_header(SaveWave_TokenStreamArgs);
    static EST_write_status save_ulaw_data(SaveWave_TokenStreamArgs);
    static EST_read_status load_ulaw(LoadWave_TokenStreamArgs);
  
    static EST_write_status save_alaw(SaveWave_TokenStreamArgs);
    static EST_write_status save_alaw_header(SaveWave_TokenStreamArgs);
    static EST_write_status save_alaw_data(SaveWave_TokenStreamArgs);
    static EST_read_status load_alaw(LoadWave_TokenStreamArgs);
  
    static EST_TNamedEnumI<EST_WaveFileType, Info> map;
  
    static EST_String options_supported(void);
    static EST_String options_short(void);
  };
  
  #endif
  