mirror of
https://github.com/game-stop/veejay.git
synced 2025-12-18 13:49:58 +01:00
139 lines
3.8 KiB
C
139 lines
3.8 KiB
C
#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 ? */
|
||
}
|
||
|