#939 Adds MP3 encoder preferences to the User Preferences dialog and provides user control over sample rate and MP3 encoder settings. MP3 preferences are global and affect both recording and streaming. (#1159)

Co-authored-by: Dennis Sheirer <dsheirer@github.com>
This commit is contained in:
Denny Sheirer
2022-03-10 04:17:35 -05:00
committed by GitHub
parent 0e8c9591e4
commit 2355dfce07
40 changed files with 1369 additions and 347 deletions

View File

@@ -23,6 +23,7 @@ import io.github.dsheirer.gui.preference.calibration.VectorCalibrationPreference
import io.github.dsheirer.gui.preference.decoder.JmbeLibraryPreferenceEditor;
import io.github.dsheirer.gui.preference.directory.DirectoryPreferenceEditor;
import io.github.dsheirer.gui.preference.duplicate.DuplicateCallPreferenceEditor;
import io.github.dsheirer.gui.preference.mp3.MP3PreferenceEditor;
import io.github.dsheirer.gui.preference.playback.PlaybackPreferenceEditor;
import io.github.dsheirer.gui.preference.record.RecordPreferenceEditor;
import io.github.dsheirer.gui.preference.tuner.TunerPreferenceEditor;
@@ -40,6 +41,8 @@ public class PreferenceEditorFactory
{
case AUDIO_DUPLICATE_CALL_DETECTION:
return new DuplicateCallPreferenceEditor(userPreferences);
case AUDIO_MP3:
return new MP3PreferenceEditor(userPreferences);
case AUDIO_OUTPUT:
return new PlaybackPreferenceEditor(userPreferences);
case AUDIO_RECORD:

View File

@@ -27,6 +27,7 @@ public enum PreferenceEditorType
CHANNEL_EVENT("Channel Events"),
DIRECTORY("Directories"),
JMBE_LIBRARY("JMBE Audio Library"),
AUDIO_MP3("MP3"),
AUDIO_RECORD("Record"),
AUDIO_OUTPUT("Output/Tones"),
AUDIO_DUPLICATE_CALL_DETECTION("Duplicate Calls"),

View File

@@ -168,6 +168,7 @@ public class UserPreferencesEditor extends BorderPane
TreeItem<String> audioItem = new TreeItem<>("Audio");
audioItem.getChildren().add(new TreeItem(PreferenceEditorType.AUDIO_DUPLICATE_CALL_DETECTION));
audioItem.getChildren().add(new TreeItem(PreferenceEditorType.AUDIO_MP3));
audioItem.getChildren().add(new TreeItem(PreferenceEditorType.AUDIO_OUTPUT));
audioItem.getChildren().add(new TreeItem(PreferenceEditorType.AUDIO_RECORD));
treeRoot.getChildren().add(audioItem);

View File

@@ -0,0 +1,112 @@
/*
* *****************************************************************************
* Copyright (C) 2014-2022 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
* ****************************************************************************
*/
package io.github.dsheirer.gui.preference.mp3;
import io.github.dsheirer.audio.convert.AudioSampleRate;
import io.github.dsheirer.audio.convert.MP3Setting;
import io.github.dsheirer.preference.UserPreferences;
import io.github.dsheirer.preference.mp3.MP3Preference;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Preference settings for MP3
*/
public class MP3PreferenceEditor extends HBox
{
private final static Logger mLog = LoggerFactory.getLogger(MP3PreferenceEditor.class);
private MP3Preference mMP3Preference;
private GridPane mEditorPane;
private ComboBox<MP3Setting> mMP3SettingComboBox;
private ComboBox<AudioSampleRate> mAudioSampleRateComboBox;
public MP3PreferenceEditor(UserPreferences userPreferences)
{
mMP3Preference = userPreferences.getMP3Preference();
HBox.setHgrow(getEditorPane(), Priority.ALWAYS);
getChildren().add(getEditorPane());
}
private GridPane getEditorPane()
{
if(mEditorPane == null)
{
mEditorPane = new GridPane();
mEditorPane.setPadding(new Insets(10, 10, 10, 10));
mEditorPane.setHgap(10);
mEditorPane.setVgap(10);
int row = 0;
Label topLabel = new Label("MP3 Encoder Preferences");
mEditorPane.add(topLabel, 0, row++, 2, 1);
Label label = new Label("(LAME) Encoder Setting:");
GridPane.setHalignment(label, HPos.RIGHT);
mEditorPane.add(label, 0, row);
mEditorPane.add(getMP3SettingComboBox(), 1, row++);
Label sampleRateLabel = new Label("Input Audio Sample Rate:");
GridPane.setHalignment(sampleRateLabel, HPos.RIGHT);
mEditorPane.add(sampleRateLabel, 0, row);
mEditorPane.add(getAudioSampleRateComboBox(), 1, row++);
Label notice = new Label("Note: sdrtrunk default 8 kHz audio rate is resampled to input sample rate before MP3 encoding");
mEditorPane.add(notice, 0, row, 2, 1);
}
return mEditorPane;
}
private ComboBox<MP3Setting> getMP3SettingComboBox()
{
if(mMP3SettingComboBox == null)
{
mMP3SettingComboBox = new ComboBox<>();
mMP3SettingComboBox.getItems().addAll(MP3Setting.values());
mMP3SettingComboBox.getSelectionModel().select(mMP3Preference.getMP3Setting());
mMP3SettingComboBox.getSelectionModel().selectedItemProperty()
.addListener((observable, oldValue, newValue) -> mMP3Preference.setMP3Setting(newValue));
}
return mMP3SettingComboBox;
}
private ComboBox<AudioSampleRate> getAudioSampleRateComboBox()
{
if(mAudioSampleRateComboBox == null)
{
mAudioSampleRateComboBox = new ComboBox<>();
mAudioSampleRateComboBox.getItems().addAll(AudioSampleRate.values());
mAudioSampleRateComboBox.getSelectionModel().select(mMP3Preference.getAudioSampleRate());
mAudioSampleRateComboBox.getSelectionModel().selectedItemProperty()
.addListener((observable, oldValue, newValue) -> mMP3Preference.setAudioSampleRate(newValue));
}
return mAudioSampleRateComboBox;
}
}

View File

@@ -1,6 +1,6 @@
/*
* *****************************************************************************
* Copyright (C) 2014-2020 Dennis Sheirer
* Copyright (C) 2014-2022 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,10 +19,7 @@
package io.github.dsheirer.gui.preference.playback;
import com.google.common.eventbus.Subscribe;
import io.github.dsheirer.audio.AudioFormats;
import io.github.dsheirer.eventbus.MyEventBus;
import io.github.dsheirer.preference.PreferenceType;
import io.github.dsheirer.preference.UserPreferences;
import io.github.dsheirer.preference.playback.PlaybackPreference;
import io.github.dsheirer.source.mixer.MixerChannelConfiguration;
@@ -410,7 +407,7 @@ public class PlaybackPreferenceEditor extends HBox
byte[] bytes = buffer.array();
DataLine.Info info = new DataLine.Info(Clip.class, AudioFormats.PCM_SIGNED_8KHZ_16BITS_MONO);
DataLine.Info info = new DataLine.Info(Clip.class, AudioFormats.PCM_SIGNED_8_KHZ_16BITS_MONO);
if(!AudioSystem.isLineSupported(info))
{
@@ -421,7 +418,7 @@ public class PlaybackPreferenceEditor extends HBox
try
{
Clip clip = (Clip)AudioSystem.getLine(info);
clip.open(AudioFormats.PCM_SIGNED_8KHZ_16BITS_MONO, bytes, 0, bytes.length);
clip.open(AudioFormats.PCM_SIGNED_8_KHZ_16BITS_MONO, bytes, 0, bytes.length);
clip.start();
}
catch(Exception e)