(* ** File: sndfile.ml ** ** Copyright (c) 2006, 2007 Erik de Castro Lopo ** 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]. *)