summaryrefslogtreecommitdiffstats
path: root/gst/goom/sound_tester.c
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2008-02-23 01:51:37 +0000
committerBastien Nocera <hadess@hadess.net>2008-02-23 01:51:37 +0000
commita7bc7485b1a4d7e1b1a12ff593ca4ccb1d59e466 (patch)
treeffba99ad38c7616d089c5e728c75a6bd5f736c6c /gst/goom/sound_tester.c
parent7f0745bb7f26c69766bb0c64458c6543588cc4dc (diff)
configure.ac: Add checks for Flex/Yacc/Bison and other furry animals, for the new goom 2k4 based plugin
Original commit message from CVS: 2008-02-23 Bastien Nocera <hadess@hadess.net> * configure.ac: Add checks for Flex/Yacc/Bison and other furry animals, for the new goom 2k4 based plugin * gst/goom/*: Update to use goom 2k4, uses liboil to detect CPU optimisations (not working yet), move the old plugin to... * gst/goom2k1/*: ... here, in case somebody is sick enough Fixes #515073
Diffstat (limited to 'gst/goom/sound_tester.c')
-rw-r--r--gst/goom/sound_tester.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/gst/goom/sound_tester.c b/gst/goom/sound_tester.c
new file mode 100644
index 00000000..214ca0ef
--- /dev/null
+++ b/gst/goom/sound_tester.c
@@ -0,0 +1,143 @@
+#include "sound_tester.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* some constants */
+#define BIG_GOOM_DURATION 100
+#define BIG_GOOM_SPEED_LIMIT 0.1f
+
+#define ACCEL_MULT 0.95f
+#define SPEED_MULT 0.99f
+
+
+void
+evaluate_sound (gint16 data[2][512], SoundInfo * info)
+{
+
+ int i;
+ float difaccel;
+ float prevspeed;
+
+ /* find the max */
+ int incvar = 0;
+
+ for (i = 0; i < 512; i += 2) {
+ if (incvar < data[0][i])
+ incvar = data[0][i];
+ }
+
+ if (incvar > info->allTimesMax)
+ info->allTimesMax = incvar;
+
+ /* volume sonore */
+ info->volume = (float) incvar / (float) info->allTimesMax;
+ memcpy (info->samples[0], data[0], 512 * sizeof (short));
+ memcpy (info->samples[1], data[1], 512 * sizeof (short));
+
+ difaccel = info->accelvar;
+ info->accelvar = info->volume; /* accel entre 0 et 1 */
+
+ /* transformations sur la vitesse du son */
+ if (info->speedvar > 1.0f)
+ info->speedvar = 1.0f;
+
+ if (info->speedvar < 0.1f)
+ info->accelvar *= (1.0f - (float) info->speedvar);
+ else if (info->speedvar < 0.3f)
+ info->accelvar *= (0.9f - (float) (info->speedvar - 0.1f) / 2.0f);
+ else
+ info->accelvar *= (0.8f - (float) (info->speedvar - 0.3f) / 4.0f);
+
+ /* adoucissement de l'acceleration */
+ info->accelvar *= ACCEL_MULT;
+ if (info->accelvar < 0)
+ info->accelvar = 0;
+
+ difaccel = info->accelvar - difaccel;
+ if (difaccel < 0)
+ difaccel = -difaccel;
+
+ /* mise a jour de la vitesse */
+ prevspeed = info->speedvar;
+ info->speedvar = (info->speedvar + difaccel * 0.5f) / 2;
+ info->speedvar *= SPEED_MULT;
+ info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f;
+ if (info->speedvar < 0)
+ info->speedvar = 0;
+ if (info->speedvar > 1)
+ info->speedvar = 1;
+
+ /* temps du goom */
+ info->timeSinceLastGoom++;
+ info->timeSinceLastBigGoom++;
+ info->cycle++;
+
+ /* detection des nouveaux gooms */
+ if ((info->speedvar > (float) IVAL (info->biggoom_speed_limit_p) / 100.0f)
+ && (info->accelvar > info->bigGoomLimit)
+ && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) {
+ info->timeSinceLastBigGoom = 0;
+ }
+
+ if (info->accelvar > info->goom_limit) {
+ /* TODO: tester && (info->timeSinceLastGoom > 20)) { */
+ info->totalgoom++;
+ info->timeSinceLastGoom = 0;
+ info->goomPower = info->accelvar - info->goom_limit;
+ }
+
+ if (info->accelvar > info->prov_max)
+ info->prov_max = info->accelvar;
+
+ if (info->goom_limit > 1)
+ info->goom_limit = 1;
+
+ /* toute les 2 secondes : vérifier si le taux de goom est correct
+ * et le modifier sinon.. */
+ if (info->cycle % 64 == 0) {
+ if (info->speedvar < 0.01f)
+ info->goom_limit *= 0.91;
+ if (info->totalgoom > 4) {
+ info->goom_limit += 0.02;
+ }
+ if (info->totalgoom > 7) {
+ info->goom_limit *= 1.03f;
+ info->goom_limit += 0.03;
+ }
+ if (info->totalgoom > 16) {
+ info->goom_limit *= 1.05f;
+ info->goom_limit += 0.04;
+ }
+ if (info->totalgoom == 0) {
+ info->goom_limit = info->prov_max - 0.02;
+ }
+ if ((info->totalgoom == 1) && (info->goom_limit > 0.02))
+ info->goom_limit -= 0.01;
+ info->totalgoom = 0;
+ info->bigGoomLimit =
+ info->goom_limit * (1.0f +
+ (float) IVAL (info->biggoom_factor_p) / 500.0f);
+ info->prov_max = 0;
+ }
+
+ /* mise a jour des parametres pour la GUI */
+ FVAL (info->volume_p) = info->volume;
+ info->volume_p.change_listener (&info->volume_p);
+ FVAL (info->speed_p) = info->speedvar * 4;
+ info->speed_p.change_listener (&info->speed_p);
+ FVAL (info->accel_p) = info->accelvar;
+ info->accel_p.change_listener (&info->accel_p);
+
+ FVAL (info->goom_limit_p) = info->goom_limit;
+ info->goom_limit_p.change_listener (&info->goom_limit_p);
+ FVAL (info->goom_power_p) = info->goomPower;
+ info->goom_power_p.change_listener (&info->goom_power_p);
+ FVAL (info->last_goom_p) = 1.0 - ((float) info->timeSinceLastGoom / 20.0f);
+ info->last_goom_p.change_listener (&info->last_goom_p);
+ FVAL (info->last_biggoom_p) =
+ 1.0 - ((float) info->timeSinceLastBigGoom / 40.0f);
+ info->last_biggoom_p.change_listener (&info->last_biggoom_p);
+
+ /* bigGoomLimit ==goomLimit*9/8+7 ? */
+}