package jfconfig;
/**
* Created : Apr 11, 2012
*
* @author pquiring
*/
import javax.swing.*;
import javaforce.*;
import javaforce.linux.*;
public class SoundPanel extends javax.swing.JPanel {
/**
* Creates new form SoundPanel
*/
public SoundPanel() {
initComponents();
listAll();
}
/**
* 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() {
jToolBar1 = new javax.swing.JToolBar();
back = new javax.swing.JButton();
mute = new javax.swing.JToggleButton();
jButton1 = new javax.swing.JButton();
tabs = new javax.swing.JTabbedPane();
jPanel1 = new javax.swing.JPanel();
outputVolume = new javax.swing.JSlider();
jSplitPane2 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
outputList = new javax.swing.JList();
jScrollPane4 = new javax.swing.JScrollPane();
outputPorts = new javax.swing.JList();
jPanel2 = new javax.swing.JPanel();
inputVolume = new javax.swing.JSlider();
jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane2 = new javax.swing.JScrollPane();
inputList = new javax.swing.JList();
jScrollPane3 = new javax.swing.JScrollPane();
inputPorts = new javax.swing.JList();
jPanel3 = new javax.swing.JPanel();
jSplitPane3 = new javax.swing.JSplitPane();
jScrollPane5 = new javax.swing.JScrollPane();
cards = new javax.swing.JList();
jScrollPane6 = new javax.swing.JScrollPane();
profiles = new javax.swing.JList();
jToolBar1.setFloatable(false);
jToolBar1.setRollover(true);
back.setText("< Back");
back.setFocusable(false);
back.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
back.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
back.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
backActionPerformed(evt);
}
});
jToolBar1.add(back);
mute.setText("Mute");
mute.setFocusable(false);
mute.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
mute.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
mute.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
muteActionPerformed(evt);
}
});
jToolBar1.add(mute);
jButton1.setText("Set Default");
jButton1.setFocusable(false);
jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jToolBar1.add(jButton1);
tabs.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
tabsStateChanged(evt);
}
});
outputVolume.setOrientation(javax.swing.JSlider.VERTICAL);
outputVolume.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
outputVolumeStateChanged(evt);
}
});
jSplitPane2.setDividerLocation(250);
jSplitPane2.setResizeWeight(0.5);
outputList.setModel(outModel);
outputList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
outputListValueChanged(evt);
}
});
jScrollPane1.setViewportView(outputList);
jSplitPane2.setLeftComponent(jScrollPane1);
outputPorts.setModel(outportsModel);
jScrollPane4.setViewportView(outputPorts);
jSplitPane2.setRightComponent(jScrollPane4);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jSplitPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 558, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(outputVolume, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(outputVolume, javax.swing.GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)
.addComponent(jSplitPane2))
.addContainerGap())
);
tabs.addTab("Output", jPanel1);
inputVolume.setOrientation(javax.swing.JSlider.VERTICAL);
inputVolume.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
inputVolumeStateChanged(evt);
}
});
jSplitPane1.setDividerLocation(250);
jSplitPane1.setResizeWeight(0.5);
inputList.setModel(inModel);
inputList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
inputListValueChanged(evt);
}
});
jScrollPane2.setViewportView(inputList);
jSplitPane1.setLeftComponent(jScrollPane2);
inputPorts.setModel(inportsModel);
inputPorts.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jScrollPane3.setViewportView(inputPorts);
jSplitPane1.setRightComponent(jScrollPane3);
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 558, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(inputVolume, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(inputVolume, javax.swing.GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)
.addComponent(jSplitPane1))
.addContainerGap())
);
tabs.addTab("Input", jPanel2);
jSplitPane3.setDividerLocation(250);
cards.setModel(cardsModel);
cards.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
cards.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
cardsValueChanged(evt);
}
});
jScrollPane5.setViewportView(cards);
jSplitPane3.setLeftComponent(jScrollPane5);
profiles.setModel(profilesModel);
profiles.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jScrollPane6.setViewportView(profiles);
jSplitPane3.setRightComponent(jScrollPane6);
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jSplitPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 578, Short.MAX_VALUE)
.addContainerGap())
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jSplitPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)
.addContainerGap())
);
tabs.addTab("Cards", jPanel3);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(tabs)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tabs)
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
private void backActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backActionPerformed
ConfigApp.This.setPanel(new MainPanel());
}//GEN-LAST:event_backActionPerformed
private void outputVolumeStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_outputVolumeStateChanged
int idx = outputList.getSelectedIndex();
if (idx == -1) return;
int volume = outputVolume.getValue();
int sidx = PulseAudio.sinks.get(idx).idx;
try {
Runtime.getRuntime().exec(new String[] {"pactl","set-sink-volume","" + sidx,"" + volume + "%"});
} catch (Exception e) {
JFLog.log(e);
}
PulseAudio.Sink sink = PulseAudio.sinks.get(idx);
sink.volume = volume;
ConfigApp.jbusClient.call("org.jflinux.jdesktop." + System.getenv("JID"), "soundSinkVolumeChanged", sidx + ",\"" + volume + "\"");
}//GEN-LAST:event_outputVolumeStateChanged
private void inputVolumeStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_inputVolumeStateChanged
int idx = inputList.getSelectedIndex();
if (idx == -1) return;
int volume = inputVolume.getValue();
int sidx = PulseAudio.sources.get(idx).idx;
try {
Runtime.getRuntime().exec(new String[] {"pactl","set-source-volume","" + sidx,"" + volume + "%"});
} catch (Exception e) {
JFLog.log(e);
}
PulseAudio.Source source = PulseAudio.sources.get(idx);
source.volume = volume;
ConfigApp.jbusClient.call("org.jflinux.jdesktop." + System.getenv("JID"), "soundSourceVolumeChanged", sidx + ",\"" + volume + "\"");
}//GEN-LAST:event_inputVolumeStateChanged
private void outputListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_outputListValueChanged
int idx = outputList.getSelectedIndex();
if (idx == -1) return;
listOutPorts(idx);
PulseAudio.Sink sink = PulseAudio.sinks.get(idx);
outputVolume.setValue(sink.volume);
updateMuteButton();
}//GEN-LAST:event_outputListValueChanged
private void inputListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_inputListValueChanged
int idx = inputList.getSelectedIndex();
if (idx == -1) return;
listInPorts(idx);
PulseAudio.Source source = PulseAudio.sources.get(idx);
inputVolume.setValue(source.volume);
updateMuteButton();
}//GEN-LAST:event_inputListValueChanged
private void tabsStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_tabsStateChanged
updateMuteButton();
}//GEN-LAST:event_tabsStateChanged
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
setDefault();
}//GEN-LAST:event_jButton1ActionPerformed
private void muteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_muteActionPerformed
toggleMute();
}//GEN-LAST:event_muteActionPerformed
private void cardsValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_cardsValueChanged
listProfiles();
}//GEN-LAST:event_cardsValueChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton back;
private javax.swing.JList cards;
private javax.swing.JList inputList;
private javax.swing.JList inputPorts;
private javax.swing.JSlider inputVolume;
private javax.swing.JButton jButton1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JScrollPane jScrollPane5;
private javax.swing.JScrollPane jScrollPane6;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JSplitPane jSplitPane2;
private javax.swing.JSplitPane jSplitPane3;
private javax.swing.JToolBar jToolBar1;
private javax.swing.JToggleButton mute;
private javax.swing.JList outputList;
private javax.swing.JList outputPorts;
private javax.swing.JSlider outputVolume;
private javax.swing.JList profiles;
private javax.swing.JTabbedPane tabs;
// End of variables declaration//GEN-END:variables
private DefaultListModel outModel = new DefaultListModel();
private DefaultListModel inModel = new DefaultListModel();
private DefaultListModel outportsModel = new DefaultListModel();
private DefaultListModel inportsModel = new DefaultListModel();
private DefaultListModel cardsModel = new DefaultListModel();
private DefaultListModel profilesModel = new DefaultListModel();
private void listAll() {
PulseAudio.list();
outportsModel.clear();
inportsModel.clear();
outModel.clear();
for(int a=0;a<PulseAudio.sinks.size();a++) {
PulseAudio.Sink sink = PulseAudio.sinks.get(a);
outModel.addElement(sink.name);
}
inModel.clear();
for(int a=0;a<PulseAudio.sources.size();a++) {
PulseAudio.Source source = PulseAudio.sources.get(a);
inModel.addElement(source.name);
}
cardsModel.clear();
profilesModel.clear();
for(int a=0;a<PulseAudio.cards.size();a++) {
PulseAudio.Card card = PulseAudio.cards.get(a);
cardsModel.addElement(card.name);
}
}
private void listOutPorts(int idx) {
outportsModel.clear();
if (idx == -1) return;
PulseAudio.Sink sink = PulseAudio.sinks.get(idx);
for(int a=0;a<sink.ports.size();a++) {
PulseAudio.Port port = sink.ports.get(a);
if (sink.activePort.equals(port.name)) {
outportsModel.addElement(port.name + " (default)");
} else {
outportsModel.addElement(port.name);
}
}
}
private void listInPorts(int idx) {
inportsModel.clear();
if (idx == -1) return;
PulseAudio.Source source = PulseAudio.sources.get(idx);
for(int a=0;a<source.ports.size();a++) {
PulseAudio.Port port = source.ports.get(a);
if (source.activePort.equals(port.name)) {
inportsModel.addElement(port.name + " (default)");
} else {
inportsModel.addElement(port.name);
}
}
}
private void listProfiles() {
int idx = cards.getSelectedIndex();
if (idx == -1) return;
profilesModel.clear();
PulseAudio.Card card = PulseAudio.cards.get(idx);
for(int a=0;a<card.profiles.size();a++) {
PulseAudio.Profile profile = card.profiles.get(a);
if (card.activeProfile.equals(profile.name)) {
profilesModel.addElement(profile.desc + " (default)");
} else {
profilesModel.addElement(profile.desc);
}
}
}
private void toggleMute() {
int tab = tabs.getSelectedIndex();
int idx;
switch (tab) {
case 0:
idx = outputList.getSelectedIndex();
if (idx == -1) return;
try {
PulseAudio.Sink sink = PulseAudio.sinks.get(idx);
Runtime.getRuntime().exec(new String[]{"pactl", "set-source-mute", "" + sink.idx, (sink.muted ? "0" : "1")});
sink.muted = !sink.muted;
} catch (Exception e) {
JFLog.log(e);
}
break;
case 1:
idx = outputList.getSelectedIndex();
if (idx == -1) return;
try {
PulseAudio.Source source = PulseAudio.sources.get(idx);
Runtime.getRuntime().exec(new String[]{"pactl", "set-source-mute", "" + source.idx, (source.muted ? "0" : "1")});
source.muted = !source.muted;
} catch (Exception e) {
JFLog.log(e);
}
break;
case 2:
return;
}
}
private void updateMuteButton() {
int tab = tabs.getSelectedIndex();
int idx;
switch (tab) {
case 0:
idx = outputList.getSelectedIndex();
if (idx == -1) return;
PulseAudio.Sink sink = PulseAudio.sinks.get(idx);
mute.setSelected(sink.muted);
break;
case 1:
idx = outputList.getSelectedIndex();
if (idx == -1) return;
PulseAudio.Source source = PulseAudio.sources.get(idx);
mute.setSelected(source.muted);
break;
case 2:
return;
}
}
private void setDefault() {
int tab = tabs.getSelectedIndex();
int i1, i2, sidx;
String port;
switch (tab) {
case 0:
i1 = outputList.getSelectedIndex();
if (i1 == -1) return;
i2 = outputPorts.getSelectedIndex();
if (i2 == -1) return;
port = (String)outputPorts.getSelectedValue();
if (port.endsWith("(default)")) return;
sidx = PulseAudio.sinks.get(i1).idx;
try {
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"pactl","set-sink-port","" + sidx, port}, true);
if (sp.getErrorLevel() != 0) {
JF.showError("Error", output);
}
} catch (Exception e) {
JFLog.log(e);
}
ConfigApp.jbusClient.call("org.jflinux.jdesktop." + System.getenv("JID"), "soundSinkPortChanged", sidx + ",\"" + port + "\"");
break;
case 1:
i1 = inputList.getSelectedIndex();
if (i1 == -1) return;
i2 = inputPorts.getSelectedIndex();
if (i2 == -1) return;
port = (String)inputPorts.getSelectedValue();
if (port.endsWith("(default)")) return;
sidx = PulseAudio.sources.get(i1).idx;
try {
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"pactl","set-source-port","" + sidx, port}, true);
if (sp.getErrorLevel() != 0) {
JF.showError("Error", output);
}
} catch (Exception e) {
JFLog.log(e);
}
ConfigApp.jbusClient.call("org.jflinux.jdesktop." + System.getenv("JID"), "soundSourcePortChanged", sidx + ",\"" + port + "\"");
break;
case 2:
i1 = cards.getSelectedIndex();
if (i1 == -1) return;
i2 = profiles.getSelectedIndex();
if (i2 == -1) return;
String profile = PulseAudio.cards.get(i1).profiles.get(i2).name;
if (profile.endsWith("(default)")) return;
int cidx = PulseAudio.cards.get(i1).idx;
try {
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"pactl","set-card-profile","" + cidx, profile}, true);
if (sp.getErrorLevel() != 0) {
JF.showError("Error", output);
}
} catch (Exception e) {
JFLog.log(e);
}
ConfigApp.jbusClient.call("org.jflinux.jdesktop." + System.getenv("JID"), "soundProfileChanged", cidx + ",\"" + profile + "\"");
break;
}
listAll();
}
}