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(); } }