/**
* Created : Apr 10, 2012
*
* @author pquiring
*/
import java.awt.*;
import java.awt.event.*;
import javaforce.*;
import javaforce.linux.*;
public class SoundWindow extends javax.swing.JWindow {
public static int volume = 50;
public static boolean muted = false;
public static int sinkIdx = -1;
/**
* Creates new form CalendarWindow
*/
public SoundWindow(Point pos, int width) {
super();
initComponents();
JFLog.log("soundWindow:pos=" + pos.x + "," + pos.y);
Dimension d = getPreferredSize();
setLocation(pos.x - (d.width - width)/2, pos.y - d.height - 5);
setAlwaysOnTop(true);
toFront();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
slider = new javax.swing.JSlider();
mute = new javax.swing.JToggleButton();
slider.setOrientation(javax.swing.JSlider.VERTICAL);
slider.setValue(volume);
slider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sliderStateChanged(evt);
}
});
mute.setSelected(muted);
mute.setText("X");
mute.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
muteStateChanged(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(mute))
.addGroup(layout.createSequentialGroup()
.addGap(25, 25, 25)
.addComponent(slider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(slider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(mute)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void sliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sliderStateChanged
if (sinkIdx == -1) return;
volume = slider.getValue();
try {
Runtime.getRuntime().exec(new String[] {"pactl","set-sink-volume","" + sinkIdx,"" + volume + "%"});
} catch (Exception e) {
JFLog.log(e);
}
}//GEN-LAST:event_sliderStateChanged
private void muteStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_muteStateChanged
if (sinkIdx == -1) return;
muted = mute.isSelected();
try {
Runtime.getRuntime().exec(new String[] {"pactl","set-sink-mute","" + sinkIdx,muted ? "1" : "0"});
} catch (Exception e) {
JFLog.log(e);
}
}//GEN-LAST:event_muteStateChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JToggleButton mute;
private javax.swing.JSlider slider;
// End of variables declaration//GEN-END:variables
public void addMouseListener(MouseListener ml) {
super.addMouseListener(ml);
slider.addMouseListener(ml);
mute.addMouseListener(ml);
}
public void mute() {
mute.setSelected(!mute.isSelected());
}
public void adjustVolume(int delta) {
int newLevel = slider.getValue() + delta;
if (newLevel < 0) newLevel = 0;
if (newLevel > 100) newLevel = 100;
slider.setValue(newLevel);
}
public static void reload(Dock.Config config) {
PulseAudio.list();
if (PulseAudio.sinks.size() > 0) {
PulseAudio.Sink sink = PulseAudio.sinks.get(0);
volume = sink.volume;
muted = sink.muted;
sinkIdx = sink.idx;
JFLog.log("Sound:Sink idx=" + sinkIdx);
}
config.card = new Dock.Card[PulseAudio.cards.size()];
for(int a=0;a<PulseAudio.cards.size();a++) {
config.card[a] = new Dock.Card();
config.card[a].idx = PulseAudio.cards.get(a).idx;
config.card[a].activeProfile = PulseAudio.cards.get(a).activeProfile;
}
config.sink = new Dock.Sink[PulseAudio.sinks.size()];
for(int a=0;a<PulseAudio.sinks.size();a++) {
config.sink[a] = new Dock.Sink();
config.sink[a].idx = PulseAudio.sinks.get(a).idx;
config.sink[a].activePort = PulseAudio.sinks.get(a).activePort;
config.sink[a].volume = PulseAudio.sinks.get(a).volume;
}
config.source = new Dock.Source[PulseAudio.sources.size()];
for(int a=0;a<PulseAudio.sources.size();a++) {
config.source[a] = new Dock.Source();
config.source[a].idx = PulseAudio.sources.get(a).idx;
config.source[a].activePort = PulseAudio.sources.get(a).activePort;
config.source[a].volume = PulseAudio.sources.get(a).volume;
}
}
public static void init(Dock.Config config) {
if (config == null) return;
if (config.card != null) {
for(int a=0;a<config.card.length;a++) {
try {
ShellProcess sp = new ShellProcess();
sp.run(new String[] {"pactl","set-card-profile","" + config.card[a].idx, config.card[a].activeProfile}, true);
if (sp.getErrorLevel() != 0) {
JFLog.log("Failed to set card profile");
}
} catch (Exception e) {
JFLog.log(e);
}
}
}
if (config.sink != null) {
for(int a=0;a<config.sink.length;a++) {
try {
ShellProcess sp = new ShellProcess();
sp.run(new String[] {"pactl","set-sink-port","" + config.sink[a].idx, config.sink[a].activePort}, true);
if (sp.getErrorLevel() != 0) {
JFLog.log("Failed to set sink port");
}
sp.run(new String[] {"pactl","set-sink-volume","" + config.sink[a].idx, config.sink[a].volume + "%"}, true);
if (sp.getErrorLevel() != 0) {
JFLog.log("Failed to set sink port");
}
} catch (Exception e) {
JFLog.log(e);
}
}
}
if (config.source != null) {
for(int a=0;a<config.source.length;a++) {
try {
ShellProcess sp = new ShellProcess();
sp.run(new String[] {"pactl","set-source-port","" + config.source[a].idx, config.source[a].activePort}, true);
if (sp.getErrorLevel() != 0) {
JFLog.log("Failed to set source port");
}
sp.run(new String[] {"pactl","set-source-volume","" + config.source[a].idx, config.source[a].volume + "%"}, true);
if (sp.getErrorLevel() != 0) {
JFLog.log("Failed to set source port");
}
} catch (Exception e) {
JFLog.log(e);
}
}
}
reload(config);
}
public static void setVolume(int v) {
volume = v;
}
}