+(*
+** File: sndfile.ml
+**
+** Copyright (c) 2006, 2007 Erik de Castro Lopo <erikd at mega-nerd dot com>
+** WWW: http://www.mega-nerd.com/libsndfile/Ocaml/
+**
+** This library is free software; you can redistribute it and/or
+** modify it under the terms of the GNU Lesser General Public
+** License as published by the Free Software Foundation; either
+** version 2 of the License, or (at your option) any later version.
+**
+** This library 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
+** Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public
+** License along with this library; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*)
+
+(** libsndfile interface for OCaml.
+
+ libsndfile (http://www.mega-nerd.com/libsndfile) is a library for reading
+ and writing a huge number of different audio file formats.
+
+ Typical (simple) usage for small files:
+
+{[
+ let file = Sndfile.openfile filename in
+ let frames = Int64.to_int (Sndfile.frames file) in
+ let data = Array.create frames 0.0 in
+ let readcount = Sndfile.read file data in
+ .....
+]}
+
+*)
+
+type open_mode_t =
+ | READ (** Open file for read. *)
+ | WRITE (** Open file for write. *)
+ | RDWR (** Open file for read/write. *)
+
+type seek_mode_t =
+ | SEEK_SET (** Seek relative to start of file. *)
+ | SEEK_CUR (** Seek relative to current position. *)
+ | SEEL_END (** Seek relative to end of file. *)
+
+type major_format_t =
+ | MAJOR_NONE
+ | MAJOR_WAV (** Microsoft WAV format (little endian default). *)
+ | MAJOR_AIFF (** Apple/SGI AIFF format (big endian). *)
+ | MAJOR_AU (** Sun/NeXT AU format (big endian). *)
+ | MAJOR_RAW (** RAW PCM data. *)
+ | MAJOR_PAF (** Ensoniq PARIS file format. *)
+ | MAJOR_SVX (** Amiga IFF / SVX8 / SV16 format. *)
+ | MAJOR_NIST (** Sphere NIST format. *)
+ | MAJOR_VOC (** VOC files. *)
+ | MAJOR_IRCAM (** Berkeley/IRCAM/CARL *)
+ | MAJOR_W64 (** Sonic Foundry's 64 bit RIFF/WAV *)
+ | MAJOR_MAT4 (** Matlab (tm) V4.2 / GNU Octave 2.0 *)
+ | MAJOR_MAT5 (** Matlab (tm) V5.0 / GNU Octave 2.1 *)
+ | MAJOR_PVF (** Portable Voice Format *)
+ | MAJOR_XI (** Fasttracker 2 Extended Instrument *)
+ | MAJOR_HTK (** HMM Tool Kit format *)
+ | MAJOR_SDS (** Midi Sample Dump Standard *)
+ | MAJOR_AVR (** Audio Visual Research *)
+ | MAJOR_WAVEX (** MS WAVE with WAVEFORMATEX *)
+ | MAJOR_SD2 (** Sound Designer 2 *)
+ | MAJOR_FLAC (** FLAC lossless file format *)
+ | MAJOR_CAF (** Core Audio File format *)
+
+type minor_format_t =
+ | MINOR_NONE
+ | MINOR_PCM_S8 (** Signed 8 bit data *)
+ | MINOR_PCM_16 (** Signed 16 bit data *)
+ | MINOR_PCM_24 (** Signed 24 bit data *)
+ | MINOR_PCM_32 (** Signed 32 bit data *)
+ | MINOR_PCM_U8 (** Unsigned 8 bit data (WAV and RAW only) *)
+ | MINOR_FLOAT (** 32 bit float data *)
+ | MINOR_DOUBLE (** 64 bit float data *)
+ | MINOR_ULAW (** U-Law encoded. *)
+ | MINOR_ALAW (** A-Law encoded. *)
+ | MINOR_IMA_ADPCM (** IMA ADPCM. *)
+ | MINOR_MS_ADPCM (** Microsoft ADPCM. *)
+ | MINOR_GSM610 (** GSM 6.10 encoding. *)
+ | MINOR_VOX_ADPCM (** OKI / Dialogix ADPCM *)
+ | MINOR_G721_32 (** 32kbs G721 ADPCM encoding. *)
+ | MINOR_G723_24 (** 24kbs G723 ADPCM encoding. *)
+ | MINOR_G723_40 (** 40kbs G723 ADPCM encoding. *)
+ | MINOR_DWVW_12 (** 12 bit Delta Width Variable Word encoding. *)
+ | MINOR_DWVW_16 (** 16 bit Delta Width Variable Word encoding. *)
+ | MINOR_DWVW_24 (** 24 bit Delta Width Variable Word encoding. *)
+ | MINOR_DWVW_N (** N bit Delta Width Variable Word encoding. *)
+ | MINOR_DPCM_8 (** 8 bit differential PCM (XI only) *)
+ | MINOR_DPCM_16 (** 16 bit differential PCM (XI only) *)
+
+
+type endianness_t =
+ | ENDIAN_FILE (** Default endianness for file format. *)
+ | ENDIAN_LITTLE (** Force little endian format. *)
+ | ENDIAN_BIG (** Force Big endian format. *)
+ | ENDIAN_CPU (** Use same endianness as host CPU. *)
+
+
+type file_format_t
+(**
+ An opaque type representing a sound file file format.
+
+ It is constructed using either format or format_e.
+*)
+
+type error =
+ | No_error
+ | Unrecognised_format
+ | System
+ | Malformed_file
+ | Unsupported_encoding
+ | Internal
+
+exception Error of (error * string)
+
+type t
+(**
+ [Sndfile.t] An opaque type representing a open sound file.
+*)
+
+val format : major_format_t -> minor_format_t -> file_format_t
+(**
+ [Sndfile.format ma mi] constructs a file_format_t for use with
+ sf_open for the supplied major format [ma], minor format [mi].
+*)
+
+val format_e : major_format_t -> minor_format_t -> endianness_t -> file_format_t
+(**
+ [Sndfile.format ma mi] constructs a file_format_t for use with
+ sf_open for the supplied major format [ma], minor format [mi] and
+ endianness [e].
+*)
+
+val openfile :
+ ?info : (open_mode_t * file_format_t * int * int) ->
+ string ->
+ t
+(**
+ [Sndfile.openfile fn] opens the file specified by the filename [fn] for
+ read.
+
+ [Sndfile.openfile (SFM_WRITE, fmt, ch, sr) fn] opens the file specified
+ by the filename [fn] for write with the specified file_format_t, channel
+ count and samplerate.
+
+ [Sndfile.openfile (SFM_RDWR, fmt, ch, sr) fn] opens the file specified
+ by the filename [fn] for read/write with the sepcified file_format_t,
+ channel count and samplerate.
+*)
+
+val close : t -> unit
+(**
+ [Sndfile.close f] closes the file [f].
+
+ Attempting to read from or write to a file after it has been closed will
+ fail.
+*)
+
+val read : t -> float array -> int
+(**
+ [Sndfile.read f a] read data from the file [f] into the supplied array
+ [a] and return the number of float values read.
+
+ For multi-channel files, the array length must be an integer multiple of
+ the number of channels.
+*)
+
+val write : t -> float array -> int
+(**
+ [Sndfile.write f a] write data from the supplied array [a] to the file
+ [f] and return the number of float values written.
+
+ For multi-channel files, the array length must be an integer multiple of
+ the number of channels.
+*)
+
+val frames : t -> Int64.t
+(**
+ [Sndfile.frames f] returns the number of frames in the file [f].
+*)
+
+val samplerate : t -> int
+(**
+ [Sndfile.samplerate f] returns the sample rate of the file [f].
+*)
+
+val channels : t -> int
+(**
+ [Sndfile.channels f] returns the channel count for the file [f].
+*)
+
+val seek : t -> Int64.t -> seek_mode_t -> Int64.t
+(**
+ [Sndfile.seek f pos m] seeks to posiont [pos] of file [f] using
+ the specified seek mode [m]. Returns offset from start of file.
+*)
+
+val compare : t -> t -> int
+(**
+ The comparison function for Sndfile.t, with the same specification as
+ [Pervasives.compare].
+*)