#include <gst/controller/gstcontroller.h>
#include <gst/audio/audio.h>
#include <gst/audio/gstaudiofilter.h>
-#include <liboil/liboil.h>
+#include "gstvolumeorc.h"
#include "gstvolume.h"
{
gdouble *data = (gdouble *) bytes;
guint num_samples = n_bytes / sizeof (gdouble);
+ int i;
gdouble vol = self->current_volume;
- oil_scalarmultiply_f64_ns (data, data, &vol, num_samples);
+ for (i = 0; i < num_samples; i++) {
+ data[i] *= vol;
+ }
}
static void
gfloat *data = (gfloat *) bytes;
guint num_samples = n_bytes / sizeof (gfloat);
-#if 0
- guint i;
-
+#ifndef broken
+ int i;
for (i = 0; i < num_samples; i++) {
- *data++ *= self->real_vol_f;
+ *data++ *= self->current_volume;
}
- /* time "gst-launch 2>/dev/null audiotestsrc wave=7 num-buffers=10000 ! audio/x-raw-float !
- * volume volume=1.5 ! fakesink" goes from 0m0.850s -> 0m0.717s with liboil
- */
+#else
+ /* FIXME compiler doesn't set the float parameter correctly */
+ orc_scalarmultiply_f32_ns (data, data, self->current_volume, num_samples);
#endif
- oil_scalarmultiply_f32_ns (data, data, &self->current_volume, num_samples);
}
static void
(gint16) ((self->current_vol_i16 *
val) >> VOLUME_UNITY_INT16_BIT_SHIFT);
}
+#if 0
+ /* FIXME */
+ /* hard coded in volume.orc */
+ g_assert (VOLUME_UNITY_INT16_BIT_SHIFT == 13);
+
+ orc_process_int16 (data, this->current_vol_i16, num_samples);
+#endif
}
static void
volume_process_int16_clamp (GstVolume * self, gpointer bytes, guint n_bytes)
{
gint16 *data = (gint16 *) bytes;
- guint i, num_samples;
- gint val;
+ guint num_samples = n_bytes / sizeof (gint16);
+ int i;
- num_samples = n_bytes / sizeof (gint16);
+ /* hard coded in volume.orc */
+ g_assert (VOLUME_UNITY_INT16_BIT_SHIFT == 13);
/* FIXME: oil_scalarmultiply_s16_ns ?
* https://bugs.freedesktop.org/show_bug.cgi?id=7060
*/
for (i = 0; i < num_samples; i++) {
/* we use bitshifting instead of dividing by UNITY_INT for speed */
- val = (gint) * data;
+ int val = (gint) * data;
*data++ =
(gint16) CLAMP ((self->current_vol_i16 *
val) >> VOLUME_UNITY_INT16_BIT_SHIFT, VOLUME_MIN_INT16,
VOLUME_MAX_INT16);
}
+#if 0
+ /* FIXME */
+ orc_process_int16_clamp (data, this->current_vol_i16, num_samples);
+#endif
}
static void
{
gint8 *data = (gint8 *) bytes;
guint num_samples = n_bytes / sizeof (gint8);
- guint i;
- gint val;
+ int i;
for (i = 0; i < num_samples; i++) {
/* we use bitshifting instead of dividing by UNITY_INT for speed */
- val = (gint) * data;
+ int val = (gint) * data;
*data++ =
(gint8) ((self->current_vol_i8 * val) >> VOLUME_UNITY_INT8_BIT_SHIFT);
}
+#if 0
+ /* FIXME */
+ /* hard coded in volume.orc */
+ g_assert (VOLUME_UNITY_INT8_BIT_SHIFT == 5);
+
+ orc_process_int8 (data, this->current_vol_i8, num_samples);
+#endif
}
static void
volume_process_int8_clamp (GstVolume * self, gpointer bytes, guint n_bytes)
{
gint8 *data = (gint8 *) bytes;
- guint i, num_samples;
- gint val;
+ guint num_samples = n_bytes / sizeof (gint8);
+ int i;
- num_samples = n_bytes / sizeof (gint8);
+ /* hard coded in volume.orc */
+ g_assert (VOLUME_UNITY_INT8_BIT_SHIFT == 5);
for (i = 0; i < num_samples; i++) {
/* we use bitshifting instead of dividing by UNITY_INT for speed */
- val = (gint) * data;
+ int val = (gint) * data;
*data++ =
(gint8) CLAMP ((self->current_vol_i8 *
val) >> VOLUME_UNITY_INT8_BIT_SHIFT, VOLUME_MIN_INT8,
VOLUME_MAX_INT8);
}
+#if 0
+ /* FIXME */
+ orc_process_int8_clamp (data, this->current_vol_i8, num_samples);
+#endif
}
static void
static gboolean
plugin_init (GstPlugin * plugin)
{
- oil_init ();
-
/* initialize gst controller library */
gst_controller_init (NULL, NULL);
--- /dev/null
+
+/* autogenerated from gstvolumeorc.orc */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#ifndef DISABLE_ORC
+#include <orc/orc.h>
+#else
+#include <stdint.h>
+#endif
+#include <glib.h>
+
+void orc_process_int16 (gint16 * d1, int p1, int n);
+void orc_process_int16_clamp (gint16 * d1, int p1, int n);
+void orc_process_int8 (gint8 * d1, int p1, int n);
+void orc_process_int8_clamp (gint8 * d1, int p1, int n);
+
+
+/* begin Orc C target preamble */
+#define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x)))
+#define ORC_ABS(a) ((a)<0 ? -(a) : (a))
+#define ORC_MIN(a,b) ((a)<(b) ? (a) : (b))
+#define ORC_MAX(a,b) ((a)>(b) ? (a) : (b))
+#define ORC_SB_MAX 127
+#define ORC_SB_MIN (-1-ORC_SB_MAX)
+#define ORC_UB_MAX 255
+#define ORC_UB_MIN 0
+#define ORC_SW_MAX 32767
+#define ORC_SW_MIN (-1-ORC_SW_MAX)
+#define ORC_UW_MAX 65535
+#define ORC_UW_MIN 0
+#define ORC_SL_MAX 2147483647
+#define ORC_SL_MIN (-1-ORC_SL_MAX)
+#define ORC_UL_MAX 4294967295U
+#define ORC_UL_MIN 0
+#define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX)
+#define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX)
+#define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX)
+#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX)
+#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX)
+#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX)
+#define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8))
+#define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24))
+#define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset)))
+#define ORC_AS_FLOAT(x) (((union { int i; float f; } *)(&x))->f)
+typedef union
+{
+ int32_t i;
+ float f;
+} orc_union32;
+typedef union
+{
+ int64_t i;
+ double f;
+} orc_union64;
+/* end Orc C target preamble */
+
+
+
+/* orc_process_int16 */
+#ifdef DISABLE_ORC
+void
+orc_process_int16 (gint16 * d1, int p1, int n)
+{
+ int i;
+ int16_t var0;
+ int16_t *ptr0;
+ const int16_t var16 = 13;
+ const int16_t var24 = p1;
+ orc_union32 var32;
+ orc_union32 var33;
+
+ ptr0 = (int16_t *) d1;
+
+ for (i = 0; i < n; i++) {
+ var0 = *ptr0;
+ /* 0: mulswl */
+ var32.i = var0 * var24;
+ /* 1: shrsl */
+ var33.i = var32.i >> var16;
+ /* 2: convlw */
+ var0 = var33.i;
+ *ptr0 = var0;
+ ptr0++;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_int16 (OrcExecutor * ex)
+{
+ int i;
+ int n = ex->n;
+ int16_t var0;
+ int16_t *ptr0;
+ const int16_t var16 = 13;
+ const int16_t var24 = ex->params[24];
+ orc_union32 var32;
+ orc_union32 var33;
+
+ ptr0 = (int16_t *) ex->arrays[0];
+
+ for (i = 0; i < n; i++) {
+ var0 = *ptr0;
+ /* 0: mulswl */
+ var32.i = var0 * var24;
+ /* 1: shrsl */
+ var33.i = var32.i >> var16;
+ /* 2: convlw */
+ var0 = var33.i;
+ *ptr0 = var0;
+ ptr0++;
+ }
+
+}
+
+void
+orc_process_int16 (gint16 * d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static int p_inited = 0;
+ static OrcProgram *p = 0;
+ void (*func) (OrcExecutor *);
+
+ if (!p_inited) {
+ orc_once_mutex_lock ();
+ if (!p_inited) {
+ OrcCompileResult result;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_int16");
+ orc_program_set_backup_function (p, _backup_orc_process_int16);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_constant (p, 2, 13, "c1");
+ orc_program_add_parameter (p, 2, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append (p, "mulswl", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1);
+ orc_program_append (p, "shrsl", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1);
+ orc_program_append (p, "convlw", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1);
+
+ result = orc_program_compile (p);
+ }
+ p_inited = TRUE;
+ orc_once_mutex_unlock ();
+ }
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ ex->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_process_int16_clamp */
+#ifdef DISABLE_ORC
+void
+orc_process_int16_clamp (gint16 * d1, int p1, int n)
+{
+ int i;
+ int16_t var0;
+ int16_t *ptr0;
+ const int16_t var16 = 13;
+ const int16_t var24 = p1;
+ orc_union32 var32;
+ orc_union32 var33;
+
+ ptr0 = (int16_t *) d1;
+
+ for (i = 0; i < n; i++) {
+ var0 = *ptr0;
+ /* 0: mulswl */
+ var32.i = var0 * var24;
+ /* 1: shrsl */
+ var33.i = var32.i >> var16;
+ /* 2: convssslw */
+ var0 = ORC_CLAMP_SW (var33.i);
+ *ptr0 = var0;
+ ptr0++;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_int16_clamp (OrcExecutor * ex)
+{
+ int i;
+ int n = ex->n;
+ int16_t var0;
+ int16_t *ptr0;
+ const int16_t var16 = 13;
+ const int16_t var24 = ex->params[24];
+ orc_union32 var32;
+ orc_union32 var33;
+
+ ptr0 = (int16_t *) ex->arrays[0];
+
+ for (i = 0; i < n; i++) {
+ var0 = *ptr0;
+ /* 0: mulswl */
+ var32.i = var0 * var24;
+ /* 1: shrsl */
+ var33.i = var32.i >> var16;
+ /* 2: convssslw */
+ var0 = ORC_CLAMP_SW (var33.i);
+ *ptr0 = var0;
+ ptr0++;
+ }
+
+}
+
+void
+orc_process_int16_clamp (gint16 * d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static int p_inited = 0;
+ static OrcProgram *p = 0;
+ void (*func) (OrcExecutor *);
+
+ if (!p_inited) {
+ orc_once_mutex_lock ();
+ if (!p_inited) {
+ OrcCompileResult result;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_int16_clamp");
+ orc_program_set_backup_function (p, _backup_orc_process_int16_clamp);
+ orc_program_add_destination (p, 2, "d1");
+ orc_program_add_constant (p, 2, 13, "c1");
+ orc_program_add_parameter (p, 2, "p1");
+ orc_program_add_temporary (p, 4, "t1");
+
+ orc_program_append (p, "mulswl", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1);
+ orc_program_append (p, "shrsl", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1);
+ orc_program_append (p, "convssslw", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1);
+
+ result = orc_program_compile (p);
+ }
+ p_inited = TRUE;
+ orc_once_mutex_unlock ();
+ }
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ ex->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_process_int8 */
+#ifdef DISABLE_ORC
+void
+orc_process_int8 (gint8 * d1, int p1, int n)
+{
+ int i;
+ int8_t var0;
+ int8_t *ptr0;
+ const int16_t var16 = 5;
+ const int8_t var24 = p1;
+ int16_t var32;
+ int16_t var33;
+
+ ptr0 = (int8_t *) d1;
+
+ for (i = 0; i < n; i++) {
+ var0 = *ptr0;
+ /* 0: mulsbw */
+ var32 = var0 * var24;
+ /* 1: shrsw */
+ var33 = var32 >> var16;
+ /* 2: convwb */
+ var0 = var33;
+ *ptr0 = var0;
+ ptr0++;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_int8 (OrcExecutor * ex)
+{
+ int i;
+ int n = ex->n;
+ int8_t var0;
+ int8_t *ptr0;
+ const int16_t var16 = 5;
+ const int8_t var24 = ex->params[24];
+ int16_t var32;
+ int16_t var33;
+
+ ptr0 = (int8_t *) ex->arrays[0];
+
+ for (i = 0; i < n; i++) {
+ var0 = *ptr0;
+ /* 0: mulsbw */
+ var32 = var0 * var24;
+ /* 1: shrsw */
+ var33 = var32 >> var16;
+ /* 2: convwb */
+ var0 = var33;
+ *ptr0 = var0;
+ ptr0++;
+ }
+
+}
+
+void
+orc_process_int8 (gint8 * d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static int p_inited = 0;
+ static OrcProgram *p = 0;
+ void (*func) (OrcExecutor *);
+
+ if (!p_inited) {
+ orc_once_mutex_lock ();
+ if (!p_inited) {
+ OrcCompileResult result;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_int8");
+ orc_program_set_backup_function (p, _backup_orc_process_int8);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_constant (p, 2, 5, "c1");
+ orc_program_add_parameter (p, 1, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append (p, "mulsbw", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1);
+ orc_program_append (p, "shrsw", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1);
+ orc_program_append (p, "convwb", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1);
+
+ result = orc_program_compile (p);
+ }
+ p_inited = TRUE;
+ orc_once_mutex_unlock ();
+ }
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ ex->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif
+
+
+/* orc_process_int8_clamp */
+#ifdef DISABLE_ORC
+void
+orc_process_int8_clamp (gint8 * d1, int p1, int n)
+{
+ int i;
+ int8_t var0;
+ int8_t *ptr0;
+ const int16_t var16 = 5;
+ const int8_t var24 = p1;
+ int16_t var32;
+ int16_t var33;
+
+ ptr0 = (int8_t *) d1;
+
+ for (i = 0; i < n; i++) {
+ var0 = *ptr0;
+ /* 0: mulsbw */
+ var32 = var0 * var24;
+ /* 1: shrsw */
+ var33 = var32 >> var16;
+ /* 2: convssswb */
+ var0 = ORC_CLAMP_SB (var33);
+ *ptr0 = var0;
+ ptr0++;
+ }
+
+}
+
+#else
+static void
+_backup_orc_process_int8_clamp (OrcExecutor * ex)
+{
+ int i;
+ int n = ex->n;
+ int8_t var0;
+ int8_t *ptr0;
+ const int16_t var16 = 5;
+ const int8_t var24 = ex->params[24];
+ int16_t var32;
+ int16_t var33;
+
+ ptr0 = (int8_t *) ex->arrays[0];
+
+ for (i = 0; i < n; i++) {
+ var0 = *ptr0;
+ /* 0: mulsbw */
+ var32 = var0 * var24;
+ /* 1: shrsw */
+ var33 = var32 >> var16;
+ /* 2: convssswb */
+ var0 = ORC_CLAMP_SB (var33);
+ *ptr0 = var0;
+ ptr0++;
+ }
+
+}
+
+void
+orc_process_int8_clamp (gint8 * d1, int p1, int n)
+{
+ OrcExecutor _ex, *ex = &_ex;
+ static int p_inited = 0;
+ static OrcProgram *p = 0;
+ void (*func) (OrcExecutor *);
+
+ if (!p_inited) {
+ orc_once_mutex_lock ();
+ if (!p_inited) {
+ OrcCompileResult result;
+
+ p = orc_program_new ();
+ orc_program_set_name (p, "orc_process_int8_clamp");
+ orc_program_set_backup_function (p, _backup_orc_process_int8_clamp);
+ orc_program_add_destination (p, 1, "d1");
+ orc_program_add_constant (p, 2, 5, "c1");
+ orc_program_add_parameter (p, 1, "p1");
+ orc_program_add_temporary (p, 2, "t1");
+
+ orc_program_append (p, "mulsbw", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1);
+ orc_program_append (p, "shrsw", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1);
+ orc_program_append (p, "convssswb", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1);
+
+ result = orc_program_compile (p);
+ }
+ p_inited = TRUE;
+ orc_once_mutex_unlock ();
+ }
+ ex->program = p;
+
+ ex->n = n;
+ ex->arrays[ORC_VAR_D1] = d1;
+ ex->params[ORC_VAR_P1] = p1;
+
+ func = p->code_exec;
+ func (ex);
+}
+#endif