mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-16 08:09:32 +02:00
Bug 619 - TwoPassSimpleMono converts to track bit format between passes, losing quality.
This commit is contained in:
parent
0576d8c945
commit
618106f1c3
@ -25,29 +25,46 @@ doing the second pass over all selected tracks.
|
|||||||
|
|
||||||
bool EffectTwoPassSimpleMono::Process()
|
bool EffectTwoPassSimpleMono::Process()
|
||||||
{
|
{
|
||||||
mPass = 0;
|
mPass = 0;
|
||||||
mSecondPassDisabled = false;
|
mSecondPassDisabled = false;
|
||||||
|
|
||||||
InitPass1();
|
InitPass1();
|
||||||
this->CopyInputTracks(); // Set up mOutputTracks.
|
this->CopyInputTracks(); // Set up mOutputTracks.
|
||||||
bool bGoodResult = ProcessPass();
|
|
||||||
|
|
||||||
if (bGoodResult && !mSecondPassDisabled)
|
mWorkTracks = TrackList::Create(
|
||||||
{
|
const_cast<AudacityProject*>( FindProject() ) );
|
||||||
mPass = 1;
|
for (auto track : mOutputTracks->Selected< WaveTrack >()) {
|
||||||
if (InitPass2())
|
mWorkTracks->Add(track->EmptyCopy())->ConvertToSampleFormat(floatSample);
|
||||||
bGoodResult = ProcessPass();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
this->ReplaceProcessedTracks(bGoodResult);
|
mTrackLists[0] = &mOutputTracks;
|
||||||
return bGoodResult;
|
mTrackLists[1] = mSecondPassDisabled ? &mOutputTracks : &mWorkTracks;
|
||||||
|
|
||||||
|
bool bGoodResult = ProcessPass();
|
||||||
|
|
||||||
|
if (bGoodResult && !mSecondPassDisabled)
|
||||||
|
{
|
||||||
|
mPass = 1;
|
||||||
|
if (InitPass2())
|
||||||
|
bGoodResult = ProcessPass();
|
||||||
|
}
|
||||||
|
|
||||||
|
mWorkTracks->Clear();
|
||||||
|
mWorkTracks.reset();
|
||||||
|
|
||||||
|
this->ReplaceProcessedTracks(bGoodResult);
|
||||||
|
return bGoodResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EffectTwoPassSimpleMono::ProcessPass()
|
bool EffectTwoPassSimpleMono::ProcessPass()
|
||||||
{
|
{
|
||||||
//Iterate over each track
|
//Iterate over each track
|
||||||
mCurTrackNum = 0;
|
mCurTrackNum = 0;
|
||||||
for( auto track : mOutputTracks->Selected< WaveTrack >() ) {
|
|
||||||
|
auto outTracks = (*mTrackLists[1 - mPass])->Selected< WaveTrack >().begin();
|
||||||
|
for( auto track : (*mTrackLists[mPass])->Selected< WaveTrack >() ) {
|
||||||
|
auto outTrack = *outTracks;
|
||||||
|
|
||||||
//Get start and end times from track
|
//Get start and end times from track
|
||||||
double trackStart = track->GetStartTime();
|
double trackStart = track->GetStartTime();
|
||||||
double trackEnd = track->GetEndTime();
|
double trackEnd = track->GetEndTime();
|
||||||
@ -78,11 +95,12 @@ bool EffectTwoPassSimpleMono::ProcessPass()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
//ProcessOne() (implemented below) processes a single track
|
//ProcessOne() (implemented below) processes a single track
|
||||||
if (!ProcessOne(track, start, end))
|
if (!ProcessOne(track, outTrack, start, end))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
mCurTrackNum++;
|
mCurTrackNum++;
|
||||||
|
outTracks++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -91,7 +109,7 @@ bool EffectTwoPassSimpleMono::ProcessPass()
|
|||||||
|
|
||||||
//ProcessOne() takes a track, transforms it to bunch of buffer-blocks,
|
//ProcessOne() takes a track, transforms it to bunch of buffer-blocks,
|
||||||
//and executes TwoBufferProcessPass1 or TwoBufferProcessPass2 on these blocks
|
//and executes TwoBufferProcessPass1 or TwoBufferProcessPass2 on these blocks
|
||||||
bool EffectTwoPassSimpleMono::ProcessOne(WaveTrack * track,
|
bool EffectTwoPassSimpleMono::ProcessOne(WaveTrack * track, WaveTrack * outTrack,
|
||||||
sampleCount start, sampleCount end)
|
sampleCount start, sampleCount end)
|
||||||
{
|
{
|
||||||
bool ret;
|
bool ret;
|
||||||
@ -145,7 +163,12 @@ bool EffectTwoPassSimpleMono::ProcessOne(WaveTrack * track,
|
|||||||
|
|
||||||
//Processing succeeded. copy the newly-changed samples back
|
//Processing succeeded. copy the newly-changed samples back
|
||||||
//onto the track.
|
//onto the track.
|
||||||
track->Set((samplePtr)buffer1.get(), floatSample, s - samples1, samples1);
|
if (mSecondPassDisabled || mPass != 0) {
|
||||||
|
outTrack->Set((samplePtr)buffer1.get(), floatSample, s - samples1, samples1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
outTrack->Append((samplePtr)buffer1.get(), floatSample, samples1);
|
||||||
|
}
|
||||||
|
|
||||||
//Increment s one blockfull of samples
|
//Increment s one blockfull of samples
|
||||||
s += samples2;
|
s += samples2;
|
||||||
@ -181,7 +204,13 @@ bool EffectTwoPassSimpleMono::ProcessOne(WaveTrack * track,
|
|||||||
|
|
||||||
//Processing succeeded. copy the newly-changed samples back
|
//Processing succeeded. copy the newly-changed samples back
|
||||||
//onto the track.
|
//onto the track.
|
||||||
track->Set((samplePtr)buffer1.get(), floatSample, s - samples1, samples1);
|
if (mSecondPassDisabled || mPass != 0) {
|
||||||
|
outTrack->Set((samplePtr)buffer1.get(), floatSample, s - samples1, samples1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
outTrack->Append((samplePtr)buffer1.get(), floatSample, samples1);
|
||||||
|
outTrack->Flush();
|
||||||
|
}
|
||||||
|
|
||||||
//Return true because the effect processing succeeded.
|
//Return true because the effect processing succeeded.
|
||||||
return true;
|
return true;
|
||||||
|
@ -75,8 +75,11 @@ protected:
|
|||||||
int mPass;
|
int mPass;
|
||||||
bool mSecondPassDisabled;
|
bool mSecondPassDisabled;
|
||||||
|
|
||||||
|
std::shared_ptr<TrackList> mWorkTracks;
|
||||||
|
std::shared_ptr<TrackList> *mTrackLists[2];
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool ProcessOne(WaveTrack * t,
|
bool ProcessOne(WaveTrack * t, WaveTrack * outTrack,
|
||||||
sampleCount start, sampleCount end);
|
sampleCount start, sampleCount end);
|
||||||
bool ProcessPass() override;
|
bool ProcessPass() override;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user