void Mixer::Mix(int *channelFlags, WaveTrack * src, double t0, double t1) { if (src->GetRate() - mRate >= 0.5 || src->GetRate() - mRate <= -0.5) MixDiffRates(channelFlags, src, t0, t1); else MixSameRate(channelFlags, src, t0, t1); }
sampleCount Mixer::Process(int maxToProcess) { if (mT >= mT1) return 0; int i, j; sampleCount out; sampleCount maxOut = 0; int *channelFlags = new int[mNumChannels]; mMaxOut = maxToProcess; Clear(); for(i=0; i<mNumInputTracks; i++) { WaveTrack *track = mInputTrack[i]; for(j=0; j<mNumChannels; j++) channelFlags[j] = 0; switch(track->GetChannel()) { case Track::MonoChannel: default: for(j=0; j<mNumChannels; j++) channelFlags[j] = 1; break; case Track::LeftChannel: channelFlags[0] = 1; break; case Track::RightChannel: if (mNumChannels >= 2) channelFlags[1] = 1; else channelFlags[0] = 1; break; } if (mTimeTrack || track->GetRate() != mRate) out = MixVariableRates(channelFlags, track, &mSamplePos[i], mSampleQueue[i], &mQueueStart[i], &mQueueLen[i], mSRC[i]); else out = MixSameRate(channelFlags, track, &mSamplePos[i]); if (out > maxOut) maxOut = out; } mT += (maxOut / mRate); delete [] channelFlags; return maxOut; }
sampleCount Mixer::Process(int maxToProcess) { if (mT >= mT1) return 0; int i, j; sampleCount out; sampleCount maxOut = 0; int *channelFlags = new int[mNumChannels]; mMaxOut = maxToProcess; Clear(); for(i=0; i<mNumInputTracks; i++) { WaveTrack *track = mInputTrack[i]; for(j=0; j<mNumChannels; j++) channelFlags[j] = 0; if( mMixerSpec ) { //ignore left and right when downmixing is not required for( j = 0; j < mNumChannels; j++ ) channelFlags[ j ] = mMixerSpec->mMap[ i ][ j ] ? 1 : 0; } else { switch(track->GetChannel()) { case Track::MonoChannel: default: for(j=0; j<mNumChannels; j++) channelFlags[j] = 1; break; case Track::LeftChannel: channelFlags[0] = 1; break; case Track::RightChannel: if (mNumChannels >= 2) channelFlags[1] = 1; else channelFlags[0] = 1; break; } } if (mTimeTrack || track->GetRate() != mRate) out = MixVariableRates(channelFlags, track, &mSamplePos[i], mSampleQueue[i], &mQueueStart[i], &mQueueLen[i], mSRC[i]); else out = MixSameRate(channelFlags, track, &mSamplePos[i]); if (out > maxOut) maxOut = out; } out = mInterleaved ? maxOut * mNumChannels : maxOut; for(int c=0; c<mNumBuffers; c++) CopySamples(mTemp[c], floatSample, mBuffer[c], mFormat, out); mT += (maxOut / mRate); delete [] channelFlags; return maxOut; }
sampleCount Mixer::Process(sampleCount maxToProcess) { // MB: this is wrong! mT represented warped time, and mTime is too inaccurate to use // it here. It's also unnecessary I think. //if (mT >= mT1) // return 0; int i, j; sampleCount maxOut = 0; int *channelFlags = new int[mNumChannels]; mMaxOut = maxToProcess; Clear(); for(i=0; i<mNumInputTracks; i++) { const WaveTrack *const track = mInputTrack[i].GetTrack(); for(j=0; j<mNumChannels; j++) channelFlags[j] = 0; if( mMixerSpec ) { //ignore left and right when downmixing is not required for( j = 0; j < mNumChannels; j++ ) channelFlags[ j ] = mMixerSpec->mMap[ i ][ j ] ? 1 : 0; } else { switch(track->GetChannel()) { case Track::MonoChannel: default: for(j=0; j<mNumChannels; j++) channelFlags[j] = 1; break; case Track::LeftChannel: channelFlags[0] = 1; break; case Track::RightChannel: if (mNumChannels >= 2) channelFlags[1] = 1; else channelFlags[0] = 1; break; } } if (mbVariableRates || track->GetRate() != mRate) maxOut = std::max(maxOut, MixVariableRates(channelFlags, mInputTrack[i], &mSamplePos[i], mSampleQueue[i], &mQueueStart[i], &mQueueLen[i], mResample[i])); else maxOut = std::max(maxOut, MixSameRate(channelFlags, mInputTrack[i], &mSamplePos[i])); double t = (double)mSamplePos[i] / (double)track->GetRate(); if (mT0 > mT1) // backwards (as possibly in scrubbing) mTime = std::max(std::min(t, mTime), mT1); else // forwards (the usual) mTime = std::min(std::max(t, mTime), mT1); } if(mInterleaved) { for(int c=0; c<mNumChannels; c++) { CopySamples(mTemp[0].ptr() + (c * SAMPLE_SIZE(floatSample)), floatSample, mBuffer[0].ptr() + (c * SAMPLE_SIZE(mFormat)), mFormat, maxOut, mHighQuality, mNumChannels, mNumChannels); } } else { for(int c=0; c<mNumBuffers; c++) { CopySamples(mTemp[c].ptr(), floatSample, mBuffer[c].ptr(), mFormat, maxOut, mHighQuality); } } // MB: this doesn't take warping into account, replaced with code based on mSamplePos //mT += (maxOut / mRate); delete [] channelFlags; return maxOut; }