/*
* @(#)GainControlComponent.java 1.12 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.media.ui;
import java.lang.reflect.Method;
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.*;
import com.sun.media.controls.*;
import javax.media.GainChangeListener;
import javax.media.GainControl;
import javax.media.GainChangeEvent;
import com.sun.media.JMFSecurity;
import com.sun.media.JMFSecurityManager;
import com.sun.media.util.*;
import com.sun.media.renderer.audio.AudioRenderer;
public class GainControlComponent extends Container implements GainChangeListener {
private static JMFSecurity jmfSecurity = null;
private static boolean securityPrivelege=false;
private Method m[] = new Method[1];
private Class cl[] = new Class[1];
private Object args[][] = new Object[1][0];
static {
try {
jmfSecurity = JMFSecurityManager.getJMFSecurity();
securityPrivelege = true;
} catch (SecurityException e) {
}
}
public GainControlComponent(GainControl gain) {
GridBagLayout gbl;
GridBagConstraints gbc = new GridBagConstraints();
this.gain = gain;
gain.addGainChangeListener(this);
setLayout(gbl = new GridBagLayout());
if (canChangeVolume()) {
gbc.insets = new Insets(0, 0, 0, 0);
gbc.gridheight = 2;
muteButton = new MuteButton();
add(muteButton);
gbl.setConstraints(muteButton, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
upButton = new VolumeButton("volumeUp.gif",
"volumeUp-active.gif",
"volumeUp-pressed.gif",
"volumeUp-disabled.gif",
"Increase volume",
VolumeIncrement);
add(upButton);
gbl.setConstraints(upButton, gbc);
gbc.gridy = 1;
downButton = new VolumeButton("volumeDown.gif",
"volumeDown-active.gif",
"volumeDown-pressed.gif",
"volumeDown-disabled.gif",
"Decrease volume",
-VolumeIncrement);
add(downButton);
gbl.setConstraints(downButton, gbc);
} else {
fUseVolumeControl=false;
muteButton = new MuteButton();
add(muteButton);
}
}
public void gainChange(GainChangeEvent e) {
if (fUseVolumeControl==true) {
float level = e.getLevel();
upButton.setEnabled(level < 1.0f);
downButton.setEnabled(level > 0.0f);
}
muteButton.setValue(e.getMute());
}
protected boolean canChangeVolume() {
if ( (gain==null) || (gain.getLevel()<0.0f) ) {
return false;
}
return true;
}
protected GainControl gain = null;
protected MuteButton muteButton = null;
protected VolumeButton upButton = null;
protected VolumeButton downButton = null;
protected boolean fUseVolumeControl=true;
protected static final float VolumeIncrement = 0.05f;
protected static final int RepeatDelay = 100;
class VolumeButton extends ButtonComp {
public VolumeButton(String imgNormal,
String imgActive,
String imgDown,
String imgDisabled,
String tip,
float increment) {
super ( tip, imgNormal, imgActive, imgDown, imgDisabled,
imgNormal, imgActive, imgDown, imgDisabled );
this.increment = increment;
}
public void action() {
float level;
if (gain != null) {
level = gain.getLevel() + increment;
if (level < 0.0f) {
level = 0.0f;
} else if (level > 1.0f) {
level = 1.0f;
}
gain.setLevel(level);
gain.setMute(false);
}
}
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
if (repeater == null) {
repeater = new Thread() {
public void run() {
if (gain != null) {
float lastLevel = gain.getLevel();
float newLevel;
int unchangedCount = 0;
while (mouseDown && (unchangedCount < 5)) {
try {
Thread.sleep(RepeatDelay);
try {
action();
} catch (Exception ex) {
mouseDown = false;
}
newLevel = gain.getLevel();
if (lastLevel == newLevel) {
unchangedCount++;
} else {
lastLevel = newLevel;
unchangedCount = 0;
}
} catch (InterruptedException ex) {
unchangedCount = 10;
}
}
}
}
};
repeater.start();
}
}
public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
if (repeater != null) {
Thread killIt = repeater;
repeater = null;
boolean permission = true;
// try {
// JMFSecurity.enablePrivilege.invoke(JMFSecurity.privilegeManager,
// JMFSecurity.threadArgs);
// } catch (SecurityException sexc) {
// permission = false;
// } catch (Exception exc) {
// }
if ( securityPrivelege ) {
if (jmfSecurity != null) {
try {
jmfSecurity.requestPermission(m, cl, args, JMFSecurity.THREAD);
m[0].invoke(cl[0], args[0]);
} catch (Exception ex) {
if (JMFSecurityManager.DEBUG) {
System.err.println("Unable to get " + permission +
" privilege " + ex);
}
permission = false;
}
}
} else {
permission = false;
}
if (permission) {
killIt.interrupt();
}
}
}
public void setEnabled(boolean enabled) {
if (enabled != isEnabled()) {
super.setEnabled(enabled);
mouseActivity();
}
}
protected float increment;
Thread repeater = null;
}
class MuteButton extends ButtonComp {
public MuteButton() {
super( "Mute audio", "audio.gif", "audio-active.gif",
"audio-pressed.gif", "audio-disabled.gif",
"mute.gif", "mute-active.gif",
"mute-pressed.gif", "audio-disabled.gif" );
}
public void action() {
if (gain != null) {
gain.setMute(!gain.getMute());
}
}
}
}
|