User configurable audio device buffer sizes

Adjusting these may help with  audio drop-outs, particularly on slower
CPU systems or heavily loaded systems. Smaller buffer sizes leave less
margin for  process interruptions,  larger sizes waste  resources that
could impact other processes.
This commit is contained in:
Bill Somerville 2020-08-08 16:25:14 +01:00
parent f975f2c181
commit a0ceace5b4
No known key found for this signature in database
GPG Key ID: D864B06D1E81618F
8 changed files with 201 additions and 95 deletions

View File

@ -41,7 +41,8 @@ bool SoundInput::audioError () const
return result; return result;
} }
void SoundInput::start(QAudioDeviceInfo const& device, int framesPerBuffer, AudioDevice * sink, unsigned downSampleFactor, AudioDevice::Channel channel) void SoundInput::start(QAudioDeviceInfo const& device, int framesPerBuffer, AudioDevice * sink
, unsigned downSampleFactor, AudioDevice::Channel channel)
{ {
Q_ASSERT (sink); Q_ASSERT (sink);
@ -79,7 +80,9 @@ void SoundInput::start(QAudioDeviceInfo const& device, int framesPerBuffer, Audi
connect (m_stream.data(), &QAudioInput::stateChanged, this, &SoundInput::handleStateChanged); connect (m_stream.data(), &QAudioInput::stateChanged, this, &SoundInput::handleStateChanged);
qDebug () << "SoundIn default buffer size (bytes):" << m_stream->bufferSize ();
m_stream->setBufferSize (m_stream->format ().bytesForFrames (framesPerBuffer)); m_stream->setBufferSize (m_stream->format ().bytesForFrames (framesPerBuffer));
qDebug () << "SoundIn selected buffer size (bytes):" << m_stream->bufferSize ();
if (sink->initialize (QIODevice::WriteOnly, channel)) if (sink->initialize (QIODevice::WriteOnly, channel))
{ {
m_stream->start (sink); m_stream->start (sink);

View File

@ -9,15 +9,6 @@
#include "moc_soundout.cpp" #include "moc_soundout.cpp"
/*
#if defined (WIN32)
# define MS_BUFFERED 1000u
#else
# define MS_BUFFERED 2000u
#endif
*/
# define MS_BUFFERED 200u
bool SoundOutput::audioError () const bool SoundOutput::audioError () const
{ {
bool result (true); bool result (true);
@ -50,11 +41,11 @@ bool SoundOutput::audioError () const
return result; return result;
} }
void SoundOutput::setFormat (QAudioDeviceInfo const& device, unsigned channels, unsigned msBuffered) void SoundOutput::setFormat (QAudioDeviceInfo const& device, unsigned channels, int frames_buffered)
{ {
Q_ASSERT (0 < channels && channels < 3); Q_ASSERT (0 < channels && channels < 3);
m_msBuffered = msBuffered; m_framesBuffered = frames_buffered;
QAudioFormat format (device.preferredFormat ()); QAudioFormat format (device.preferredFormat ());
// qDebug () << "Preferred audio output format:" << format; // qDebug () << "Preferred audio output format:" << format;
@ -101,9 +92,9 @@ void SoundOutput::restart (QIODevice * source)
// we have to set this before every start on the stream because the // we have to set this before every start on the stream because the
// Windows implementation seems to forget the buffer size after a // Windows implementation seems to forget the buffer size after a
// stop. // stop.
m_stream->setBufferSize (m_stream->format().bytesForDuration((m_msBuffered ? m_msBuffered : MS_BUFFERED) * 1000)); qDebug () << "SoundOut default buffer size (bytes):" << m_stream->bufferSize ();
// qDebug() << "B" << m_stream->bufferSize() << m_stream->setBufferSize (m_stream->format().bytesForFrames (m_framesBuffered));
// m_stream->periodSize() << m_stream->notifyInterval(); qDebug () << "SoundOut selected buffer size (bytes):" << m_stream->bufferSize ();
m_stream->setCategory ("production"); m_stream->setCategory ("production");
m_stream->start (source); m_stream->start (source);
} }

View File

@ -18,7 +18,7 @@ class SoundOutput
public: public:
SoundOutput () SoundOutput ()
: m_msBuffered {0u} : m_framesBuffered {0}
, m_volume {1.0} , m_volume {1.0}
{ {
} }
@ -26,7 +26,7 @@ public:
qreal attenuation () const; qreal attenuation () const;
public Q_SLOTS: public Q_SLOTS:
void setFormat (QAudioDeviceInfo const& device, unsigned channels, unsigned msBuffered = 0u); void setFormat (QAudioDeviceInfo const& device, unsigned channels, int frames_buffered = 0);
void restart (QIODevice *); void restart (QIODevice *);
void suspend (); void suspend ();
void resume (); void resume ();
@ -47,7 +47,7 @@ private Q_SLOTS:
private: private:
QScopedPointer<QAudioOutput> m_stream; QScopedPointer<QAudioOutput> m_stream;
unsigned m_msBuffered; int m_framesBuffered;
qreal m_volume; qreal m_volume;
}; };

View File

@ -242,6 +242,8 @@ namespace
// Magic numbers for file validation // Magic numbers for file validation
constexpr quint32 qrg_magic {0xadbccbdb}; constexpr quint32 qrg_magic {0xadbccbdb};
constexpr quint32 qrg_version {100}; // M.mm constexpr quint32 qrg_version {100}; // M.mm
constexpr int default_audio_buffer_size = 10;
} }
@ -649,9 +651,11 @@ private:
QAudioDeviceInfo audio_input_device_; QAudioDeviceInfo audio_input_device_;
bool default_audio_input_device_selected_; bool default_audio_input_device_selected_;
AudioDevice::Channel audio_input_channel_; AudioDevice::Channel audio_input_channel_;
int audio_input_buffer_size_;
QAudioDeviceInfo audio_output_device_; QAudioDeviceInfo audio_output_device_;
bool default_audio_output_device_selected_; bool default_audio_output_device_selected_;
AudioDevice::Channel audio_output_channel_; AudioDevice::Channel audio_output_channel_;
int audio_output_buffer_size_;
friend class Configuration; friend class Configuration;
}; };
@ -681,8 +685,10 @@ bool Configuration::is_active () const {return m_->isVisible ();}
QAudioDeviceInfo const& Configuration::audio_input_device () const {return m_->audio_input_device_;} QAudioDeviceInfo const& Configuration::audio_input_device () const {return m_->audio_input_device_;}
AudioDevice::Channel Configuration::audio_input_channel () const {return m_->audio_input_channel_;} AudioDevice::Channel Configuration::audio_input_channel () const {return m_->audio_input_channel_;}
int Configuration::audio_input_buffer_size () const {return m_->audio_input_buffer_size_ * 1024;}
QAudioDeviceInfo const& Configuration::audio_output_device () const {return m_->audio_output_device_;} QAudioDeviceInfo const& Configuration::audio_output_device () const {return m_->audio_output_device_;}
AudioDevice::Channel Configuration::audio_output_channel () const {return m_->audio_output_channel_;} AudioDevice::Channel Configuration::audio_output_channel () const {return m_->audio_output_channel_;}
int Configuration::audio_output_buffer_size () const {return m_->audio_output_buffer_size_ * 1024;}
bool Configuration::restart_audio_input () const {return m_->restart_sound_input_device_;} bool Configuration::restart_audio_input () const {return m_->restart_sound_input_device_;}
bool Configuration::restart_audio_output () const {return m_->restart_sound_output_device_;} bool Configuration::restart_audio_output () const {return m_->restart_sound_output_device_;}
auto Configuration::type_2_msg_gen () const -> Type2MsgGen {return m_->type_2_msg_gen_;} auto Configuration::type_2_msg_gen () const -> Type2MsgGen {return m_->type_2_msg_gen_;}
@ -977,7 +983,9 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
, degrade_ {0.} // initialize to zero each run, not , degrade_ {0.} // initialize to zero each run, not
// saved in settings // saved in settings
, default_audio_input_device_selected_ {false} , default_audio_input_device_selected_ {false}
, audio_input_buffer_size_ {default_audio_buffer_size}
, default_audio_output_device_selected_ {false} , default_audio_output_device_selected_ {false}
, audio_output_buffer_size_ {default_audio_buffer_size}
{ {
ui_->setupUi (this); ui_->setupUi (this);
@ -1189,18 +1197,6 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
// //
ui_->highlighting_list_view->setModel (&next_decode_highlighing_model_); ui_->highlighting_list_view->setModel (&next_decode_highlighing_model_);
//
// load combo boxes with audio setup choices
//
default_audio_input_device_selected_ = load_audio_devices (QAudio::AudioInput, ui_->sound_input_combo_box, &audio_input_device_);
default_audio_output_device_selected_ = load_audio_devices (QAudio::AudioOutput, ui_->sound_output_combo_box, &audio_output_device_);
update_audio_channels (ui_->sound_input_combo_box, ui_->sound_input_combo_box->currentIndex (), ui_->sound_input_channel_combo_box, false);
update_audio_channels (ui_->sound_output_combo_box, ui_->sound_output_combo_box->currentIndex (), ui_->sound_output_channel_combo_box, true);
ui_->sound_input_channel_combo_box->setCurrentIndex (audio_input_channel_);
ui_->sound_output_channel_combo_box->setCurrentIndex (audio_output_channel_);
enumerate_rigs (); enumerate_rigs ();
initialize_models (); initialize_models ();
@ -1238,6 +1234,21 @@ void Configuration::impl::initialize_models ()
ui_->sbDegrade->setValue (degrade_); ui_->sbDegrade->setValue (degrade_);
ui_->sbBandwidth->setValue (RxBandwidth_); ui_->sbBandwidth->setValue (RxBandwidth_);
ui_->PTT_method_button_group->button (rig_params_.ptt_type)->setChecked (true); ui_->PTT_method_button_group->button (rig_params_.ptt_type)->setChecked (true);
//
// load combo boxes with audio setup choices
//
default_audio_input_device_selected_ = load_audio_devices (QAudio::AudioInput, ui_->sound_input_combo_box, &audio_input_device_);
default_audio_output_device_selected_ = load_audio_devices (QAudio::AudioOutput, ui_->sound_output_combo_box, &audio_output_device_);
update_audio_channels (ui_->sound_input_combo_box, ui_->sound_input_combo_box->currentIndex (), ui_->sound_input_channel_combo_box, false);
update_audio_channels (ui_->sound_output_combo_box, ui_->sound_output_combo_box->currentIndex (), ui_->sound_output_channel_combo_box, true);
ui_->sound_input_channel_combo_box->setCurrentIndex (audio_input_channel_);
ui_->audio_ip_buffer_spin_box->setValue (audio_input_buffer_size_);
ui_->sound_output_channel_combo_box->setCurrentIndex (audio_output_channel_);
ui_->audio_op_buffer_spin_box->setValue (audio_output_buffer_size_);
ui_->save_path_display_label->setText (save_directory_.absolutePath ()); ui_->save_path_display_label->setText (save_directory_.absolutePath ());
ui_->azel_path_display_label->setText (azel_directory_.absolutePath ()); ui_->azel_path_display_label->setText (azel_directory_.absolutePath ());
ui_->CW_id_after_73_check_box->setChecked (id_after_73_); ui_->CW_id_after_73_check_box->setChecked (id_after_73_);
@ -1446,6 +1457,10 @@ void Configuration::impl::read_settings ()
audio_input_channel_ = AudioDevice::fromString (settings_->value ("AudioInputChannel", "Mono").toString ()); audio_input_channel_ = AudioDevice::fromString (settings_->value ("AudioInputChannel", "Mono").toString ());
audio_output_channel_ = AudioDevice::fromString (settings_->value ("AudioOutputChannel", "Mono").toString ()); audio_output_channel_ = AudioDevice::fromString (settings_->value ("AudioOutputChannel", "Mono").toString ());
// retrieve audio buffer size values
audio_input_buffer_size_ = settings_->value ("AudioInputBufferSize", default_audio_buffer_size).toInt ();
audio_output_buffer_size_ = settings_->value ("AudioOutputBufferSize", default_audio_buffer_size).toInt ();
type_2_msg_gen_ = settings_->value ("Type2MsgGen", QVariant::fromValue (Configuration::type_2_msg_3_full)).value<Configuration::Type2MsgGen> (); type_2_msg_gen_ = settings_->value ("Type2MsgGen", QVariant::fromValue (Configuration::type_2_msg_3_full)).value<Configuration::Type2MsgGen> ();
monitor_off_at_startup_ = settings_->value ("MonitorOFF", false).toBool (); monitor_off_at_startup_ = settings_->value ("MonitorOFF", false).toBool ();
@ -1587,6 +1602,8 @@ void Configuration::impl::write_settings ()
settings_->setValue ("AudioInputChannel", AudioDevice::toString (audio_input_channel_)); settings_->setValue ("AudioInputChannel", AudioDevice::toString (audio_input_channel_));
settings_->setValue ("AudioOutputChannel", AudioDevice::toString (audio_output_channel_)); settings_->setValue ("AudioOutputChannel", AudioDevice::toString (audio_output_channel_));
settings_->setValue ("AudioInputBufferSize", audio_input_buffer_size_);
settings_->setValue ("AudioOutputBufferSize", audio_output_buffer_size_);
settings_->setValue ("Type2MsgGen", QVariant::fromValue (type_2_msg_gen_)); settings_->setValue ("Type2MsgGen", QVariant::fromValue (type_2_msg_gen_));
settings_->setValue ("MonitorOFF", monitor_off_at_startup_); settings_->setValue ("MonitorOFF", monitor_off_at_startup_);
settings_->setValue ("MonitorLastUsed", monitor_last_used_); settings_->setValue ("MonitorLastUsed", monitor_last_used_);
@ -2041,6 +2058,17 @@ void Configuration::impl::accept ()
} }
Q_ASSERT (audio_output_channel_ <= AudioDevice::Both); Q_ASSERT (audio_output_channel_ <= AudioDevice::Both);
if (audio_input_buffer_size_ != ui_->audio_ip_buffer_spin_box->value ())
{
audio_input_buffer_size_ = ui_->audio_ip_buffer_spin_box->value ();
restart_sound_input_device_ = true;
}
if (audio_output_buffer_size_ != ui_->audio_op_buffer_spin_box->value ())
{
audio_output_buffer_size_ = ui_->audio_op_buffer_spin_box->value ();
restart_sound_output_device_ = true;
}
my_callsign_ = ui_->callsign_line_edit->text (); my_callsign_ = ui_->callsign_line_edit->text ();
my_grid_ = ui_->grid_line_edit->text (); my_grid_ = ui_->grid_line_edit->text ();
FD_exchange_= ui_->Field_Day_Exchange->text ().toUpper (); FD_exchange_= ui_->Field_Day_Exchange->text ().toUpper ();

View File

@ -87,8 +87,10 @@ public:
QAudioDeviceInfo const& audio_input_device () const; QAudioDeviceInfo const& audio_input_device () const;
AudioDevice::Channel audio_input_channel () const; AudioDevice::Channel audio_input_channel () const;
int audio_input_buffer_size () const;
QAudioDeviceInfo const& audio_output_device () const; QAudioDeviceInfo const& audio_output_device () const;
AudioDevice::Channel audio_output_channel () const; AudioDevice::Channel audio_output_channel () const;
int audio_output_buffer_size () const;
// These query methods should be used after a call to exec() to // These query methods should be used after a call to exec() to
// determine if either the audio input or audio output stream // determine if either the audio input or audio output stream

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>559</width> <width>553</width>
<height>553</height> <height>563</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -1349,46 +1349,6 @@ radio interface behave as expected.</string>
<string>Soundcard</string> <string>Soundcard</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_6"> <layout class="QGridLayout" name="gridLayout_6">
<item row="1" column="1">
<widget class="QComboBox" name="sound_output_combo_box">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Select the audio CODEC to use for transmitting.
If this is your default device for system sounds then
ensure that all system sounds are disabled otherwise
you will broadcast any systems sounds generated during
transmitting periods.</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="sound_input_combo_box">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Select the audio CODEC to use for receiving.</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="sound_input_label">
<property name="text">
<string>&amp;Input:</string>
</property>
<property name="buddy">
<cstring>sound_input_combo_box</cstring>
</property>
</widget>
</item>
<item row="0" column="2"> <item row="0" column="2">
<widget class="QComboBox" name="sound_input_channel_combo_box"> <widget class="QComboBox" name="sound_input_channel_combo_box">
<property name="toolTip"> <property name="toolTip">
@ -1416,6 +1376,16 @@ transmitting periods.</string>
</item> </item>
</widget> </widget>
</item> </item>
<item row="0" column="0">
<widget class="QLabel" name="sound_input_label">
<property name="text">
<string>&amp;Input:</string>
</property>
<property name="buddy">
<cstring>sound_input_combo_box</cstring>
</property>
</widget>
</item>
<item row="1" column="2"> <item row="1" column="2">
<widget class="QComboBox" name="sound_output_channel_combo_box"> <widget class="QComboBox" name="sound_output_channel_combo_box">
<property name="toolTip"> <property name="toolTip">
@ -1446,6 +1416,81 @@ both here.</string>
</item> </item>
</widget> </widget>
</item> </item>
<item row="1" column="4">
<widget class="QSpinBox" name="audio_op_buffer_spin_box">
<property name="toolTip">
<string>Audio output buffer size in kilo-frames
Adjust for minimum dropped samples reported. Too low values are likely to cause dropped samples causing audio drop-outs.</string>
</property>
<property name="suffix">
<string> k</string>
</property>
<property name="minimum">
<number>4</number>
</property>
<property name="maximum">
<number>128</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="sound_input_combo_box">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Select the audio CODEC to use for receiving.</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QSpinBox" name="audio_ip_buffer_spin_box">
<property name="toolTip">
<string>Audio input buffer size in kilo-frames
Adjust for minimum dropped samples reported. Too low values are likely to cause dropped samples causing audio drop-outs.</string>
</property>
<property name="suffix">
<string> k</string>
</property>
<property name="prefix">
<string/>
</property>
<property name="minimum">
<number>4</number>
</property>
<property name="maximum">
<number>128</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="sound_output_combo_box">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Select the audio CODEC to use for transmitting.
If this is your default device for system sounds then
ensure that all system sounds are disabled otherwise
you will broadcast any systems sounds generated during
transmitting periods.</string>
</property>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="sound_output_label"> <widget class="QLabel" name="sound_output_label">
<property name="text"> <property name="text">
@ -1456,6 +1501,26 @@ both here.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="3">
<widget class="QLabel" name="label_16">
<property name="text">
<string>Buffer:</string>
</property>
<property name="buddy">
<cstring>audio_ip_buffer_spin_box</cstring>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Buffer:</string>
</property>
<property name="buddy">
<cstring>audio_op_buffer_spin_box</cstring>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -2951,14 +3016,20 @@ Right click for insert and delete options.</string>
<tabstop>use_dynamic_grid</tabstop> <tabstop>use_dynamic_grid</tabstop>
<tabstop>region_combo_box</tabstop> <tabstop>region_combo_box</tabstop>
<tabstop>type_2_msg_gen_combo_box</tabstop> <tabstop>type_2_msg_gen_combo_box</tabstop>
<tabstop>decodes_from_top_check_box</tabstop>
<tabstop>insert_blank_check_box</tabstop>
<tabstop>miles_check_box</tabstop>
<tabstop>TX_messages_check_box</tabstop> <tabstop>TX_messages_check_box</tabstop>
<tabstop>DXCC_check_box</tabstop> <tabstop>DXCC_check_box</tabstop>
<tabstop>ppfx_check_box</tabstop>
<tabstop>font_push_button</tabstop> <tabstop>font_push_button</tabstop>
<tabstop>decoded_text_font_push_button</tabstop> <tabstop>decoded_text_font_push_button</tabstop>
<tabstop>monitor_off_check_box</tabstop> <tabstop>monitor_off_check_box</tabstop>
<tabstop>monitor_last_used_check_box</tabstop> <tabstop>monitor_last_used_check_box</tabstop>
<tabstop>quick_call_check_box</tabstop> <tabstop>quick_call_check_box</tabstop>
<tabstop>disable_TX_on_73_check_box</tabstop> <tabstop>disable_TX_on_73_check_box</tabstop>
<tabstop>force_call_1st_check_box</tabstop>
<tabstop>alternate_bindings_check_box</tabstop>
<tabstop>CW_id_after_73_check_box</tabstop> <tabstop>CW_id_after_73_check_box</tabstop>
<tabstop>enable_VHF_features_check_box</tabstop> <tabstop>enable_VHF_features_check_box</tabstop>
<tabstop>tx_QSY_check_box</tabstop> <tabstop>tx_QSY_check_box</tabstop>
@ -2977,8 +3048,8 @@ Right click for insert and delete options.</string>
<tabstop>CAT_one_stop_bit_radio_button</tabstop> <tabstop>CAT_one_stop_bit_radio_button</tabstop>
<tabstop>CAT_two_stop_bit_radio_button</tabstop> <tabstop>CAT_two_stop_bit_radio_button</tabstop>
<tabstop>CAT_handshake_default_radio_button</tabstop> <tabstop>CAT_handshake_default_radio_button</tabstop>
<tabstop>CAT_handshake_none_radio_button</tabstop>
<tabstop>CAT_handshake_xon_radio_button</tabstop> <tabstop>CAT_handshake_xon_radio_button</tabstop>
<tabstop>CAT_handshake_none_radio_button</tabstop>
<tabstop>CAT_handshake_hardware_radio_button</tabstop> <tabstop>CAT_handshake_hardware_radio_button</tabstop>
<tabstop>force_DTR_combo_box</tabstop> <tabstop>force_DTR_combo_box</tabstop>
<tabstop>force_RTS_combo_box</tabstop> <tabstop>force_RTS_combo_box</tabstop>
@ -2999,8 +3070,10 @@ Right click for insert and delete options.</string>
<tabstop>test_PTT_push_button</tabstop> <tabstop>test_PTT_push_button</tabstop>
<tabstop>sound_input_combo_box</tabstop> <tabstop>sound_input_combo_box</tabstop>
<tabstop>sound_input_channel_combo_box</tabstop> <tabstop>sound_input_channel_combo_box</tabstop>
<tabstop>audio_ip_buffer_spin_box</tabstop>
<tabstop>sound_output_combo_box</tabstop> <tabstop>sound_output_combo_box</tabstop>
<tabstop>sound_output_channel_combo_box</tabstop> <tabstop>sound_output_channel_combo_box</tabstop>
<tabstop>audio_op_buffer_spin_box</tabstop>
<tabstop>save_path_select_push_button</tabstop> <tabstop>save_path_select_push_button</tabstop>
<tabstop>azel_path_select_push_button</tabstop> <tabstop>azel_path_select_push_button</tabstop>
<tabstop>checkBoxPwrBandTxMemory</tabstop> <tabstop>checkBoxPwrBandTxMemory</tabstop>
@ -3016,6 +3089,7 @@ Right click for insert and delete options.</string>
<tabstop>clear_DX_check_box</tabstop> <tabstop>clear_DX_check_box</tabstop>
<tabstop>opCallEntry</tabstop> <tabstop>opCallEntry</tabstop>
<tabstop>psk_reporter_check_box</tabstop> <tabstop>psk_reporter_check_box</tabstop>
<tabstop>psk_reporter_tcpip_check_box</tabstop>
<tabstop>udp_server_line_edit</tabstop> <tabstop>udp_server_line_edit</tabstop>
<tabstop>udp_server_port_spin_box</tabstop> <tabstop>udp_server_port_spin_box</tabstop>
<tabstop>accept_udp_requests_check_box</tabstop> <tabstop>accept_udp_requests_check_box</tabstop>
@ -3030,9 +3104,13 @@ Right click for insert and delete options.</string>
<tabstop>stations_table_view</tabstop> <tabstop>stations_table_view</tabstop>
<tabstop>highlighting_list_view</tabstop> <tabstop>highlighting_list_view</tabstop>
<tabstop>reset_highlighting_to_defaults_push_button</tabstop> <tabstop>reset_highlighting_to_defaults_push_button</tabstop>
<tabstop>highlight_by_mode_check_box</tabstop>
<tabstop>only_fields_check_box</tabstop>
<tabstop>include_WAE_check_box</tabstop>
<tabstop>rescan_log_push_button</tabstop>
<tabstop>LotW_CSV_URL_line_edit</tabstop> <tabstop>LotW_CSV_URL_line_edit</tabstop>
<tabstop>LotW_CSV_fetch_push_button</tabstop>
<tabstop>LotW_days_since_upload_spin_box</tabstop> <tabstop>LotW_days_since_upload_spin_box</tabstop>
<tabstop>LotW_CSV_fetch_push_button</tabstop>
<tabstop>sbNtrials</tabstop> <tabstop>sbNtrials</tabstop>
<tabstop>sbAggressive</tabstop> <tabstop>sbAggressive</tabstop>
<tabstop>cbTwoPass</tabstop> <tabstop>cbTwoPass</tabstop>
@ -3041,13 +3119,18 @@ Right click for insert and delete options.</string>
<tabstop>sbTxDelay</tabstop> <tabstop>sbTxDelay</tabstop>
<tabstop>cbx2ToneSpacing</tabstop> <tabstop>cbx2ToneSpacing</tabstop>
<tabstop>cbx4ToneSpacing</tabstop> <tabstop>cbx4ToneSpacing</tabstop>
<tabstop>rbLowSidelobes</tabstop>
<tabstop>rbMaxSensitivity</tabstop>
<tabstop>gbSpecialOpActivity</tabstop>
<tabstop>rbFox</tabstop> <tabstop>rbFox</tabstop>
<tabstop>rbHound</tabstop>
<tabstop>rbNA_VHF_Contest</tabstop> <tabstop>rbNA_VHF_Contest</tabstop>
<tabstop>rbEU_VHF_Contest</tabstop>
<tabstop>rbField_Day</tabstop> <tabstop>rbField_Day</tabstop>
<tabstop>Field_Day_Exchange</tabstop> <tabstop>Field_Day_Exchange</tabstop>
<tabstop>rbEU_VHF_Contest</tabstop>
<tabstop>rbRTTY_Roundup</tabstop> <tabstop>rbRTTY_Roundup</tabstop>
<tabstop>RTTY_Exchange</tabstop> <tabstop>RTTY_Exchange</tabstop>
<tabstop>rbWW_DIGI</tabstop>
</tabstops> </tabstops>
<resources/> <resources/>
<connections> <connections>
@ -3117,13 +3200,13 @@ Right click for insert and delete options.</string>
</connection> </connection>
</connections> </connections>
<buttongroups> <buttongroups>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="special_op_activity_button_group"/> <buttongroup name="special_op_activity_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/> <buttongroup name="TX_mode_button_group"/>
<buttongroup name="split_mode_button_group"/> <buttongroup name="PTT_method_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/> <buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
</buttongroups> </buttongroups>
</ui> </ui>

View File

@ -394,8 +394,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
}, },
m_sfx {"P", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A"}, m_sfx {"P", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A"},
mem_jt9 {shdmem}, mem_jt9 {shdmem},
m_msAudioOutputBuffered (0u),
m_framesAudioInputBuffered (RX_SAMPLE_RATE / 10),
m_downSampleFactor (downSampleFactor), m_downSampleFactor (downSampleFactor),
m_audioThreadPriority (QThread::HighPriority), m_audioThreadPriority (QThread::HighPriority),
m_bandEdited {false}, m_bandEdited {false},
@ -937,8 +935,12 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
connect (&m_wav_future_watcher, &QFutureWatcher<void>::finished, this, &MainWindow::diskDat); connect (&m_wav_future_watcher, &QFutureWatcher<void>::finished, this, &MainWindow::diskDat);
connect(&watcher3, SIGNAL(finished()),this,SLOT(fast_decode_done())); connect(&watcher3, SIGNAL(finished()),this,SLOT(fast_decode_done()));
Q_EMIT startAudioInputStream (m_config.audio_input_device (), m_framesAudioInputBuffered, m_detector, m_downSampleFactor, m_config.audio_input_channel ()); Q_EMIT startAudioInputStream (m_config.audio_input_device ()
Q_EMIT initializeAudioOutputStream (m_config.audio_output_device (), AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2, m_msAudioOutputBuffered); , m_config.audio_input_buffer_size ()
, m_detector, m_downSampleFactor, m_config.audio_input_channel ());
Q_EMIT initializeAudioOutputStream (m_config.audio_output_device ()
, AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2
, m_config.audio_output_buffer_size ());
Q_EMIT transmitFrequency (ui->TxFreqSpinBox->value () - m_XIT); Q_EMIT transmitFrequency (ui->TxFreqSpinBox->value () - m_XIT);
enable_DXCC_entity (m_config.DXCC ()); // sets text window proportions and (re)inits the logbook enable_DXCC_entity (m_config.DXCC ()); // sets text window proportions and (re)inits the logbook
@ -1277,8 +1279,6 @@ void MainWindow::readSettings()
// use these initialisation settings to tune the audio o/p buffer // use these initialisation settings to tune the audio o/p buffer
// size and audio thread priority // size and audio thread priority
m_settings->beginGroup ("Tune"); m_settings->beginGroup ("Tune");
m_msAudioOutputBuffered = m_settings->value ("Audio/OutputBufferMs").toInt ();
m_framesAudioInputBuffered = m_settings->value ("Audio/InputBufferFrames", RX_SAMPLE_RATE / 10).toInt ();
m_audioThreadPriority = static_cast<QThread::Priority> (m_settings->value ("Audio/ThreadPriority", QThread::HighPriority).toInt () % 8); m_audioThreadPriority = static_cast<QThread::Priority> (m_settings->value ("Audio/ThreadPriority", QThread::HighPriority).toInt () % 8);
m_settings->endGroup (); m_settings->endGroup ();
@ -1799,15 +1799,16 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog
if(m_config.spot_to_psk_reporter ()) pskSetLocal (); if(m_config.spot_to_psk_reporter ()) pskSetLocal ();
if(m_config.restart_audio_input ()) { if(m_config.restart_audio_input ()) {
Q_EMIT startAudioInputStream (m_config.audio_input_device (), Q_EMIT startAudioInputStream (m_config.audio_input_device ()
m_framesAudioInputBuffered, m_detector, m_downSampleFactor, , m_config.audio_input_buffer_size ()
m_config.audio_input_channel ()); , m_detector, m_downSampleFactor
, m_config.audio_input_channel ());
} }
if(m_config.restart_audio_output ()) { if(m_config.restart_audio_output ()) {
Q_EMIT initializeAudioOutputStream (m_config.audio_output_device (), Q_EMIT initializeAudioOutputStream (m_config.audio_output_device ()
AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2, , AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2
m_msAudioOutputBuffered); , m_config.audio_output_buffer_size ());
} }
displayDialFrequency (); displayDialFrequency ();

View File

@ -666,8 +666,6 @@ private:
QSharedMemory *mem_jt9; QSharedMemory *mem_jt9;
QString m_QSOText; QString m_QSOText;
unsigned m_msAudioOutputBuffered;
unsigned m_framesAudioInputBuffered;
unsigned m_downSampleFactor; unsigned m_downSampleFactor;
QThread::Priority m_audioThreadPriority; QThread::Priority m_audioThreadPriority;
bool m_bandEdited; bool m_bandEdited;