/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.plugin.generalconfig; import net.java.sip.communicator.plugin.desktoputil.*; import org.jitsi.service.configuration.*; import org.jitsi.service.neomedia.codec.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * Implements the Opus configuration panel. * * @author Boris Grozev */ public class OpusConfigForm extends TransparentPanel implements ActionListener { /** * Strings for audio bandwidths. Used as the value for the bandwidth * property. In sync with <tt>BANDWIDTHS_LONG</tt> */ private static final String[] BANDWIDTHS = new String[]{ "auto", "fb", "swb", "wb", "mb", "nb" }; /** * The strings used in the combobox. In sync with <tt>BANDWIDTHS</tt> */ private static final String[] BANDWIDTHS_LONG = new String[]{ "Auto", "Fullband (48kHz)", "Super-wideband (24kHz)", "Wideband (16kHz)", "Medium-band (12kHz)", "Narrowband (8kHz)" }; /** * The default value for the "bandwidth" setting. */ private static final String BANDWIDTH_DEFAULT = "auto"; /** * The default value for the "bitrate" setting */ private static final int BITRATE_DEFAULT = 32; /** * The default value for the "dtx" setting */ private static final boolean DTX_DEFAULT = true; /** * The default value for the "fec" setting */ private static final boolean FEC_DEFAULT = true; /** * The default value for the "minimum expected packet loss" setting */ private static final int MIN_EXPECTED_PL_DEFAULT = 1; /** * The index of the default value for the 'complexity' setting. Index 0 * corresponds to the default complexity set by the opus_encoder_create * function/method. */ private static final int COMPLEXITY_DEFAULT_INDEX = 0; /** * The "audio bandwidth" combobox */ private final JComboBox bandwidthCombobox = new JComboBox(); /** * The "bitrate" field */ private final JTextField bitrateField = new JTextField(6); /** * The "use dtx" checkbox */ private final JCheckBox dtxCheckbox = new SIPCommCheckBox(); /** * The "use fec" checkbox */ private final JCheckBox fecCheckbox = new SIPCommCheckBox(); /** * The "minimum expected packet loss" field */ private final JTextField minExpectedPLField = new JTextField(3); /** * The "complexity" combobox */ private final JComboBox complexityCombobox = new JComboBox(); /** * The <tt>ConfigurationService</tt> to be used to access configuration */ private final ConfigurationService configurationService = GeneralConfigPluginActivator.getConfigurationService(); /** * The "restore defaults" button */ private final JButton restoreButton = new JButton(Resources.getString( "plugin.generalconfig.RESTORE")); /** * Initialize a new <tt>OpusConfigForm</tt> instance. */ public OpusConfigForm() { super(new BorderLayout()); Box box = Box.createVerticalBox(); add(box, BorderLayout.NORTH); TransparentPanel contentPanel = new TransparentPanel(); contentPanel.setLayout(new BorderLayout(10, 10)); box.add(contentPanel); TransparentPanel labelPanel = new TransparentPanel(new GridLayout(0, 1, 2, 2)); TransparentPanel valuePanel = new TransparentPanel(new GridLayout(0, 1, 2, 2)); TransparentPanel southPanel = new TransparentPanel(new GridLayout(0, 1, 2, 2)); contentPanel.add(labelPanel, BorderLayout.WEST); contentPanel.add(valuePanel, BorderLayout.CENTER); contentPanel.add(southPanel, BorderLayout.SOUTH); //Audio bandwidth labelPanel.add(new JLabel(Resources.getString( "plugin.generalconfig.OPUS_AUDIO_BANDWIDTH"))); for(String str : BANDWIDTHS_LONG) bandwidthCombobox.addItem(str); bandwidthCombobox.setSelectedIndex(getBandwidthIndex( configurationService.getString( Constants.PROP_OPUS_BANDWIDTH, BANDWIDTH_DEFAULT))); bandwidthCombobox.addActionListener(this); valuePanel.add(bandwidthCombobox); //Bitrate labelPanel.add(new JLabel(Resources.getString( "plugin.generalconfig.OPUS_BITRATE"))); bitrateField.setText( ((Integer)configurationService.getInt( Constants.PROP_OPUS_BITRATE, BITRATE_DEFAULT)) .toString()); bitrateField.addFocusListener(new FocusListener() { public void focusGained(FocusEvent focusEvent) {} public void focusLost(FocusEvent focusEvent) { configurationService.setProperty( Constants.PROP_OPUS_BITRATE, bitrateField.getText()); } }); valuePanel.add(bitrateField); //DTX labelPanel.add(new JLabel(Resources.getString( "plugin.generalconfig.OPUS_USE_DTX"))); dtxCheckbox.setSelected( configurationService.getBoolean( Constants.PROP_OPUS_DTX, DTX_DEFAULT)); dtxCheckbox.addActionListener(this); valuePanel.add(dtxCheckbox); //FEC labelPanel.add(new JLabel(Resources.getString( "plugin.generalconfig.OPUS_USE_FEC"))); fecCheckbox.setSelected( configurationService.getBoolean( Constants.PROP_OPUS_FEC, FEC_DEFAULT)); fecCheckbox.addActionListener(this); valuePanel.add(fecCheckbox); //min expected packet loss labelPanel.add(new JLabel(Resources.getString( "plugin.generalconfig.OPUS_MIN_EXPECTED_PACKET_LOSS"))); minExpectedPLField.setText( configurationService.getString( Constants.PROP_OPUS_MIN_EXPECTED_PACKET_LOSS, ((Integer)MIN_EXPECTED_PL_DEFAULT).toString())); minExpectedPLField.addFocusListener(new FocusListener() { public void focusGained(FocusEvent focusEvent) { } public void focusLost(FocusEvent focusEvent) { configurationService.setProperty( Constants.PROP_OPUS_MIN_EXPECTED_PACKET_LOSS, minExpectedPLField.getText()); } }); valuePanel.add(minExpectedPLField); //Complexity labelPanel.add(new JLabel(Resources.getString( "plugin.generalconfig.OPUS_COMPLEXITY"))); /* * Unless the user explicitly assigns a complexity value, let the * opus_encoder_create function/method set the default complexity. */ complexityCombobox.addItem(""); for(int i = 10; i > 0; i--) complexityCombobox.addItem(Integer.toString(i)); complexityCombobox.addActionListener(this); valuePanel.add(complexityCombobox); restoreButton.addActionListener(this); southPanel.add(restoreButton); } /** * Restores the UI components to the default values and writes the default * values to the configuration. */ private void restoreDefaults() { bandwidthCombobox.setSelectedIndex(getBandwidthIndex(BANDWIDTH_DEFAULT)); bitrateField.setText(((Integer)BITRATE_DEFAULT).toString()); configurationService.setProperty( Constants.PROP_OPUS_BITRATE, BITRATE_DEFAULT); dtxCheckbox.setSelected(DTX_DEFAULT); configurationService.setProperty( Constants.PROP_OPUS_DTX, DTX_DEFAULT); fecCheckbox.setSelected(FEC_DEFAULT); configurationService.setProperty( Constants.PROP_OPUS_FEC, FEC_DEFAULT); minExpectedPLField.setText( ((Integer)MIN_EXPECTED_PL_DEFAULT).toString()); configurationService.setProperty( Constants.PROP_OPUS_MIN_EXPECTED_PACKET_LOSS, MIN_EXPECTED_PL_DEFAULT); complexityCombobox.setSelectedIndex(COMPLEXITY_DEFAULT_INDEX); configurationService.removeProperty(Constants.PROP_OPUS_COMPLEXITY); } /** * Action listener for the checkboxes, buttons and comboboxes. Updates * the configuration service with the appropriate new value. * @param actionEvent */ public void actionPerformed(ActionEvent actionEvent) { Object source = actionEvent.getSource(); if(source == restoreButton) { restoreDefaults(); } else if (source == bandwidthCombobox) { configurationService.setProperty( Constants.PROP_OPUS_BANDWIDTH, BANDWIDTHS[bandwidthCombobox.getSelectedIndex()]); } else if(source == dtxCheckbox) { configurationService.setProperty( Constants.PROP_OPUS_DTX, dtxCheckbox.isSelected()); } else if(source == fecCheckbox) { configurationService.setProperty( Constants.PROP_OPUS_FEC, fecCheckbox.isSelected()); } else if(source == complexityCombobox) { Object selectedItem = complexityCombobox.getSelectedItem(); String complexity = (selectedItem == null) ? null : selectedItem.toString(); if ((complexity == null) || (complexity.length() == 0)) { configurationService.removeProperty( Constants.PROP_OPUS_COMPLEXITY); } else { configurationService.setProperty( Constants.PROP_OPUS_COMPLEXITY, complexity); } } } /** * Returns the index of the audio bandwidth with a short name * <tt>bandwidthShortName</tt> in <tt>bandwidthCheckbox</tt>, or -1 if it's * not found. * * @param bandwidthShortName the short name of the audio bandwidth to return * to return the index of. * * @return the index of the audio bandwidth with a short name * <tt>bandwidthShortName</tt> in <tt>bandwidthCheckbox</tt>, or -1 if it's * not found. */ private int getBandwidthIndex(String bandwidthShortName) { for(int i = 0; i < BANDWIDTHS.length; i++) if(BANDWIDTHS[i].equals(bandwidthShortName)) return i; return -1; } }