+(*
+** 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
+*)
+
+type open_mode_t =
+ | READ
+ | WRITE
+ | RDWR
+
+type seek_mode_t =
+ | SEEK_SET
+ | SEEK_CUR
+ | SEEL_END
+
+type major_format_t =
+ | MAJOR_NONE
+ | MAJOR_WAV
+ | MAJOR_AIFF
+ | MAJOR_AU
+ | MAJOR_RAW
+ | MAJOR_PAF
+ | MAJOR_SVX
+ | MAJOR_NIST
+ | MAJOR_VOC
+ | MAJOR_IRCAM
+ | MAJOR_W64
+ | MAJOR_MAT4
+ | MAJOR_MAT5
+ | MAJOR_PVF
+ | MAJOR_XI
+ | MAJOR_HTK
+ | MAJOR_SDS
+ | MAJOR_AVR
+ | MAJOR_WAVEX
+ | MAJOR_SD2
+ | MAJOR_FLAC
+ | MAJOR_CAF
+
+type minor_format_t =
+ | MINOR_NONE
+ | MINOR_PCM_S8
+ | MINOR_PCM_16
+ | MINOR_PCM_24
+ | MINOR_PCM_32
+ | MINOR_PCM_U8
+ | MINOR_FLOAT
+ | MINOR_DOUBLE
+ | MINOR_ULAW
+ | MINOR_ALAW
+ | MINOR_IMA_ADPCM
+ | MINOR_MS_ADPCM
+ | MINOR_GSM610
+ | MINOR_VOX_ADPCM
+ | MINOR_G721_32
+ | MINOR_G723_24
+ | MINOR_G723_40
+ | MINOR_DWVW_12
+ | MINOR_DWVW_16
+ | MINOR_DWVW_24
+ | MINOR_DWVW_N
+ | MINOR_DPCM_8
+ | MINOR_DPCM_16
+
+type endianness_t =
+ | ENDIAN_FILE
+ | ENDIAN_LITTLE
+ | ENDIAN_BIG
+ | ENDIAN_CPU
+
+
+type file_format_t
+
+type error =
+ | No_error
+ | Unrecognised_format
+ | System
+ | Malformed_file
+ | Unsupported_encoding
+ | Internal
+
+exception Error of (error * string)
+
+type t
+
+external format_e : major_format_t -> minor_format_t -> endianness_t -> file_format_t = "caml_sf_format_e"
+
+let format major minor =
+ format_e major minor ENDIAN_FILE
+
+external open_private :
+ string -> (* filename *)
+ open_mode_t ->
+ file_format_t ->
+ int -> (* channels *)
+ int -> (* samplerate *)
+ t = "caml_sf_open_private"
+
+let bad_format = format MAJOR_NONE MINOR_NONE
+
+let openfile ?(info = (READ, bad_format, 0, 0)) filename =
+ let (mode, fmt, channels, samplerate) = info in
+ open_private filename mode fmt channels samplerate
+
+external close : t -> unit = "caml_sf_close"
+
+external read : t -> float array -> int = "caml_sf_read"
+external write : t -> float array -> int = "caml_sf_write"
+
+
+external frames : t -> Int64.t = "caml_sf_frames"
+
+external samplerate : t -> int = "caml_sf_samplerate"
+
+external channels : t -> int = "caml_sf_channels"
+
+external seek : t -> Int64.t -> seek_mode_t -> Int64.t = "caml_sf_seek"
+
+external compare : t -> t -> int = "caml_sf_compare"
+
+let _ =
+ Callback.register_exception "sndfile_open_exn" (Error (No_error, "No error."))