mirror of
https://github.com/projectM-visualizer/projectm.git
synced 2026-02-13 18:15:35 +00:00
- 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:
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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++)
|
||||
{
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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 */
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user