1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-13 15:17:42 +02:00

incremental improvement to at least alert the user in cases where this effect obviously does nothing

This commit is contained in:
v.audacity 2013-12-15 03:57:36 +00:00
parent 4a2ec16fc6
commit dc0884c7f5

View File

@ -155,30 +155,34 @@ bool EffectClickRemoval::Process()
return bGoodResult; return bGoodResult;
} }
bool EffectClickRemoval::ProcessOne(int count, WaveTrack * track, bool EffectClickRemoval::ProcessOne(int count, WaveTrack * track, sampleCount start, sampleCount len)
sampleCount start, sampleCount len)
{ {
bool rc = true; // This is an incremental improvement. Prior to this, if (len <= windowSize/2), there was no change
sampleCount s = 0; // in the result, but no alert to the user.
sampleCount idealBlockLen = track->GetMaxBlockSize() * 4; if (len <= windowSize/2)
{
wxMessageBox(wxString::Format(_("Error: Selection must be larger than %d samples"), windowSize/2));
return false;
}
sampleCount idealBlockLen = track->GetMaxBlockSize() * 4;
if (idealBlockLen % windowSize != 0) if (idealBlockLen % windowSize != 0)
idealBlockLen += (windowSize - (idealBlockLen % windowSize)); idealBlockLen += (windowSize - (idealBlockLen % windowSize));
bool bResult = true;
sampleCount s = 0;
float *buffer = new float[idealBlockLen]; float *buffer = new float[idealBlockLen];
float *datawindow = new float[windowSize]; float *datawindow = new float[windowSize];
while ((s < len) && ((len - s) > windowSize/2))
int i; {
while((s < len)&&((len-s)>(windowSize/2))) {
sampleCount block = idealBlockLen; sampleCount block = idealBlockLen;
if (s + block > len) if (s + block > len)
block = len - s; block = len - s;
track->Get((samplePtr) buffer, floatSample, start + s, block); track->Get((samplePtr) buffer, floatSample, start + s, block);
for(i=0; i<(block-windowSize/2); i+=windowSize/2) { for (int i=0; i < (block-windowSize/2); i += windowSize/2)
{
int wcopy = windowSize; int wcopy = windowSize;
if (i + wcopy > block) if (i + wcopy > block)
wcopy = block - i; wcopy = block - i;
@ -200,7 +204,7 @@ bool EffectClickRemoval::ProcessOne(int count, WaveTrack * track,
s += block; s += block;
if (TrackProgress(count, s / (double) len)) { if (TrackProgress(count, s / (double) len)) {
rc = false; bResult = false;
break; break;
} }
} }
@ -208,7 +212,7 @@ bool EffectClickRemoval::ProcessOne(int count, WaveTrack * track,
delete[] buffer; delete[] buffer;
delete[] datawindow; delete[] datawindow;
return rc; return bResult;
} }
void EffectClickRemoval::RemoveClicks(sampleCount len, float *buffer) void EffectClickRemoval::RemoveClicks(sampleCount len, float *buffer)
@ -265,6 +269,12 @@ void EffectClickRemoval::RemoveClicks(sampleCount len, float *buffer)
float lv = buffer[left]; float lv = buffer[left];
float rv = buffer[i+ww+s2]; float rv = buffer[i+ww+s2];
for(j=left; j<i+ww+s2; j++) { for(j=left; j<i+ww+s2; j++) {
// FIX-ME: In many (most?) cases, this is never met,
// so it needs to be tracked and alerted if never met in any
// iterative calls to this method.
// Need this method to return a bool,
// and if no 'did something' result in iterative calls,
// fail the effect.
buffer[j]= (rv*(j-left) + lv*(i+ww+s2-j))/(float)(i+ww+s2-left); buffer[j]= (rv*(j-left) + lv*(i+ww+s2-j))/(float)(i+ww+s2-left);
b2[j] = buffer[j]*buffer[j]; b2[j] = buffer[j]*buffer[j];
} }