/*
* PeakMeterManager.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.gui;
import java.awt.EventQueue;
import javax.swing.JComponent;
import de.sciss.app.DynamicAncestorAdapter;
import de.sciss.app.DynamicListening;
import de.sciss.jcollider.Bus;
import de.sciss.jcollider.Group;
import de.sciss.jcollider.Server;
import de.sciss.net.OSCBundle;
import de.sciss.eisenkraut.net.GroupSync;
import de.sciss.eisenkraut.net.GroupAnySync;
import de.sciss.eisenkraut.net.MeterManager;
import de.sciss.gui.PeakMeterView;
public class PeakMeterManager
implements PeakMeterView, DynamicListening, GroupSync.Slave {
private final MeterManager mm;
private final DynamicAncestorAdapter daa;
private PeakMeterView view = null;
private boolean added; // registered with the MeterManager and NodeWatcher
private Server s = null;
private Group g = null;
private int[] channels = null;
private boolean task = false; // whether currently metering
private boolean showing = false; // whether level meters are displayed
private final GroupAnySync anySync;
public PeakMeterManager( MeterManager mm )
{
this.mm = mm;
daa = new DynamicAncestorAdapter( this );
anySync = new GroupAnySync();
anySync.addSlave( this );
}
// ----------------- PeakMeterView interface -----------------
public int getNumChannels()
{
return (view != null) ? view.getNumChannels() : 0;
}
public boolean meterUpdate( float[] peakRMSPairs, int offset, long time ) {
final boolean dirty;
dirty = view != null && view.meterUpdate(peakRMSPairs, offset, time);
if (!task && !dirty) {
checkStopTasking();
}
return dirty;
}
public void dispose() {
if (view != null) {
view.dispose();
view = null;
}
anySync.dispose();
showing = false;
if (daa.getComponent() != null) daa.remove();
if (added) {
mm.removeListener(this);
added = false;
}
s = null;
g = null;
channels = null;
}
public void clearMeter()
{
if( view != null ) view.clearMeter();
}
protected void checkStopTasking() {
if (added && !task) {
mm.setListenerTask(this, false, null);
}
}
public void setDynamicComponent(JComponent c) {
if (!EventQueue.isDispatchThread()) throw new IllegalMonitorStateException();
if (daa.getComponent() != null) {
daa.remove();
}
daa.addTo(c);
}
public void setGroup(Group g) {
this.g = g;
}
public void clearInputs() {
setInputs(null, null);
}
public void setInputs(Bus b) {
final int[] newChannels = new int[b.getNumChannels()];
for (int i = 0, j = b.getIndex(); i < newChannels.length; ) {
newChannels[i++] = j++;
}
setInputs(b.getServer(), newChannels);
}
public void setInputs(Server s, int[] channels) {
if (!EventQueue.isDispatchThread()) throw new IllegalMonitorStateException();
if (added) {
mm.removeListener(this);
added = false;
}
this.s = s;
this.channels = channels;
checkAdded();
}
private void checkAdded() {
if (added) {
if ((s == null) || !showing) {
mm.removeListener(this);
added = false;
clearMeter();
}
} else {
if ((s != null) && showing) {
mm.addListener(this, s, channels, g, task);
added = true;
}
}
}
public void setView(PeakMeterView view) {
if (!EventQueue.isDispatchThread()) throw new IllegalMonitorStateException();
this.view = view;
}
public void addTaskSync(GroupSync n) {
anySync.addSync(n);
}
public void removeTaskSync(GroupSync n) {
anySync.removeSync(n);
}
public void clearTaskSyncs() {
if (!EventQueue.isDispatchThread()) throw new IllegalMonitorStateException();
anySync.clearSyncs();
updateTask(null);
}
private void updateTask(OSCBundle bndl) {
final boolean newTask = anySync.isActive();
if (newTask != task) {
task = newTask;
if (added) {
if (task) {
mm.setListenerTask(this, true, bndl);
}
}
}
}
// -------------- GroupSync.Slave interface --------------
public void groupActivate( OSCBundle bndl )
{
updateTask( bndl );
}
public void groupDeactivate( OSCBundle bndl )
{
updateTask( bndl );
}
// -------------- DynamicListening interface --------------
public void startListening()
{
showing = true;
updateTask( null );
checkAdded();
}
public void stopListening()
{
showing = false;
checkAdded();
updateTask( null );
}
}