Package de.sciss.gui

Class PeakMeter

  • All Implemented Interfaces:
    PeakMeterView, Disposable, java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.swing.SwingConstants

    public class PeakMeter
    extends javax.swing.JComponent
    implements PeakMeterView, Disposable, javax.swing.SwingConstants
    A level (volume) meter GUI component. The component is a vertical bar displaying a green-to-reddish bar for the peak amplitude and a blue bar for RMS value.

    To animate the bar, call setPeakAndRMS at a regular interval, typically around every 30 milliseconds for a smooth look.

    See Also:
    Serialized Form
    • Nested Class Summary

      • Nested classes/interfaces inherited from class javax.swing.JComponent

        javax.swing.JComponent.AccessibleJComponent
      • Nested classes/interfaces inherited from class java.awt.Container

        java.awt.Container.AccessibleAWTContainer
      • Nested classes/interfaces inherited from class java.awt.Component

        java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
    • Field Summary

      Fields 
      Modifier and Type Field Description
      static boolean animationNeedsSync
      true for bug: https://stackoverflow.com/questions/19480076
      static int DEFAULT_HOLD_DUR  
      • Fields inherited from class javax.swing.JComponent

        listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
      • Fields inherited from class java.awt.Component

        accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • Fields inherited from interface java.awt.image.ImageObserver

        ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • Fields inherited from interface javax.swing.SwingConstants

        BOTTOM, CENTER, EAST, HORIZONTAL, LEADING, LEFT, NEXT, NORTH, NORTH_EAST, NORTH_WEST, PREVIOUS, RIGHT, SOUTH, SOUTH_EAST, SOUTH_WEST, TOP, TRAILING, VERTICAL, WEST
    • Constructor Summary

      Constructors 
      Constructor Description
      PeakMeter()  
      PeakMeter​(int orient)
      Creates a new level meter with default ballistics and bounds.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void clearHold()
      Clears the peak hold indicator.
      void clearMeter()
      Clears the peak, peak hold and rms values immediately (without ballistics).
      void dispose()  
      float getHoldDecibels()  
      int getNumChannels()  
      float getPeakDecibels()  
      boolean meterUpdate​(float[] peakRMSPairs, int offset, long time)  
      void paintComponent​(java.awt.Graphics g)  
      protected void recalcPrefSize()  
      void setHoldDuration​(int millis)
      Sets the peak indicator hold time.
      void setHoldPainted​(boolean onOff)
      Decides whether the peak indicator should be painted or not.
      void setOrientation​(int orient)  
      boolean setPeak​(float newPeak)
      Updates the meter.
      boolean setPeakAndRMS​(float peak, float rms)
      Updates the meter.
      boolean setPeakAndRMS​(float newPeak, float newRMS, long time)  
      void setRefreshParent​(boolean onOff)  
      void setRMSPainted​(boolean onOff)
      Decides whether the blue RMS bar should be painted or not.
      void setTicks​(int ticks)  
      • Methods inherited from class javax.swing.JComponent

        addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getUI, getUIClassID, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintImmediately, paintImmediately, paramString, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update, updateUI
      • Methods inherited from class java.awt.Container

        add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree
      • Methods inherited from class java.awt.Component

        action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getAccessibleContext, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    • Field Detail

      • animationNeedsSync

        public static final boolean animationNeedsSync
        true for bug: https://stackoverflow.com/questions/19480076
    • Constructor Detail

      • PeakMeter

        public PeakMeter()
      • PeakMeter

        public PeakMeter​(int orient)
        Creates a new level meter with default ballistics and bounds.
    • Method Detail

      • setOrientation

        public void setOrientation​(int orient)
      • meterUpdate

        public boolean meterUpdate​(float[] peakRMSPairs,
                                   int offset,
                                   long time)
        Specified by:
        meterUpdate in interface PeakMeterView
      • setHoldPainted

        public void setHoldPainted​(boolean onOff)
        Decides whether the peak indicator should be painted or not. By default the indicator is painted.
        Parameters:
        onOff - true to have the indicator painted, false to switch it off
      • setRMSPainted

        public void setRMSPainted​(boolean onOff)
        Decides whether the blue RMS bar should be painted or not. By default the bar is painted.
        Parameters:
        onOff - true to have the RMS values painted, false to switch them off
      • clearMeter

        public void clearMeter()
        Clears the peak, peak hold and rms values immediately (without ballistics). This way the component can be reset when the metering task is stopped without waiting for the bars to fall down.
        Specified by:
        clearMeter in interface PeakMeterView
      • setTicks

        public void setTicks​(int ticks)
      • setRefreshParent

        public void setRefreshParent​(boolean onOff)
      • setHoldDuration

        public void setHoldDuration​(int millis)
        Sets the peak indicator hold time. Defaults to 1800 milliseconds.
        Parameters:
        millis - new peak hold time in milliseconds. Note that the special value -1 means infinite peak hold. In this case, to clear the indicator, call clearHold
      • clearHold

        public void clearHold()
        Clears the peak hold indicator. Note that you will need to call setPeakAndRMS successively for the graphics to be updated.
      • recalcPrefSize

        protected void recalcPrefSize()
      • getPeakDecibels

        public float getPeakDecibels()
      • getHoldDecibels

        public float getHoldDecibels()
      • setPeakAndRMS

        public boolean setPeakAndRMS​(float peak,
                                     float rms)
        Updates the meter. This will call the component's paint method to visually reflect the new values. Call this method regularly for a steady animated meter.

        If you have switched off RMS painted, you may want to call setPeak alternatively.

        When your audio engine is idle, you may want to stop meter updates. You can use the following formula to calculate the maximum delay of the meter display to be safely at minimum levels after starting to send zero amplitudes:

        • for peak hold indicator not painted : delay[sec] = abs(minAmplitude[dB]) / fallTime[dB/sec] + updatePeriod[sec]
        • for painted peak hold : the maximum of the above value and delay[sec] = abs(minAmplitude[dB]) / holdFallTime[dB/sec] + holdTime[sec] + updatePeriod[sec]

        Therefore, for the default values of 1.8 sec hold time, 15 dB/sec hold fall time and -40 dB minimum amplitude, at a display period of 30 milliseconds, this yields a delay of around 4.5 seconds. Accounting for jitter due to GUI slowdown, in ths case it should be safe to stop meter updates five seconds after the audio engine stopped. synchronization: this method is thread safe

        Parameters:
        peak - peak amplitude (linear) between zero and one.
        rms - mean-square amplitude (linear). note : despite the name, this is considered mean-square, not root-mean-square. this method does the appropriate conversion on the fly!
      • setPeakAndRMS

        public boolean setPeakAndRMS​(float newPeak,
                                     float newRMS,
                                     long time)
      • setPeak

        public boolean setPeak​(float newPeak)
        Updates the meter. This will call the component's paint method to visually reflect the peak amplitude. Call this method regularly for a steady animated meter. The RMS value is not changed, so this method is appropriate when having RMS painting turned off. synchronization: this method is thread safe
        Parameters:
        newPeak - peak amplitude (linear) between zero and one.
      • paintComponent

        public void paintComponent​(java.awt.Graphics g)
        Overrides:
        paintComponent in class javax.swing.JComponent