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