+
+void
+TransientDetector::update_positions (Readable* src, uint32_t channel, AnalysisFeatureList& positions)
+{
+ int const buff_size = 1024;
+ int const step_size = 64;
+
+ Sample* data = new Sample[buff_size];
+
+ AnalysisFeatureList::iterator i = positions.begin();
+
+ while (i != positions.end()) {
+
+ /* read from source */
+ framecnt_t const to_read = buff_size;
+
+ if (src->read (data, (*i) - buff_size, to_read, channel) != to_read) {
+ break;
+ }
+
+ // Simple heuristic for locating approx correct cut position.
+
+ for (int j = 0; j < (buff_size - step_size); ) {
+
+ Sample const s = abs (data[j]);
+ Sample const s2 = abs (data[j + step_size]);
+
+ if ((s2 - s) > threshold) {
+ //cerr << "Thresh exceeded. Moving pos from: " << (*i) << " to: " << (*i) - buff_size + (j + 16) << endl;
+ (*i) = (*i) - buff_size + (j + 24);
+ break;
+ }
+
+ j += step_size;
+ }
+
+ ++i;
+ }
+
+ delete [] data;
+}