1 //////////////////////////////////////////////////////////////////////
2 //
3 // BeeBEEP Copyright (C) 2010-2021 Marco Mastroddi
4 //
5 // BeeBEEP is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published
7 // by the Free Software Foundation, either version 3 of the License,
8 // or (at your option) any later version.
9 //
10 // BeeBEEP is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with BeeBEEP. If not, see <http://www.gnu.org/licenses/>.
17 //
18 // Author: Marco Mastroddi <marco.mastroddi(AT)gmail.com>
19 //
20 // $Id: GuiRecordVoiceMessageSettings.cpp 1455 2020-12-23 10:17:53Z mastroddi $
21 //
22 //////////////////////////////////////////////////////////////////////
23
24 #include "AudioManager.h"
25 #include "BeeUtils.h"
26 #include "GuiRecordVoiceMessageSettings.h"
27 #include "IconManager.h"
28 #include "Settings.h"
29
30
GuiRecordVoiceMessageSettings(QWidget * parent)31 GuiRecordVoiceMessageSettings::GuiRecordVoiceMessageSettings( QWidget *parent )
32 : QDialog( parent ), mp_bgEncodingMode( Q_NULLPTR ), m_currentInputDevice(), m_currentFileContainer(), m_currentAudioEncoderSettings()
33 {
34 setupUi( this );
35 setObjectName( "GuiRecordVoiceMessageSettings" );
36 setWindowTitle( tr( "Voice encoder settings" ) + QString( " - %1" ).arg( Settings::instance().programName() ) );
37 setWindowIcon( IconManager::instance().icon( "audio-settings.png" ) );
38 Bee::removeContextHelpButton( this );
39
40 mp_cbUseCustomSettings->setText( QString( "%1 (%2)" ).arg( tr( "Use custom encoder settings" ) ).arg( tr( "expert users only" ) ) );
41 mp_bgEncodingMode = new QButtonGroup( this );
42 mp_bgEncodingMode->setExclusive( true );
43 mp_bgEncodingMode->addButton( mp_rbConstantQuality, static_cast<int>( QMultimedia::ConstantQualityEncoding ) );
44 mp_bgEncodingMode->addButton( mp_rbConstantBitRate, static_cast<int>( QMultimedia::ConstantBitRateEncoding ) );
45 mp_bgEncodingMode->addButton( mp_rbAverageBitRate, static_cast<int>( QMultimedia::AverageBitRateEncoding ) );
46 mp_bgEncodingMode->addButton( mp_rbTwoPass, static_cast<int>( QMultimedia::TwoPassEncoding ) );
47
48 mp_audioRecorder = new QAudioRecorder( this );
49
50 connect( mp_cbUseCustomSettings, SIGNAL( toggled( bool ) ), this, SLOT( toggleCustomSettings( bool ) ) );
51 connect( mp_bgEncodingMode, SIGNAL( buttonClicked( int ) ), this, SLOT( encodingModeChanged( int ) ) );
52 connect( mp_pbOk, SIGNAL( clicked() ), this, SLOT( saveSettings() ) );
53 connect( mp_pbCancel, SIGNAL( clicked() ), this, SLOT( reject() ) );
54 connect( mp_pbReset, SIGNAL( clicked() ), this, SLOT( resetSettings() ) );
55 }
56
init()57 void GuiRecordVoiceMessageSettings::init()
58 {
59 mp_comboInputDevice->addItem( tr( "Default" ), QVariant( QString() ) );
60 foreach( const QString& input_device, mp_audioRecorder->audioInputs() )
61 mp_comboInputDevice->addItem( input_device, QVariant( input_device ) );
62
63 mp_comboAudioCodec->addItem( tr( "Default" ), QVariant( QString() ) );
64 foreach( const QString& codec_name, mp_audioRecorder->supportedAudioCodecs() )
65 mp_comboAudioCodec->addItem( codec_name, QVariant( codec_name ) );
66
67 mp_comboContainer->addItem( tr( "Default" ), QVariant( QString() ) );
68 foreach( const QString& container_name, mp_audioRecorder->supportedContainers() )
69 mp_comboContainer->addItem( container_name, QVariant( container_name ) );
70
71 mp_comboChannels->addItem( tr( "Default" ), QVariant( -1 ) );
72 mp_comboChannels->addItem( QString( "1" ), QVariant( 1 ) );
73 mp_comboChannels->addItem( QString( "2" ), QVariant( 2 ) );
74 mp_comboChannels->addItem( QString( "4" ), QVariant( 4 ) );
75
76 mp_comboBitrate->addItem( tr( "Default" ), QVariant( 0 ) );
77 mp_comboBitrate->addItem( QString( "32000" ), QVariant( 32000 ) );
78 mp_comboBitrate->addItem( QString( "64000" ), QVariant( 64000 ) );
79 mp_comboBitrate->addItem( QString( "96000" ), QVariant( 96000 ) );
80 mp_comboBitrate->addItem( QString( "128000" ), QVariant( 128000 ) );
81
82 mp_sliderQuality->setRange( 0, static_cast<int>( QMultimedia::VeryHighQuality ) );
83 mp_sliderQuality->setValue( static_cast<int>( QMultimedia::NormalQuality ) );
84 }
85
encodingModeChanged(int button_clicked)86 void GuiRecordVoiceMessageSettings::encodingModeChanged( int button_clicked )
87 {
88 if( button_clicked == static_cast<int>( QMultimedia::ConstantQualityEncoding ) )
89 {
90 mp_comboBitrate->setEnabled( false );
91 mp_sliderQuality->setEnabled( true );
92 }
93 else if( button_clicked == static_cast<int>( QMultimedia::ConstantBitRateEncoding ) )
94 {
95 mp_comboBitrate->setEnabled( true );
96 mp_sliderQuality->setEnabled( false );
97 }
98 else if( button_clicked == static_cast<int>( QMultimedia::AverageBitRateEncoding ) )
99 {
100 mp_comboBitrate->setEnabled( false );
101 mp_sliderQuality->setEnabled( false );
102 }
103 else if( button_clicked == static_cast<int>( QMultimedia::TwoPassEncoding ) )
104 {
105 mp_comboBitrate->setEnabled( false );
106 mp_sliderQuality->setEnabled( false );
107 }
108 else
109 {
110 #ifdef BEEBEEP_DEBUG
111 qWarning() << "Invalid button id" << button_clicked << "clicked in GuiRecordVoiceMessageSettings::encodingModeChanged(...)";
112 #endif
113 }
114 }
115
toggleCustomSettings(bool)116 void GuiRecordVoiceMessageSettings::toggleCustomSettings( bool )
117 {
118 mp_gbVoiceRecorder->setEnabled( mp_cbUseCustomSettings->isChecked() );
119 mp_gbEncodingMode->setEnabled( mp_cbUseCustomSettings->isChecked() );
120 }
121
loadSettings()122 void GuiRecordVoiceMessageSettings::loadSettings()
123 {
124 mp_cbUseSystemEncoder->setChecked( Settings::instance().useSystemVoiceEncoderSettings() );
125 mp_cbUseCustomSettings->setChecked( Settings::instance().useCustomVoiceEncoderSettings() );
126 m_currentInputDevice = AudioManager::instance().voiceInputDeviceName();
127 m_currentFileContainer = AudioManager::instance().voiceMessageFileContainer();
128 m_currentAudioEncoderSettings = AudioManager::instance().voiceMessageEncoderSettings();
129 updateGui();
130 }
131
updateGui()132 void GuiRecordVoiceMessageSettings::updateGui()
133 {
134 mp_comboSampleRate->clear();
135 mp_comboSampleRate->addItem( tr( "Default" ), QVariant( 0 ) );
136 foreach( int sample_rate, mp_audioRecorder->supportedAudioSampleRates( m_currentAudioEncoderSettings ) )
137 mp_comboSampleRate->addItem( QString::number( sample_rate ), QVariant( sample_rate ) );
138 if( !Bee::selectComboBoxData( mp_comboInputDevice, m_currentInputDevice ) )
139 mp_comboInputDevice->setCurrentIndex( 0 );
140 if( !Bee::selectComboBoxData( mp_comboContainer, m_currentFileContainer ) )
141 mp_comboContainer->setCurrentIndex( 0 );
142 if( !Bee::selectComboBoxData( mp_comboAudioCodec, m_currentAudioEncoderSettings.codec() ) )
143 mp_comboAudioCodec->setCurrentIndex( 0 );
144 if( !Bee::selectComboBoxData( mp_comboSampleRate, m_currentAudioEncoderSettings.sampleRate() ) )
145 mp_comboSampleRate->setCurrentIndex( 0 );
146 if( !Bee::selectComboBoxData( mp_comboChannels, m_currentAudioEncoderSettings.channelCount() ) )
147 mp_comboChannels->setCurrentIndex( 0 );
148 if( !Bee::selectComboBoxData( mp_comboBitrate, m_currentAudioEncoderSettings.bitRate() ) )
149 mp_comboBitrate->setCurrentIndex( 0 );
150 mp_sliderQuality->setValue( static_cast<int>( m_currentAudioEncoderSettings.quality() ) );
151 int button_id = static_cast<int>( m_currentAudioEncoderSettings.encodingMode() );
152 QAbstractButton* p_button = mp_bgEncodingMode->button( button_id );
153 if( p_button )
154 {
155 p_button->setChecked( true );
156 encodingModeChanged( button_id );
157 }
158 toggleCustomSettings( mp_cbUseCustomSettings->isChecked() );
159 }
160
saveSettings()161 void GuiRecordVoiceMessageSettings::saveSettings()
162 {
163 m_currentInputDevice = Bee::comboBoxData( mp_comboInputDevice ).toString();
164 Settings::instance().setVoiceInputDeviceName( !m_currentInputDevice.isEmpty() && m_currentInputDevice == AudioManager::instance().defaultInputDeviceName() ? QString() : m_currentInputDevice );
165 m_currentFileContainer = Bee::comboBoxData( mp_comboContainer ).toString();
166 Settings::instance().setVoiceFileMessageContainer( !m_currentFileContainer.isEmpty() && m_currentFileContainer == AudioManager::instance().voiceMessageFileContainer() ? QString() : m_currentFileContainer );
167 QAudioEncoderSettings aes;
168 aes.setCodec( Bee::comboBoxData( mp_comboAudioCodec ).toString() );
169 aes.setSampleRate( Bee::comboBoxData( mp_comboSampleRate ).toInt());
170 aes.setBitRate( Bee::comboBoxData( mp_comboBitrate ).toInt() );
171 aes.setChannelCount( Bee::comboBoxData( mp_comboChannels ).toInt() );
172 aes.setEncodingMode( static_cast<QMultimedia::EncodingMode>( mp_bgEncodingMode->checkedId() ) );
173 aes.setQuality( static_cast<QMultimedia::EncodingQuality>( mp_sliderQuality->value() ) );
174 m_currentAudioEncoderSettings = aes;
175 Settings::instance().setVoiceCodec( aes.codec() == AudioManager::instance().defaultVoiceMessageEncoderSettings().codec() ? QString() : aes.codec() );
176 Settings::instance().setVoiceSampleRate( aes.sampleRate() == AudioManager::instance().defaultVoiceMessageEncoderSettings().sampleRate() ? 0 : aes.sampleRate() );
177 Settings::instance().setVoiceBitRate( aes.bitRate() == AudioManager::instance().defaultVoiceMessageEncoderSettings().bitRate() ? 0 : aes.bitRate() );
178 Settings::instance().setVoiceChannels( aes.channelCount() == AudioManager::instance().defaultVoiceMessageEncoderSettings().channelCount() ? -1 : aes.channelCount() );
179 Settings::instance().setVoiceEncodingMode( aes.encodingMode() == AudioManager::instance().defaultVoiceMessageEncoderSettings().encodingMode() ? -1 : aes.encodingMode() );
180 Settings::instance().setVoiceEncodingQuality( aes.quality() == AudioManager::instance().defaultVoiceMessageEncoderSettings().quality() ? -1 : aes.quality() );
181 Settings::instance().setUseSystemVoiceEncoderSettings( mp_cbUseSystemEncoder->isChecked() );
182 Settings::instance().setUseCustomVoiceEncoderSettings( mp_cbUseCustomSettings->isChecked() );
183 accept();
184 }
185
resetSettings()186 void GuiRecordVoiceMessageSettings::resetSettings()
187 {
188 mp_cbUseCustomSettings->setChecked( false );
189 m_currentInputDevice = AudioManager::instance().defaultInputDeviceName();
190 m_currentFileContainer = AudioManager::instance().voiceMessageFileContainer();
191 m_currentAudioEncoderSettings = AudioManager::instance().defaultVoiceMessageEncoderSettings();
192 updateGui();
193 }
194
195