Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/engine/enginebufferscaledummy.cpp

Go to the documentation of this file.
00001 #include <QtCore>
00002 
00003 #include "engine/enginebufferscaledummy.h"
00004 
00005 #include "engine/enginebufferscale.h"
00006 #include "engine/readaheadmanager.h"
00007 
00008 
00009 EngineBufferScaleDummy::EngineBufferScaleDummy(ReadAheadManager* pReadAheadManager)
00010     : EngineBufferScale(),
00011       m_pReadAheadManager(pReadAheadManager)
00012 {
00013         new_playpos = 0.0f;
00014 }
00015 
00016 EngineBufferScaleDummy::~EngineBufferScaleDummy()
00017 {
00018 
00019 }
00020 
00021 void EngineBufferScaleDummy::setBaseRate(double baserate)
00022 {
00023         m_dBaseRate = baserate;
00024 }
00025 
00026 double EngineBufferScaleDummy::setTempo(double tempo)
00027 {
00028         m_dTempo = tempo;
00029         return m_dTempo;
00030 }
00031 
00032 double EngineBufferScaleDummy::getNewPlaypos()
00033 {
00034         return new_playpos;
00035 }
00036 
00037 void EngineBufferScaleDummy::clear()
00038 {
00039 }
00040 
00047 CSAMPLE *EngineBufferScaleDummy::scale(double playpos,
00048                                        unsigned long buf_size,
00049                                        CSAMPLE* pBase,
00050                                        unsigned long iBaseLength)
00051 {
00052     new_playpos = 0.0;
00053     if (m_dBaseRate * m_dTempo == 0.0f) {
00054         memset(buffer, 0, sizeof(CSAMPLE) * buf_size);
00055         return buffer;
00056     }
00057     int samples_remaining = buf_size;
00058     CSAMPLE* buffer_back = buffer;
00059     while (samples_remaining > 0) {
00060         int read_samples = m_pReadAheadManager->getNextSamples(m_dBaseRate*m_dTempo,
00061                                                                buffer_back,
00062                                                                samples_remaining);
00063         samples_remaining -= read_samples;
00064         buffer_back += read_samples;
00065     }
00066 
00067     // Interpreted as number of virtual song samples consumed.
00068     new_playpos = buf_size;
00069 
00070 /*
00071         //START OF BASIC/ROCKSOLID LINEAR INTERPOLATION CODE
00072 
00073         //This code was ripped from EngineBufferScaleLinear so we could experiment
00074         //with it and understand how it works. We also wanted to test to see if this
00075         //minimal subset of the code was stable, and it is. -- Albert 04/23/08
00076 
00077         float rate_add = 2 * m_dBaseRate * m_dTempo; //2 channels * baserate * tempo
00078         int i;
00079         new_playpos = playpos;
00080         for (i=0; i<buf_size; i+=2)
00081         {
00082             long prev = (long)floor(new_playpos)%READBUFFERSIZE;
00083             if (prev % 2 != 0) prev--;
00084 
00085             long next = (prev+2)%READBUFFERSIZE;
00086 
00087             float frac = new_playpos - floor(new_playpos);
00088             buffer[i  ] = wavebuffer[prev  ] + frac*(wavebuffer[next  ]-wavebuffer[prev  ]);
00089             buffer[i+1] = wavebuffer[prev+1] + frac*(wavebuffer[next+1]-wavebuffer[prev+1]);
00090 
00091             new_playpos += rate_add;
00092         }
00093         */
00094         //END OF LINEAR INTERPOLATION CODE
00095 
00096         //qDebug() << iBaseLength << playpos << new_playpos << buf_size << numSamplesToCopy;
00097 
00098         return buffer;
00099 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines