| 128 | } |
| 129 | |
| 130 | bool ClickRemovalBase::ProcessOne( |
| 131 | int count, WaveChannel& track, sampleCount start, sampleCount len) |
| 132 | { |
| 133 | if (len <= windowSize / 2) |
| 134 | { |
| 135 | using namespace BasicUI; |
| 136 | ShowMessageBox( |
| 137 | XO("Selection must be larger than %d samples.").Format(windowSize / 2), |
| 138 | MessageBoxOptions {}.IconStyle(Icon::Error)); |
| 139 | return false; |
| 140 | } |
| 141 | |
| 142 | auto idealBlockLen = track.GetMaxBlockSize() * 4; |
| 143 | if (idealBlockLen % windowSize != 0) |
| 144 | idealBlockLen += (windowSize - (idealBlockLen % windowSize)); |
| 145 | |
| 146 | bool bResult = true; |
| 147 | decltype(len) s = 0; |
| 148 | Floats buffer { idealBlockLen }; |
| 149 | Floats datawindow { windowSize }; |
| 150 | while ((len - s) > windowSize / 2) |
| 151 | { |
| 152 | auto block = limitSampleBufferSize(idealBlockLen, len - s); |
| 153 | track.GetFloats(buffer.get(), start + s, block); |
| 154 | for (decltype(block) i = 0; i + windowSize / 2 < block; |
| 155 | i += windowSize / 2) |
| 156 | { |
| 157 | auto wcopy = std::min(windowSize, block - i); |
| 158 | for (decltype(wcopy) j = 0; j < wcopy; ++j) |
| 159 | datawindow[j] = buffer[i + j]; |
| 160 | for (auto j = wcopy; j < windowSize; ++j) |
| 161 | datawindow[j] = 0; |
| 162 | mbDidSomething |= RemoveClicks(windowSize, datawindow.get()); |
| 163 | for (decltype(wcopy) j = 0; j < wcopy; ++j) |
| 164 | buffer[i + j] = datawindow[j]; |
| 165 | } |
| 166 | |
| 167 | if (mbDidSomething) |
| 168 | { |
| 169 | // RemoveClicks() actually did something. |
| 170 | if (!track.SetFloats(buffer.get(), start + s, block)) |
| 171 | { |
| 172 | bResult = false; |
| 173 | break; |
| 174 | } |
| 175 | } |
| 176 | s += block; |
| 177 | if (TrackProgress(count, s.as_double() / len.as_double())) |
| 178 | { |
| 179 | bResult = false; |
| 180 | break; |
| 181 | } |
| 182 | } |
| 183 | return bResult; |
| 184 | } |
| 185 | |
| 186 | bool ClickRemovalBase::RemoveClicks(size_t len, float* buffer) |
| 187 | { |
nothing calls this directly
no test coverage detected