package lame

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file lame.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
(*
 * Copyright 2005-2006 Savonet team
 *
 * This file is part of ocaml-lame.
 *
 * ocaml-lame is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * ocaml-lame 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with ocaml-lame; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *)

exception Init_params_failed
exception Init_params_not_called
exception Psychoacoustic_problem
exception Unknown_error of int

let _ =
  Callback.register_exception "lame_exn_init_params_failed" Init_params_failed;
  Callback.register_exception "lame_exn_init_params_not_called"
    Init_params_not_called;
  Callback.register_exception "lame_exn_psychoacoustic_problem"
    Psychoacoustic_problem;
  Callback.register_exception "lame_exn_unknown_error" (Unknown_error 0)

type encoder

external create_encoder : unit -> encoder = "ocaml_lame_init"

external set_in_samplerate : encoder -> int -> unit
  = "ocaml_lame_set_in_samplerate"

external set_num_channels : encoder -> int -> unit
  = "ocaml_lame_set_num_channels"

external set_out_samplerate : encoder -> int -> unit
  = "ocaml_lame_set_out_samplerate"

external set_quality : encoder -> int -> unit = "ocaml_lame_set_quality"

let set_quality e q =
  if q < 0 || q > 9 then invalid_arg "quality";
  set_quality e q

type mode = Stereo | Joint_stereo | Dual_channel | Mono

external set_mode : encoder -> mode -> unit = "ocaml_lame_set_mode"

type vbr_mode = Vbr_off | Vbr_rh | Vbr_abr | Vbr_mtrh | Vbr_max_indicator

external set_vbr_mode : encoder -> vbr_mode -> unit = "ocaml_lame_set_vbr"
external set_vbr_quality : encoder -> int -> unit = "ocaml_lame_set_VBR_q"

external set_vbr_mean_bitrate : encoder -> int -> unit
  = "ocaml_lame_set_VBR_mean_bitrate_kbps"

external set_vbr_min_bitrate : encoder -> int -> unit
  = "ocaml_lame_set_VBR_min_bitrate_kbps"

external set_vbr_max_bitrate : encoder -> int -> unit
  = "ocaml_lame_set_VBR_max_bitrate_kbps"

external set_vbr_hard_min : encoder -> bool -> unit
  = "ocaml_lame_set_VBR_hard_min"

external set_brate : encoder -> int -> unit = "ocaml_lame_set_brate"

external set_compression_ratio : encoder -> float -> unit
  = "ocaml_lame_set_compression_ratio"

external set_private : encoder -> bool -> unit = "ocaml_lame_set_extension"
external get_private : encoder -> bool = "ocaml_lame_get_extension"
external set_original : encoder -> bool -> unit = "ocaml_lame_set_original"
external get_original : encoder -> bool = "ocaml_lame_get_original"
external set_copyright : encoder -> bool -> unit = "ocaml_lame_set_copyright"
external get_copyright : encoder -> bool = "ocaml_lame_get_copyright"
external init_params : encoder -> unit = "ocaml_lame_init_params"
external init_bitstream : encoder -> unit = "ocaml_lame_init_bitstream"

external encode_buffer_part : encoder -> string -> int -> int -> string
  = "ocaml_lame_encode_buffer_interleaved"

(** [encode_buffer_float_part enc left right offset samples]
  * encodes float samples, expected to be in [-1;1]. *)
external encode_buffer_float_part :
  encoder -> float array -> float array -> int -> int -> string
  = "ocaml_lame_encode_buffer_float"

(** Encode left and right buffers. Data are supposed to be scaled -/+32768. *)
external encode_buffer_float_ba :
  encoder ->
  (float, Bigarray.float32_elt, Bigarray.c_layout) Bigarray.Array1.t ->
  (float, Bigarray.float32_elt, Bigarray.c_layout) Bigarray.Array1.t ->
  string = "ocaml_lame_encode_buffer_float_ba"

(** [encode_buffer enc buf smpl] encodes [smpl] samples of PCM audio into MP3.
  * Input samples are expected to be 16bits little-endian, other input/output
  * params are specified using [set_*] functions. *)
let encode_buffer enc buf smpl = encode_buffer_part enc buf 0 smpl

let encode_buffer_float enc left right smpl =
  encode_buffer_float_part enc left right 0 smpl

external encode_flush : encoder -> string = "ocaml_lame_encode_flush"

external encode_flush_nogap : encoder -> string
  = "ocaml_lame_encode_flush_nogap"

module Id3tag = struct
  external init : encoder -> unit = "ocaml_lame_id3tag_init"
  external set_title : encoder -> string -> unit = "ocaml_lame_id3tag_set_title"

  external set_artist : encoder -> string -> unit
    = "ocaml_lame_id3tag_set_artist"

  external set_album : encoder -> string -> unit = "ocaml_lame_id3tag_set_album"
  external set_year : encoder -> string -> unit = "ocaml_lame_id3tag_set_year"

  external set_comment : encoder -> string -> unit
    = "ocaml_lame_id3tag_set_comment"

  external set_track : encoder -> string -> unit = "ocaml_lame_id3tag_set_track"
  external set_genre : encoder -> string -> unit = "ocaml_lame_id3tag_set_genre"
end

external get_lame_version : unit -> string = "ocaml_lame_get_lame_version"

external get_lame_short_version : unit -> string
  = "ocaml_lame_get_lame_short_version"

external get_lame_very_short_version : unit -> string
  = "ocaml_lame_get_lame_very_short_version"

external get_psy_version : unit -> string = "ocaml_lame_get_psy_version"
external get_lame_url : unit -> string = "ocaml_lame_get_lame_url"

type mpeg_version = Mpeg_1 | Mpeg_2 | Mpeg_2_5

external get_version : encoder -> mpeg_version = "ocaml_lame_get_version"
external get_encoder_delay : encoder -> int = "ocaml_lame_get_encoder_delay"
external get_framesize : encoder -> int = "ocaml_lame_get_framesize"

external get_nb_samples_to_encode : encoder -> int
  = "ocaml_lame_get_mf_samples_to_encode"

external get_nb_encoded_frames : encoder -> int = "ocaml_lame_get_frameNum"
external get_nb_frames : encoder -> int = "ocaml_lame_get_totalframes"