# Module Mad

    module Mad: sig .. end

Functions for decoding mp3 files using the libmad.

Author(s): Samuel Mimram

# Exceptions

    exception Mad_error of string

An error occured with libmad.

    exception Read_error of string

An error occured while reading a file.

    exception End_of_stream

The end of the mp3 stream was reached.

    exception Openfile_error of string

Could not open a file.

    exception Closefile_error of string

Could not close a file.

# Decoding files

    type mad_file

An mp3 file opened for decoding.

    type mpeg_layer =

`|` | `Layer_I`
`|` | `Layer_II`
`|` | `Layer_III`

    type emphasis =

`|` | `None`
`|` | `MS_50_15`
`|` | `CCITT_J_17`
`|` | `Reserved`

    type channel_mode =

`|` | `Single_channel`
`|` | `Dual_channel`
`|` | `Joint_stereo`
`|` | `Stereo`

    type frame_format = {

`` | `layer : `mpeg_layer`;`
`` | `mode : `channel_mode`;`
`` | `emphasis : `emphasis`;`
`` | `bitrate : `int`;`
`` | `samplerate : `int`;`
`` | `channels : `int`;`
`` | `samples_per_channel : `int`;`
`` | `original : `bool`;`
`` | `copyright : `bool`;`
`` | `private_bit : `bool`;`

}

    val openfile : string -> mad_file

Open an mp3 file.

Raises `Openfile_error` if an error occured while trying to open the file.

    val openstream : (int -> string * int) -> mad_file

`openstream read_func` opens a stream where `read_func n` should be a function which returns `n` bytes of data or less, the second component of the result being the number of bytes to read in the fist component.

    val skip_id3tags : read:(int -> string * int) -> seek:(int -> int) -> tell:(unit -> int) -> unit

Skip ID3 tags that may be present at the beginning of a stream. This function may be used to a mp3 file opened using `openstream`. ID3 tags are always skipped when using `openfile`.

`seek` is a callback to seek to an absolute position on the encoded data, and `tell` a callback to fetch the current position. `read` is the reading callback.

    val close : mad_file -> unit

Close an mp3 file previously opened with `openfile`.

Raises `Closefile_error` if an error occured while trying to close the file.

    val get_current_position : mad_file -> int

Get the current position (in bytes) of the decoder in the mp3 file which should have been opened with `openfile`.

    type time_unit =

`|` | `Hours`
`|` | `Minutes`
`|` | `Seconds`
`|` | `Deciseconds`
`|` | `Centiseconds`
`|` | `Milliseconds`

    val get_current_time : mad_file -> time_unit -> int

Get the current time position (in the given unit) of the decoder.

    val decode_frame : mad_file -> string

Decode an mp3 frame. Returned data in interleaved when there are two channels, and mono data when there is only one.

    val decode_frame_float : mad_file -> float array array

Decode an mp3 frame.

    val skip_frame : mad_file -> unit

Skip one frame. The current time/position is updated but the frame is not decoded.

    val get_frame_format : mad_file -> frame_format

    val get_output_format : mad_file -> int * int * int

    val duration : string -> float

Compute the duration of a file, in seconds. Never raises any exception, but returns 0. in case of error.