/* * FadePlugIn.java * Eisenkraut * * Copyright (c) 2004-2016 Hanns Holger Rutz. All rights reserved. * * This software is published under the GNU General Public License v3+ * * * For further information, please contact Hanns Holger Rutz at * contact@sciss.de */ package de.sciss.eisenkraut.render; import de.sciss.eisenkraut.gui.CurvePanel; import de.sciss.eisenkraut.io.BlendContext; import de.sciss.io.Span; import javax.swing.*; import java.awt.*; import java.awt.geom.CubicCurve2D; import java.io.IOException; public abstract class FadePlugIn extends AbstractRenderPlugIn { private final boolean isFadeIn; // true for fade-in, false for fade-out protected static final String KEY_BLENDING = "blend"; private RenderConsumer prConsumer; private Span prTotalSpan; private BlendContext prBlend; private float[][] prBuf; protected FadePlugIn( boolean isFadeIn ) { super(); this.isFadeIn = isFadeIn; } public boolean hasUserParameters() { return true; } public JComponent getSettingsView(RenderContext context) { final CubicCurve2D basicShape = new CubicCurve2D.Double( 0.0, isFadeIn ? 0.0 : 1.0, 0.5, 0.5, 0.5, 0.5, 1.0, isFadeIn ? 1.0 : 0.0); final JPanel p = new JPanel(new BorderLayout()); CurvePanel curvePanel = new CurvePanel(new CubicCurve2D[]{basicShape}, prefs); curvePanel.setPreferredSize(new Dimension(162, 162)); p.add(curvePanel, BorderLayout.CENTER); return p; } public boolean producerBegin( RenderSource source ) throws IOException { prConsumer = source.context.getConsumer(); prTotalSpan = source.context.getTimeSpan(); // prBlend = new BlendContext( prTotalSpan.getLength(), CurvePanel.getControlPoints( prefs )); prBlend = new BlendContext( prTotalSpan.getLength(), 0, CurvePanel.getControlPoints( prefs )); prBuf = new float[ source.numAudioChannels ][]; return prConsumer.consumerBegin( source ); } public boolean producerRender( RenderSource source ) throws IOException { for( int ch = 0; ch < source.numAudioChannels; ch++ ) { if( source.audioTrackMap[ ch ]) prBuf[ ch ] = source.audioBlockBuf[ ch ]; } if( isFadeIn ) { prBlend.fadeIn( source.blockSpan.start - prTotalSpan.start, prBuf, source.audioBlockBufOff, prBuf, source.audioBlockBufOff, source.audioBlockBufLen ); } else { prBlend.fadeOut( source.blockSpan.start - prTotalSpan.start, prBuf, source.audioBlockBufOff, prBuf, source.audioBlockBufOff, source.audioBlockBufLen ); } return prConsumer.consumerRender( source ); } }