255 lines
7.4 KiB
Diff
255 lines
7.4 KiB
Diff
From f60e576eaef3b4050207a4c3f0bf601d855a3f07 Mon Sep 17 00:00:00 2001
|
|
From: Romain Beauxis <toots@rastageeks.org>
|
|
Date: Mon, 24 Jun 2013 22:47:57 -0500
|
|
Subject: [PATCH] Update to shine 3.0.0
|
|
|
|
---
|
|
CHANGES | 4 ++++
|
|
configure.ac | 4 ++--
|
|
src/shine.ml | 56 ++++++++++++++++++++++++++++++-------------------------
|
|
src/shine.mli | 13 ++++++++-----
|
|
src/shine_stubs.c | 34 +++++++++++++++++----------------
|
|
5 files changed, 63 insertions(+), 48 deletions(-)
|
|
|
|
diff --git a/CHANGES b/CHANGES
|
|
index d3a6f6f..3451867 100644
|
|
--- a/CHANGES
|
|
+++ b/CHANGES
|
|
@@ -1,3 +1,7 @@
|
|
+0.2.0 ()
|
|
+=====
|
|
+* Updated to shine 3.0.0
|
|
+
|
|
0.1.1 (2013-04-15)
|
|
=====
|
|
* Updated to shine 2.0.0
|
|
diff --git a/configure.ac b/configure.ac
|
|
index 018e20b..eb0522f 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -1,6 +1,6 @@
|
|
|
|
# check for one particular file of the sources
|
|
-AC_INIT([ocaml-shine],[0.1.1],[savonet-users@lists.sourceforge.net])
|
|
+AC_INIT([ocaml-shine],[0.2.0],[savonet-users@lists.sourceforge.net])
|
|
|
|
VERSION=$PACKAGE_VERSION
|
|
AC_MSG_RESULT([configuring $PACKAGE_STRING])
|
|
@@ -13,7 +13,7 @@ AC_C_BIGENDIAN(AC_DEFINE([BIGENDIAN], [1], [The target is big endian]),[])
|
|
AC_BASE_CHECKS()
|
|
|
|
PKG_PROG_PKG_CONFIG()
|
|
-PKG_CONFIG_CHECK_MODULE([shine],[2.0.0])
|
|
+PKG_CONFIG_CHECK_MODULE([shine],[3.0.0])
|
|
|
|
# substitutions to perform
|
|
AC_SUBST(VERSION)
|
|
diff --git a/src/shine.ml b/src/shine.ml
|
|
index b9176ea..97ee03e 100644
|
|
--- a/src/shine.ml
|
|
+++ b/src/shine.ml
|
|
@@ -20,7 +20,13 @@
|
|
|
|
(** OCaml bindings for the libshine. *)
|
|
|
|
-type t
|
|
+type enc
|
|
+
|
|
+type t =
|
|
+ {
|
|
+ enc : enc;
|
|
+ samples_per_pass : int;
|
|
+ }
|
|
|
|
type parameters =
|
|
{
|
|
@@ -29,44 +35,44 @@ type parameters =
|
|
bitrate : int;
|
|
}
|
|
|
|
-exception Samples_per_frame
|
|
-exception Invalid_bitrate
|
|
-exception Invalid_samplerate
|
|
+exception Invalid_buffer_size
|
|
+exception Invalid_configuration
|
|
exception Invalid_channels
|
|
|
|
-external samples_per_frame : unit -> int = "ocaml_shine_samples_per_frames"
|
|
-
|
|
-let samples_per_frame = samples_per_frame()
|
|
+external check_config : int -> int -> bool = "ocaml_shine_check_config"
|
|
|
|
-external samplerate_index : int -> int = "ocaml_shine_samplerate_index"
|
|
+external samples_per_pass : enc -> int = "ocaml_shine_samples_per_pass"
|
|
|
|
-external bitrate_index : int -> int = "ocaml_shine_bitrate_index"
|
|
-
|
|
-external create : int -> int -> int -> t = "ocaml_shine_init"
|
|
+external create : int -> int -> int -> enc = "ocaml_shine_init"
|
|
|
|
let create params =
|
|
- if samplerate_index params.samplerate < 0 then
|
|
- raise Invalid_samplerate;
|
|
- if bitrate_index params.bitrate < 0 then
|
|
- raise Invalid_bitrate;
|
|
+ if not (check_config params.samplerate params.bitrate) then
|
|
+ raise Invalid_configuration;
|
|
if params.channels < 1 || params.channels > 2 then
|
|
raise Invalid_channels;
|
|
- create params.channels params.samplerate params.bitrate
|
|
+ let enc =
|
|
+ create params.channels params.samplerate params.bitrate
|
|
+ in
|
|
+ { enc = enc; samples_per_pass = (samples_per_pass enc) }
|
|
+
|
|
+let samples_per_pass enc = enc.samples_per_pass
|
|
|
|
-external encode_buffer : t -> float array array -> string = "ocaml_shine_encode_float"
|
|
+external encode_buffer : enc -> float array array -> string = "ocaml_shine_encode_float"
|
|
|
|
let encode_buffer enc buf =
|
|
- if (Array.length buf == 0) || (Array.length buf.(0) != samples_per_frame) then
|
|
- raise Samples_per_frame;
|
|
+ if (Array.length buf == 0) || (Array.length buf.(0) != enc.samples_per_pass) then
|
|
+ raise Invalid_buffer_size;
|
|
|
|
- encode_buffer enc buf
|
|
+ encode_buffer enc.enc buf
|
|
|
|
-external encode_s16le : t -> string -> int -> string = "ocaml_shine_encode_s16le"
|
|
+external encode_s16le : enc -> string -> int -> string = "ocaml_shine_encode_s16le"
|
|
|
|
let encode_s16le enc data chans =
|
|
- if String.length data < 2*samples_per_frame*chans then
|
|
- raise Samples_per_frame;
|
|
+ if String.length data < 2*enc.samples_per_pass*chans then
|
|
+ raise Invalid_buffer_size;
|
|
+
|
|
+ encode_s16le enc.enc data chans
|
|
|
|
- encode_s16le enc data chans
|
|
+external flush : enc -> string = "ocaml_shine_flush"
|
|
|
|
-external flush : t -> string = "ocaml_shine_flush"
|
|
+let flush enc = flush enc.enc
|
|
diff --git a/src/shine.mli b/src/shine.mli
|
|
index e958231..a3b0afd 100644
|
|
--- a/src/shine.mli
|
|
+++ b/src/shine.mli
|
|
@@ -29,15 +29,18 @@ type parameters =
|
|
bitrate : int;
|
|
}
|
|
|
|
-exception Samples_per_frame
|
|
-exception Invalid_bitrate
|
|
-exception Invalid_samplerate
|
|
-exception Invalid_channels
|
|
+exception Invalid_buffer_size
|
|
+
|
|
+(** Raised when samplerate and/or bitrate
|
|
+ * is invalid. *)
|
|
+exception Invalid_configuration
|
|
|
|
-val samples_per_frame : int
|
|
+exception Invalid_channels
|
|
|
|
val create : parameters -> t
|
|
|
|
+val samples_per_pass : t -> int
|
|
+
|
|
val encode_buffer : t -> float array array -> string
|
|
|
|
val encode_s16le : t -> string -> int -> string
|
|
diff --git a/src/shine_stubs.c b/src/shine_stubs.c
|
|
index c6a7c98..a4d2b6c 100644
|
|
--- a/src/shine_stubs.c
|
|
+++ b/src/shine_stubs.c
|
|
@@ -53,22 +53,20 @@ static struct custom_operations encoder_ops =
|
|
custom_deserialize_default
|
|
};
|
|
|
|
-CAMLprim value ocaml_shine_samples_per_frames(value unit)
|
|
+CAMLprim value ocaml_shine_samples_per_pass(value e)
|
|
{
|
|
- CAMLparam0();
|
|
- CAMLreturn(Val_int(samp_per_frame));
|
|
+ CAMLparam1(e);
|
|
+ CAMLreturn(Val_int(shine_samples_per_pass(Encoder_val(e))));
|
|
}
|
|
|
|
-CAMLprim value ocaml_shine_bitrate_index(value br)
|
|
+CAMLprim value ocaml_shine_check_config(value samplerate, value bitrate)
|
|
{
|
|
CAMLparam0();
|
|
- CAMLreturn(Val_int(shine_find_bitrate_index(Int_val(br))));
|
|
-}
|
|
|
|
-CAMLprim value ocaml_shine_samplerate_index(value sr)
|
|
-{
|
|
- CAMLparam0();
|
|
- CAMLreturn(Val_int(shine_find_samplerate_index(Int_val(sr))));
|
|
+ if (shine_check_config(Int_val(samplerate), Int_val(bitrate)) < 0)
|
|
+ CAMLreturn(Val_false);
|
|
+
|
|
+ CAMLreturn(Val_true);
|
|
}
|
|
|
|
CAMLprim value ocaml_shine_init(value chans, value samplerate, value bitrate)
|
|
@@ -84,9 +82,9 @@ CAMLprim value ocaml_shine_init(value chans, value samplerate, value bitrate)
|
|
config.wave.samplerate = Int_val(samplerate);
|
|
config.mpeg.bitr = Int_val(bitrate);
|
|
if (config.wave.channels == 1)
|
|
- config.mpeg.mode = 3;
|
|
+ config.mpeg.mode = MONO;
|
|
else
|
|
- config.mpeg.mode = 1;
|
|
+ config.mpeg.mode = JOINT_STEREO;
|
|
|
|
enc = shine_initialise(&config);
|
|
if (enc == NULL)
|
|
@@ -118,17 +116,19 @@ CAMLprim value ocaml_shine_encode_float(value e, value data)
|
|
{
|
|
CAMLparam2(e,data);
|
|
CAMLlocal2(src,ret);
|
|
- int16_t pcm[2][samp_per_frame];
|
|
+ int16_t *pcm[2];
|
|
+ int16_t chan1[SHINE_MAX_SAMPLES], chan2[SHINE_MAX_SAMPLES];
|
|
int c,i;
|
|
long written;
|
|
unsigned char *outdata;
|
|
|
|
shine_t enc = Encoder_val(e);
|
|
+ pcm[0] = chan1, pcm[1] = chan2;
|
|
|
|
for (c = 0; c < Wosize_val(data); c++)
|
|
{
|
|
src = Field(data, c);
|
|
- for (i = 0; i < samp_per_frame; i++)
|
|
+ for (i = 0; i < shine_samples_per_pass(enc); i++)
|
|
{
|
|
pcm[c][i] = clip(Double_field(src, i));
|
|
}
|
|
@@ -150,7 +150,8 @@ CAMLprim value ocaml_shine_encode_s16le(value e, value data, value channels)
|
|
{
|
|
CAMLparam2(e,data);
|
|
CAMLlocal1(ret);
|
|
- int16_t pcm[2][samp_per_frame];
|
|
+ int16_t *pcm[2];
|
|
+ int16_t chan1[SHINE_MAX_SAMPLES], chan2[SHINE_MAX_SAMPLES];
|
|
int16_t *src = (int16_t *)String_val(data);
|
|
int c,i;
|
|
long written;
|
|
@@ -159,10 +160,11 @@ CAMLprim value ocaml_shine_encode_s16le(value e, value data, value channels)
|
|
unsigned char *outdata;
|
|
|
|
shine_t enc = Encoder_val(e);
|
|
+ pcm[0] = chan1; pcm[1] = chan2;
|
|
|
|
for (c = 0; c < chans; c++)
|
|
{
|
|
- for (i = 0; i < samp_per_frame; i++)
|
|
+ for (i = 0; i < shine_samples_per_pass(enc); i++)
|
|
{
|
|
pcm[c][i] = src[i*chans + c];
|
|
#ifdef BIGENDIAN
|