| /* |
| * Waveform.hpp |
| * |
| * Created on: Jun 25, 2008 |
| * Author: pete |
| */ |
| #ifdef LINUX |
| #ifdef USE_GLES1 |
| #include <GLES/gl.h> |
| #else |
| #include <GL/gl.h> |
| #endif |
| #endif |
| #ifdef __APPLE__ |
| #include <OpenGL/gl.h> |
| #endif |
| |
| #include "Waveform.hpp" |
| #include <algorithm> |
| #include "BeatDetect.hpp" |
| |
| |
| typedef float floatPair[2]; |
| typedef float floatTriple[3]; |
| typedef float floatQuad[4]; |
| |
| |
| Waveform::Waveform(int samples) |
| : RenderItem(), |
| samples(samples), |
| points(samples), |
| pointContext(samples) |
| { |
| spectrum = false; /* spectrum data or pcm data */ |
| dots = false; /* draw wave as dots or lines */ |
| thick = false; /* draw thicker lines */ |
| additive = false; /* add color values together */ |
| |
| scaling= 1; /* scale factor of waveform */ |
| smoothing = 0; /* smooth factor of waveform */ |
| sep = 0; |
| } |
| |
| void |
| Waveform::Draw(RenderContext &context) |
| { |
| //if (samples > 2048) samples = 2048; |
| |
| if (additive) glBlendFunc(GL_SRC_ALPHA, GL_ONE); |
| else glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| |
| if (thick) |
| { |
| glLineWidth(context.texsize <= 512 ? 2 : 2*context.texsize/512); |
| glPointSize(context.texsize <= 512 ? 2 : 2*context.texsize/512); |
| } |
| else |
| glPointSize(context.texsize <= 512 ? 1 : context.texsize/512); |
| |
| |
| float *value1 = new float[samples]; |
| float *value2 = new float[samples]; |
| context.beatDetect->pcm->getPCM( value1, samples, 0, spectrum, smoothing, 0); |
| context.beatDetect->pcm->getPCM( value2, samples, 1, spectrum, smoothing, 0); |
| // printf("%f\n",pcmL[0]); |
| |
| |
| float mult= scaling*( spectrum ? 0.015f :1.0f); |
| |
| |
| std::transform(&value1[0],&value1[samples],&value1[0],std::bind2nd(std::multiplies<float>(),mult)); |
| std::transform(&value2[0],&value2[samples],&value2[0],std::bind2nd(std::multiplies<float>(),mult)); |
| |
| WaveformContext waveContext(samples, context.beatDetect); |
| |
| for(int x=0;x< samples;x++) |
| { |
| waveContext.sample = x/(float)(samples - 1); |
| waveContext.sample_int = x; |
| waveContext.left = value1[x]; |
| waveContext.right = value2[x]; |
| |
| points[x] = PerPoint(points[x],waveContext); |
| } |
| |
| floatQuad *colors = new float[samples][4]; |
| floatPair *p = new float[samples][2]; |
| |
| for(int x=0;x< samples;x++) |
| { |
| colors[x][0] = points[x].r; |
| colors[x][1] = points[x].g; |
| colors[x][2] = points[x].b; |
| colors[x][3] = points[x].a * masterAlpha; |
| |
| p[x][0] = points[x].x; |
| p[x][1] = -(points[x].y-1); |
| |
| } |
| |
| glEnableClientState(GL_VERTEX_ARRAY); |
| glEnableClientState(GL_COLOR_ARRAY); |
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
| |
| glVertexPointer(2,GL_FLOAT,0,p); |
| glColorPointer(4,GL_FLOAT,0,colors); |
| |
| if (dots) glDrawArrays(GL_POINTS,0,samples); |
| else glDrawArrays(GL_LINE_STRIP,0,samples); |
| |
| glPointSize(context.texsize < 512 ? 1 : context.texsize/512); |
| glLineWidth(context.texsize < 512 ? 1 : context.texsize/512); |
| #ifndef USE_GLES1 |
| glDisable(GL_LINE_STIPPLE); |
| #endif |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| // glPopMatrix(); |
| |
| delete[] colors; |
| delete[] p; |
| delete[] value1; |
| delete[] value2; |
| } |