package com.nerdscentral.audio.time; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import com.nerdscentral.audio.core.SFConstants; import com.nerdscentral.audio.core.SFData; import com.nerdscentral.audio.core.SFSignal; import com.nerdscentral.sython.Caster; import com.nerdscentral.sython.SFMaths; import com.nerdscentral.sython.SFPL_Operator; import com.nerdscentral.sython.SFPL_RuntimeException; public class SF_MultipleTruncateSilence implements SFPL_Operator { private static final long serialVersionUID = 1L; @Override public String Word() { return Messages.getString("SF_TruncateSilence.1"); //$NON-NLS-1$ } // @SuppressWarnings("resource") @Override public Object Interpret(Object input) throws SFPL_RuntimeException { List<Object> lin = Caster.makeBunch(input); List<Object> din = Caster.makeBunch(lin.get(0)); List<SFSignal> sdin = new ArrayList<>(din.size()); List<SFSignal> outList = new ArrayList<>(); for (int c = 0; c < din.size(); ++c) { sdin.add(Caster.makeSFSignal(din.get(c))); } SFSignal data = sdin.get(0); double threshold = SFConstants.fromDBs(Caster.makeDouble(lin.get(1))); int len = (int) (Caster.makeDouble(lin.get(2)) * SFConstants.SAMPLE_RATE_MS); int inLen = data.getLength(); List<List<double[]>> segments = new ArrayList<>(); for (int c = 0; c < din.size(); ++c) { segments.add(new LinkedList<double[]>()); } int outLen = 0; for (int index = 0; index < inLen;) { int diff = inLen - index; diff = diff > len ? len : diff; double max = 0; for (int inner = 0; inner < diff;) { double x; x = data.getSample(index); x = SFMaths.abs(x); if (x > max) max = x; ++inner; ++index; } if (max > threshold) { int channel = 0; double[] segment = new double[diff]; for (List<double[]> channelSegs : segments) { index -= diff; SFSignal otherData = sdin.get(channel); for (int inner = 0; inner < diff;) { segment[inner] = otherData.getSample(index); ++inner; ++index; } channelSegs.add(segment); } } outLen += diff; } for (int c = 0; c < segments.size(); ++c) { SFSignal nData = SFData.build(outLen); outList.add(nData); } int channel = 0; for (List<double[]> channelSegs : segments) { int index = 0; for (double[] segment : channelSegs) { SFSignal outData = outList.get(channel); for (int inner = 0; inner < segment.length;) { outData.setSample(index, segment[inner]); ++index; ++inner; } } ++channel; } return outList; } }