sound_tester.c

来自「linux下的MPEG1」· C语言 代码 · 共 139 行

C
139
字号
#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.99fvoid 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 ? */	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?