- moodbar cut out of projectM.hpp/cpp

- fixed compiler warning with member init list
- removed unicode support in projectm-xmms (maybe bug "fix")


git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/trunk@512 6778bc44-b910-0410-a7a0-be141de4315d
This commit is contained in:
w1z7ard
2007-10-05 00:50:31 +00:00
parent 9087194ee6
commit 1a02f41fd3
7 changed files with 57 additions and 71 deletions

View File

@ -64,7 +64,7 @@ void MoodBar::resetBuffer() {
}
void MoodBar::calculateMood
(float * rgb_left, float * rgb_right, float * rgb_avg) {
(float * rgb_avg) {
unsigned int i;
float real_left, real_right, real_avg;
@ -72,8 +72,6 @@ void MoodBar::calculateMood
for (i = 0; i < 24; ++i) {
m_amplitudes_left[i] = 0.f;
m_amplitudes_right[i] = 0.f;
m_amplitudes_avg[i] = 0.f;
}
@ -84,33 +82,24 @@ void MoodBar::calculateMood
real_left = m_pcm->pcmdataL[2*i]; imag_left = m_pcm->pcmdataL[2*i + 1];
real_right = m_pcm->pcmdataR[2*i]; imag_right = m_pcm->pcmdataR[2*i + 1];
real_avg = (real_left + real_right) / 2.0;
imag_avg = (imag_left + imag_right) / 2.0;
m_amplitudes_left[m_barkband_table[i]] += sqrtf (real_left*real_left + imag_left*imag_left);
m_amplitudes_right[m_barkband_table[i]] += sqrtf (real_right*real_right + imag_right*imag_right);
m_amplitudes_avg[m_barkband_table[i]] += sqrtf (real_avg*real_avg + imag_avg*imag_avg);
}
for (i= 0; i < 3; i++) {
rgb_left[i] = 0.0;
rgb_right[i] = 0.0;
for (i= 0; i < 3; i++) {
rgb_avg[i] = 0.0;
}
for (i = 0; i < 24; ++i) {
rgb_left[i/8] += m_amplitudes_left[i] * m_amplitudes_left[i];
rgb_right[i/8] += m_amplitudes_right[i] * m_amplitudes_right[i];
rgb_avg[i/8] += m_amplitudes_avg[i] * m_amplitudes_avg[i];
}
for (i = 0; i < 3; i++) {
rgb_left[i] = sqrtf (rgb_left[i]);
rgb_right[i] = sqrtf (rgb_right[i]);
rgb_avg[i] = sqrtf (rgb_avg[i]);
}
@ -120,9 +109,9 @@ void MoodBar::calculateMood
//stretchNormalize(rgb_right);
//stretchNormalize(rgb_avg);
standardNormalize(rgb_left);
standardNormalize(rgb_right);
standardNormalize(rgb_avg);
//standardNormalize(rgb_left);
//standardNormalize(rgb_right);
stretchNormalize(rgb_avg);
#if 0
@ -191,14 +180,14 @@ void MoodBar::stretchNormalize (float * rgb)
if (numvals == 0)
return;
//int oldcurrent = m_ringBuffers[c].current();
//int oldcurrent = m_ringBuffers[c].current();
mini = maxi = m_ringBuffers[c].back();
// Compute max and min values of the array
for (i = 1; i < numvals; i++)
{
float _tmpval = m_ringBuffers[c].back();
if (_tmpval > maxi)
maxi = _tmpval;
@ -206,6 +195,8 @@ void MoodBar::stretchNormalize (float * rgb)
mini = _tmpval;
}
if (c==2) std::cerr << "max / min : " << maxi << " / " << mini << std::endl;
//assert((oldcurrent % RingBuffer<float>::RING_BUFFER_SIZE) == (m_ringBuffers[c].current() % RingBuffer<float>::RING_BUFFER_SIZE));
// Compute array average excluding the maximum and minimum ranges
@ -215,11 +206,13 @@ void MoodBar::stretchNormalize (float * rgb)
if(_tmpval != mini && _tmpval != maxi)
{
avg += _tmpval / ((float) numvals);
avg += _tmpval / numvals;
t++;
}
}
if (c==2) std::cerr << "avg (-max -min): " << avg << std::endl;
// Now compute average values if we partition the elements into
// two sets segmented by the previously computed average
// Again we exclude the max and min elements.
@ -244,9 +237,17 @@ void MoodBar::stretchNormalize (float * rgb)
// This normalizes the computations in the previous for loop
// so they represent proper averages of their respective sets
if (c==2) {
std::cerr << "tu / tb : " << tu << "/" << tb << std::endl;
std::cerr << "avgu / avgb (unnorm): " << avgu << "/" << avgb << std::endl;
}
avgu /= (float) tu;
avgb /= (float) tb;
if (c==2)
std::cerr << "avgu / avgb: " << avgu << "/" << avgb << std::endl;
tu = 0.f;
tb = 0.f;
@ -272,20 +273,41 @@ void MoodBar::stretchNormalize (float * rgb)
}
}
}
avguu /= (float) tu;
avgbb /= (float) tb;
//std::cerr << "avguu: " << avguu << ", avgbb: " << avgbb << std::endl;
if (c== 2)
std::cerr << "avguu: " << avguu << ", avgbb: " << avgbb << std::endl;
// lost from here- what is theory behind this?
mini = projectM_fmax (avg + (avgb - avg) * 2.f, avgbb);
maxi = projectM_fmin (avg + (avgu - avg) * 2.f, avguu);
if (c == 2) {
std::cerr << "mini: " << mini << std::endl;
std::cerr << "maxi: " << maxi << std::endl;
}
delta = maxi - mini;
if (delta == 0.f)
delta = 1.f;
rgb[c] = projectM_fmin(1.f, projectM_fmax(0.f, (rgb[c] - mini) / delta));
if (c==2) {
std::cerr << "delta = " << delta << std::endl;
}
if (c==2) {
std::cerr << "rgb_orig[2] " << rgb[c] << std::endl;
}
rgb[c] = projectM_fmin(1.f, projectM_fmax(0.f, (rgb[c] - mini) / delta));
if (c==2) {
std::cerr << "rgb_norm[2] " << rgb[c] << std::endl;
}
}
}

View File

@ -43,7 +43,7 @@ public:
/// Calculate rgb mood values for both left and right channels.
/// Uses the pcm instance's latest assignment into its
/// pcmL/R data buffers as inputs
void calculateMood(float * rgb_left, float * rgb_right, float * rgb_avg);
void calculateMood(float * rgb_avg);
void stretchNormalize (float * colors);

View File

@ -288,7 +288,6 @@ Renderer::~Renderer() {
int x;
#if 1
std::cerr << "freeing grid elements" << std::endl;
assert(gx > 0);
for(x = 0; x < this->gx; x++)
{

View File

@ -7,7 +7,7 @@ class RingBuffer {
public:
//static const unsigned long RING_BUFFER_SIZE = 1024;
static const unsigned long RING_BUFFER_SIZE = 1024;
static const unsigned long RING_BUFFER_SIZE = 32768;
private:
kind buffer[RING_BUFFER_SIZE];

View File

@ -68,8 +68,7 @@ double smoothDuration = 5;
//int smoothFrame = 0;
int oldFrame = 1;
DLLEXPORT projectM::projectM(int gx, int gy, int fps, int texsize, int width, int height, std::string preset_url) :renderer(0), renderTarget(0), smoothFrame(0), beatDetect ( 0 ), presetURL(preset_url), moodBar(0)
{
DLLEXPORT projectM::projectM(int gx, int gy, int fps, int texsize, int width, int height, std::string preset_url) :renderer(0), renderTarget(0), presetURL(preset_url), smoothFrame(0), beatDetect ( 0 ) {
presetURL = preset_url;
projectM_reset();
projectM_init(gx, gy, fps, texsize, width, height);
@ -86,8 +85,6 @@ projectM::~projectM() {
delete(textureManager);
if (beatDetect)
delete(beatDetect);
if (moodBar)
delete(moodBar);
if (renderTarget)
delete(renderTarget);
@ -95,8 +92,8 @@ projectM::~projectM() {
}
DLLEXPORT projectM::projectM(std::string config_file) :
renderer(0), renderTarget(0), smoothFrame(0), beatDetect ( 0 ), moodBar(0)
{
renderer(0), renderTarget(0), smoothFrame(0), beatDetect ( 0 ) {
projectM_reset();
readConfig(config_file);
@ -137,10 +134,9 @@ DLLEXPORT void projectM::renderFrame()
int index = 0;
int x, y;
#endif
// printf("Start of loop at %d\n",timestart);
mspf= ( int ) ( 1000.0/ ( float ) presetInputs.fps ); //milliseconds per frame
#ifndef WIN32
presetInputs.time = getTicks ( &startTime ) * 0.001;
@ -162,32 +158,6 @@ DLLEXPORT void projectM::renderFrame()
beatDetect->detectFromSamples();
#ifndef USE_MOODBAR
//#define USE_MOODBAR
#endif
#ifdef USE_MOODBAR
float rgb_left[3], rgb_right[3], rgb_avg[3];
// moodBar->calculateMood(rgb_left, rgb_right, rgb_avg);
//rgb_avg[0] = presetInputs.bass_att;
//rgb_avg[1] = presetInputs.mid_att;
//rgb_avg[2] = presetInputs.treb_att;
//moodBar->stretchNormalize(rgb_avg);
//presetInputs.bass_att = rgb_avg[0];
//presetInputs.mid_att = rgb_avg[1];
//presetInputs.treb_att = rgb_avg[2];
presetInputs.mood_r = rgb_avg[0];
presetInputs.mood_g = rgb_avg[1];
presetInputs.mood_b = rgb_avg[2];
#endif
DWRITE ( "=== vol: %f\tbass: %f\tmid: %f\ttreb: %f ===\n",
beatDetect->vol,beatDetect->bass,beatDetect->mid,beatDetect->treb );
DWRITE ( "=== bass_att: %f ===\n",
@ -400,9 +370,6 @@ void projectM::projectM_reset()
assert(!beatDetect);
beatDetect = new BeatDetect();
//moodBar = new MoodBar(beatDetect->pcm);
/* Preset loading function */
initPresetTools();
#if 0
/* Load default preset directory */

View File

@ -93,10 +93,8 @@ class MoodBar;
#endif
/** KEEP THIS UP TO DATE! */
#define PROJECTM_VERSION "1.02.00"
#define PROJECTM_TITLE "projectM 1.02.00"
#define PROJECTM_VERSION "1.00.00"
#define PROJECTM_TITLE "projectM 1.00.00"
/** Thread state */
typedef enum { GO, STOP } PMThreadState;

View File

@ -280,7 +280,7 @@ extern "C" void projectM_xmms_init(void)
printf("projectM plugin: Initializing\n");
SDL_EnableUNICODE(1);
//SDL_EnableUNICODE(1);
sem = SDL_CreateSemaphore(1);
worker_thread = SDL_CreateThread ( *worker_func, NULL);
@ -375,13 +375,13 @@ std::string read_config()
strcpy(projectM_home, home);
strcpy(projectM_home+strlen(home), "/.projectM/config.inp");
projectM_home[strlen(home)+strlen("/.projectM/config.inp")]='\0';
if((out = fopen(projectM_home,"w"))!=0)
{
if ((in = fopen(projectM_config, "r")) != 0)
{
while(fgets(num,80,in)!=NULL)
{
fputs(num,out);