/* scivi - visualization plugin for XMMS * Copyright (C) 2003 Vitaly V. Bursov * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include "common.h" #include "scivi.h" #include "dynam.h" #include "utilsnd.h" static float _pos(float f) { return f > 0.0f ? f : 0.0f; } void scivi_freq_analyzer_end(DynamicsData *d) { d->freqs.beat = 0.0f; } void scivi_freq_analyzer(DynamicsData *d, float (*freq_data)[256], int freq_data_count) { static const int freq_scaler[] = {0, 2, 101, 256}; const int bands = 3; float fc[bands]; int i,k; for (k=0;kfreqs.att_init){ float volm; d->freqs.attq[0] = (2.0f*d->freqs.attq[0] + fc[0])/3.0f; d->freqs.attq[1] = (2.0f*d->freqs.attq[1] + fc[1])/3.0f; d->freqs.attq[2] = (2.0f*d->freqs.attq[2] + fc[2])/3.0f; d->freqs.att[0] = (5.0f*d->freqs.att[0] + fc[0])/6.0f; d->freqs.att[1] = (5.0f*d->freqs.att[1] + fc[1])/6.0f; d->freqs.att[2] = (5.0f*d->freqs.att[2] + fc[2])/6.0f; if (d->freqs.maxf[0] < d->freqs.attq[0]) d->freqs.maxf[0] = d->freqs.attq[0]; else d->freqs.maxf[0] = (999.0f*d->freqs.maxf[0] + fc[0])/1000.0f; if (d->freqs.maxf[1] < d->freqs.attq[1]) d->freqs.maxf[1] = d->freqs.attq[1]; else d->freqs.maxf[1] = (999.0f*d->freqs.maxf[1] + fc[1])/1000.0f; if (d->freqs.maxf[2] < d->freqs.attq[2]) d->freqs.maxf[2] = d->freqs.attq[2]; else d->freqs.maxf[2] = (999.0f*d->freqs.maxf[2] + fc[2])/1000.0f; volm = ( 1.0f*_pos(d->freqs.attq[0]-d->freqs.att[0]) + 20.0f*_pos(d->freqs.attq[1]-d->freqs.att[1]) + 90.0f*_pos(d->freqs.attq[2]-d->freqs.att[2])); d->freqs.avg_vol = (19.0f*d->freqs.avg_vol + volm)/20.0f; if (d->freqs.att_init > 1){ if (volm > d->freqs.avg_vol*2.0f){ if (d->freqs.bcnt < 3) d->freqs.bcnt++; } else { if ((d->freqs.bcnt > 3) && (d->freqs.bcnt < 5)){ d->freqs.bcnt++; } else if (d->freqs.bcnt == 5){ d->freqs.bcnt = 0; } } if (d->freqs.bcnt == 3){ #if 0 static int c = 0; printf("beat! %d %f %f\n", c++, volm, d->freqs.avg_vol); #endif d->freqs.beat = 1.0f; d->freqs.bcnt++; } } else { d->freqs.avg_vol = volm; d->freqs.att_init++; } } else { d->freqs.attq[0] = fc[0]; d->freqs.att[0] = d->freqs.attq[0]; d->freqs.maxf[0] = d->freqs.attq[0]; d->freqs.attq[1] = fc[1]; d->freqs.att[1] = d->freqs.attq[1]; d->freqs.maxf[1] = d->freqs.attq[1]; d->freqs.attq[2] = fc[2]; d->freqs.att[2] = d->freqs.attq[2]; d->freqs.maxf[2] = d->freqs.attq[2]; d->freqs.att_init++; } }