![]() |
Mixxx
|
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 }