From 6214cc9835d7cff2400e0d3d556cbdf7582194e5 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 1 Dec 2020 20:55:10 +0000 Subject: [PATCH 01/16] Use same user defined audio out buffer sizes on all platforms --- Audio/soundout.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Audio/soundout.cpp b/Audio/soundout.cpp index fe7c58fbf..bd71d8560 100644 --- a/Audio/soundout.cpp +++ b/Audio/soundout.cpp @@ -106,9 +106,9 @@ void SoundOutput::restart (QIODevice * source) //qDebug () << "SoundOut default buffer size (bytes):" << m_stream->bufferSize () << "period size:" << m_stream->periodSize (); if (m_framesBuffered) { -#if defined (Q_OS_WIN) + //#if defined (Q_OS_WIN) m_stream->setBufferSize (m_stream->format().bytesForFrames (m_framesBuffered)); -#endif + //#endif } m_stream->setCategory ("production"); m_stream->start (source); From 041c6b68fec60a8a161cabcb364036bfbc9fb786 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 1 Dec 2020 21:05:01 +0000 Subject: [PATCH 02/16] Reduce non-Windows Tx audio buffer size --- Audio/soundout.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Audio/soundout.cpp b/Audio/soundout.cpp index bd71d8560..d64f3fb2c 100644 --- a/Audio/soundout.cpp +++ b/Audio/soundout.cpp @@ -106,9 +106,11 @@ void SoundOutput::restart (QIODevice * source) //qDebug () << "SoundOut default buffer size (bytes):" << m_stream->bufferSize () << "period size:" << m_stream->periodSize (); if (m_framesBuffered) { - //#if defined (Q_OS_WIN) +#if defined (Q_OS_WIN) m_stream->setBufferSize (m_stream->format().bytesForFrames (m_framesBuffered)); - //#endif +#else + m_stream->setBufferSize (m_stream->format().bytesForFrames (3456)); +#endif } m_stream->setCategory ("production"); m_stream->start (source); From 5f85dfac61119446878db794c82d5ec6f2a36f95 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 1 Dec 2020 21:24:41 +0000 Subject: [PATCH 03/16] Looking for a Tx audio buffer size that works on macOS. --- Audio/soundout.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Audio/soundout.cpp b/Audio/soundout.cpp index d64f3fb2c..6a99afd34 100644 --- a/Audio/soundout.cpp +++ b/Audio/soundout.cpp @@ -109,10 +109,10 @@ void SoundOutput::restart (QIODevice * source) #if defined (Q_OS_WIN) m_stream->setBufferSize (m_stream->format().bytesForFrames (m_framesBuffered)); #else - m_stream->setBufferSize (m_stream->format().bytesForFrames (3456)); + m_stream->setBufferSize (m_stream->format().bytesForFrames (48000 / 10)); #endif } - m_stream->setCategory ("production"); + m_stream->setCategory ("game"); m_stream->start (source); // qDebug () << "SoundOut selected buffer size (bytes):" << m_stream->bufferSize () << "period size:" << m_stream->periodSize (); } From 917e87cee57e1972474b48a8c03f6050965b3fc6 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 2 Dec 2020 00:40:37 +0000 Subject: [PATCH 04/16] Handle Qt logging category when redirecting to SYSLOG channel --- WSJTXLogging.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WSJTXLogging.cpp b/WSJTXLogging.cpp index bb6171609..ffa563b23 100644 --- a/WSJTXLogging.cpp +++ b/WSJTXLogging.cpp @@ -97,11 +97,11 @@ namespace } else { - BOOST_LOG_CHANNEL_SEV (log, std::string {context.category}, severity) + BOOST_LOG_SEV (log, severity) << boost::log::add_value ("Line", context.line) << boost::log::add_value ("File", file) << boost::log::add_value ("Function", function) - << msg.toStdString (); + << context.category << ": " << msg.toStdString (); } if (QtFatalMsg == type) { From 94f0af72e3c2edbb0b1ed7cc9404ca73f276114b Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 2 Dec 2020 01:53:36 +0000 Subject: [PATCH 05/16] Command line tool prints WSJT-X version to console, tnx Dave, W3DJS --- AppVersion/AppVersion.cpp | 43 +++++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 11 +++++++++- widgets/about.cpp | 2 +- 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 AppVersion/AppVersion.cpp diff --git a/AppVersion/AppVersion.cpp b/AppVersion/AppVersion.cpp new file mode 100644 index 000000000..26cac2c10 --- /dev/null +++ b/AppVersion/AppVersion.cpp @@ -0,0 +1,43 @@ +// +// wsjtx_app_version - a console application that outputs WSJT-X +// application version +// +// This application is only provided as a simple console application +// +// + +#include +#include +#include + +#include +#include +#include + +#include "revision_utils.hpp" + +int main (int argc, char * argv[]) +{ + QCoreApplication app {argc, argv}; + try + { + app.setApplicationName ("WSJT-X"); + app.setApplicationVersion (version()); + + QCommandLineParser parser; +// parser.setApplicationDescription ("\n" PROJECT_DESCRIPTION); + parser.addHelpOption (); + parser.addVersionOption (); + parser.process (app); + return EXIT_SUCCESS; + } + catch (std::exception const& e) + { + std::cerr << "Error: " << e.what () << '\n'; + } + catch (...) + { + std::cerr << "Unexpected error\n"; + } + return -1; +} diff --git a/CMakeLists.txt b/CMakeLists.txt index 1597eddca..e9c6db665 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1457,6 +1457,15 @@ generate_version_info (udp_daemon_VERSION_RESOURCES add_executable (udp_daemon UDPExamples/UDPDaemon.cpp ${udp_daemon_VERSION_RESOURCES}) target_link_libraries (udp_daemon wsjtx_udp-static) +generate_version_info (wsjtx_app_version_VERSION_RESOURCES + NAME wsjtx_app_version + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + FILE_DESCRIPTION "Display WSJT-X Application Version on console" + ) +add_executable (wsjtx_app_version AppVersion/AppVersion.cpp ${wsjtx_app_version_VERSION_RESOURCES}) +target_link_libraries (wsjtx_app_version wsjt_qt) + generate_version_info (message_aggregator_VERSION_RESOURCES NAME message_aggregator BUNDLE ${PROJECT_BUNDLE_NAME} @@ -1516,7 +1525,7 @@ install (TARGETS wsjtx # DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx # ) -install (TARGETS udp_daemon message_aggregator +install (TARGETS udp_daemon message_aggregator wsjtx_app_version RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime ) diff --git a/widgets/about.cpp b/widgets/about.cpp index b8e0fab43..908e6e38d 100644 --- a/widgets/about.cpp +++ b/widgets/about.cpp @@ -23,7 +23,7 @@ CAboutDlg::CAboutDlg(QWidget *parent) : "We gratefully acknowledge contributions from AC6SL, AE4JY,
" "DF2ET, DJ0OT, G3WDG, G4KLA, IV3NWV, IW3RAB, KA1GT, K3WYC,
" "KA6MAL, KA9Q, KB1ZMX, KD6EKQ, KI7MT, KK1D, ND0B, PY2SDR,
" - "VE1SKY, VK3ACF, VK4BDJ, VK7MO, W4TI, W4TV, and W9MDB.

" + "VE1SKY, VK3ACF, VK4BDJ, VK7MO, W3DJS, W4TI, W4TV, and W9MDB.

" "WSJT-X is licensed under the terms of Version 3
" "of the GNU General Public License (GPL)

" "" From 50d0543c0384437a164816f929e033b104b72049 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 3 Dec 2020 01:49:21 +0000 Subject: [PATCH 06/16] Test version with environment variable to set Tx audio buffer size WSJT_TX_AUDIO_BUFFER_FRAMES takes the following values: -1 - use Qt/system default 0 - use 200 mS (WSJT-X default) +ve integer - value is number of frames at 48 kHz -1 is likely to be a good choice on Windows and may macOS. 0 has proven to be good on Windows. On Linux 0 may be OK but we need to try other values. The value is only a hint, the actual value used along with the period size (the size of each chunk of samples requested by the system) is printed in an info level diagnostic message at the start of each transmission. --- Audio/soundout.cpp | 9 +++------ widgets/mainwindow.cpp | 10 +++++++--- widgets/mainwindow.h | 1 + 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Audio/soundout.cpp b/Audio/soundout.cpp index 6a99afd34..54b765e22 100644 --- a/Audio/soundout.cpp +++ b/Audio/soundout.cpp @@ -7,6 +7,7 @@ #include #include +#include "Logger.hpp" #include "Audio/AudioDevice.hpp" #include "moc_soundout.cpp" @@ -104,17 +105,13 @@ void SoundOutput::restart (QIODevice * source) // Windows implementation seems to forget the buffer size after a // stop. //qDebug () << "SoundOut default buffer size (bytes):" << m_stream->bufferSize () << "period size:" << m_stream->periodSize (); - if (m_framesBuffered) + if (m_framesBuffered > 0) { -#if defined (Q_OS_WIN) m_stream->setBufferSize (m_stream->format().bytesForFrames (m_framesBuffered)); -#else - m_stream->setBufferSize (m_stream->format().bytesForFrames (48000 / 10)); -#endif } m_stream->setCategory ("game"); m_stream->start (source); - // qDebug () << "SoundOut selected buffer size (bytes):" << m_stream->bufferSize () << "period size:" << m_stream->periodSize (); + LOG_INFO ("Selected buffer size (bytes): " << m_stream->bufferSize () << " period size: " << m_stream->periodSize ()); } void SoundOutput::suspend () diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 7e7bf0ebf..aaec4e558 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -212,7 +212,7 @@ namespace auto quint32_max = std::numeric_limits::max (); constexpr int N_WIDGETS {36}; constexpr int rx_chunk_size {3456}; // audio samples at 12000 Hz - constexpr int tx_audio_buffer_size {48000 / 5}; // audio frames at 48000 Hz + constexpr int default_tx_audio_buffer_frames {48000 / 5}; // audio frames at 48000 Hz bool message_is_73 (int type, QStringList const& msg_parts) { @@ -265,6 +265,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_soundInput {new SoundInput}, m_modulator {new Modulator {TX_SAMPLE_RATE, NTMAX}}, m_soundOutput {new SoundOutput}, + m_tx_audio_buffer_frames {0}, m_msErase {0}, m_secBandChanged {0}, m_freqNominal {0}, @@ -455,6 +456,9 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_modulator->moveToThread (&m_audioThread); m_soundInput->moveToThread (&m_audioThread); m_detector->moveToThread (&m_audioThread); + bool ok; + auto buffer_size = env.value ("WSJT_TX_AUDIO_BUFFER_FRAMES", "0").toInt (&ok); + m_tx_audio_buffer_frames = ok && buffer_size ? buffer_size : default_tx_audio_buffer_frames; // hook up sound output stream slots & signals and disposal connect (this, &MainWindow::initializeAudioOutputStream, m_soundOutput, &SoundOutput::setFormat); @@ -942,7 +946,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, { Q_EMIT initializeAudioOutputStream (m_config.audio_output_device () , AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2 - , tx_audio_buffer_size); + , m_tx_audio_buffer_frames); } Q_EMIT transmitFrequency (ui->TxFreqSpinBox->value () - m_XIT); @@ -1855,7 +1859,7 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog if(m_config.restart_audio_output () && !m_config.audio_output_device ().isNull ()) { Q_EMIT initializeAudioOutputStream (m_config.audio_output_device () , AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2 - , tx_audio_buffer_size); + , m_tx_audio_buffer_frames); } displayDialFrequency (); diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index dd53e8837..878e9c6c3 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -404,6 +404,7 @@ private: SoundInput * m_soundInput; Modulator * m_modulator; SoundOutput * m_soundOutput; + int m_tx_audio_buffer_frames; QThread m_audioThread; qint64 m_msErase; From 88f18e7528d071bd7b2ef986b5ae4849e7e3b4e3 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 3 Dec 2020 11:55:21 +0000 Subject: [PATCH 07/16] Updated Catalan UI translation, tnx Xavi, EA3W. --- translations/wsjtx_ca.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/translations/wsjtx_ca.ts b/translations/wsjtx_ca.ts index e8e99b115..dc578b791 100644 --- a/translations/wsjtx_ca.ts +++ b/translations/wsjtx_ca.ts @@ -634,7 +634,8 @@ Format: Not found audio device missing - + falta un dispositiu d'àudio + No trobat @@ -2712,12 +2713,12 @@ Si no està marcat, pots veure els resultats de la calibració. F High - + F Alt F Low - + F Baixa @@ -2964,12 +2965,12 @@ La llista es pot mantenir a la configuració (F2). SWL Mode - + Mode SWL Hide lower panel controls to maximize deocde windows - + Amaga els controls del panell inferior per a maximitzar les finestres de descodificació Calling CQ @@ -3868,7 +3869,7 @@ La llista es pot mantenir a la configuració (F2). Excessive dropped samples - %1 (%2 sec) audio frames dropped in period starting %3 - + Mostres caigudes excessives - %1 (%2 sec) fotogrames d'àudio caiguts en el període inicial %3 @@ -3893,7 +3894,7 @@ La llista es pot mantenir a la configuració (F2). Enumerating audio devices - + Enumeració de dispositius d’àudio From 0b2a9c19534e66577699a16f4ff66db9c3770aee Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 3 Dec 2020 11:56:01 +0000 Subject: [PATCH 08/16] =?UTF-8?q?Updated=20Spanish=20UI=20translation,=20t?= =?UTF-8?q?nx=20C=C3=A9dric,=20EA4AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- translations/wsjtx_es.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/translations/wsjtx_es.ts b/translations/wsjtx_es.ts index 38da0087a..cd58e874c 100644 --- a/translations/wsjtx_es.ts +++ b/translations/wsjtx_es.ts @@ -2904,13 +2904,13 @@ Amarillo cuando esta muy bajo. Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences. Marca a TX en minutos o secuencias de números pares, a partir de 0; desmarca las secuencias impares. - Marcar para transmitir en secuencias o minutos pares, comenzando por 0; desmarca para transmitir en las secuencias o minutos impares. + Marcar para transmitir en secuencias o minutos pares, comenzando por 0; desmarca para transmitir en las secuencias o minutos impares. Tx even/1st Alternar periodo TX Par/Impar - TX segundo par + Tx primer par/1ro From 5b10479cb447a233e4aada9d4fa97cb8338e4f28 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 3 Dec 2020 11:56:50 +0000 Subject: [PATCH 09/16] Updated Chinese and Hong Kong UI translations, tnx Sze-to, VR2UPU --- translations/wsjtx_zh.ts | 150 ++++++++++++++++++++++++------------ translations/wsjtx_zh_HK.ts | 72 ++++++++++++++--- 2 files changed, 161 insertions(+), 61 deletions(-) diff --git a/translations/wsjtx_zh.ts b/translations/wsjtx_zh.ts index cc7652ad6..f163e86be 100644 --- a/translations/wsjtx_zh.ts +++ b/translations/wsjtx_zh.ts @@ -388,7 +388,7 @@ path: "%1% - 目錄: "%1% + 目录: "%1% @@ -504,7 +504,12 @@ Format: 您必须输入有效的 ARRL RTTY Roundup 交换数据 - + + Pending DNS lookup, please try again later + 等待域名系统查找,请稍后再试 + + + Reset Decode Highlighting 重置解码突出显示 @@ -519,7 +524,17 @@ Format: WSJT-X 解码文本字体选择 - + + UDP server DNS lookup failed + UDP服务器域名系统查找失败 + + + + MAC-ambiguous multicast groups addresses not supported + 不支持媒体访问控制不明确的多播组地址 + + + Load Working Frequencies 载入工作频率 @@ -2670,12 +2685,12 @@ Not available to nonstandard callsign holders. <html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html> - <html><head/><body><p>子模式確定音調間距; A 最窄.</p></body></html> + <html><head/><body><p>子模式确定音调间距离; A 最窄.</p></body></html> Submode determines tone spacing; A is narrowest. - 子模式確定音調間距; A 最窄. + 子模式确定音调间距离; A 最窄. @@ -3664,12 +3679,12 @@ list. The list can be maintained in Settings (F2). 降低系统负载 - + Excessive dropped samples - %1 (%2 sec) audio frames dropped in period starting %3 样品丢失过多 - %1 (%2 sec) 音频帧在周期开始时丢失 %3 - + Error Scanning ADIF Log 扫描 ADIF 日志错误 @@ -3870,7 +3885,7 @@ list. The list can be maintained in Settings (F2). "fmt.all" 文件将重命名为 "fmt.bak" - + If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: "The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group." @@ -3879,7 +3894,7 @@ list. The list can be maintained in Settings (F2). "WSJT-X 的算法, 源代码, 外观和感觉及相关程序,和协议规格模式 FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 的版权 (C) 2001-2019 由以下一个或多个作者: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; 和 WSJT 开发组的其他成员." - + No data read from disk. Wrong file format? 没有从磁盘读取数据. 文件格式出错误? @@ -3899,42 +3914,7 @@ list. The list can be maintained in Settings (F2). 键盘快捷键 - - Special Mouse Commands - 特殊鼠标组合 - - - - No more files to open. - 没有要打开的文件. - - - - Spotting to PSK Reporter unavailable - 无法发送至PSK Reporter - - - - Please choose another Tx frequency. WSJT-X will not knowingly transmit another mode in the WSPR sub-band on 30m. - 请选择其他发射频率. WSJT-X 不会故意传输另一个模式在 WSPR 30米子波段上. - - - - WSPR Guard Band - WSPR保护波段 - - - - Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands. - 请选择其它频率. WSJT-X 不会运行狐狸模式在标准 FT8 波段. - - - - Fox Mode warning - 狐狸模式警告 - - - + <table cellspacing=1> <tr><td><b>Esc </b></td><td>Stop Tx, abort QSO, clear next-call queue</td></tr> <tr><td><b>F1 </b></td><td>Online User's Guide (Alt: transmit Tx6)</td></tr> @@ -4028,7 +4008,12 @@ list. The list can be maintained in Settings (F2). </table> - + + Special Mouse Commands + 特殊鼠标组合 + + + <table cellpadding=5> <tr> <th align="right">Click on</th> @@ -4092,6 +4077,36 @@ list. The list can be maintained in Settings (F2). </tr> </table> + + + No more files to open. + 没有要打开的文件. + + + + Spotting to PSK Reporter unavailable + 发送到 Pskreporter 不可用 + + + + Please choose another Tx frequency. WSJT-X will not knowingly transmit another mode in the WSPR sub-band on 30m. + 请选择另一个发射频率. WSJT-X 不会故意在 30m 的 WSPR 子频段中传输另一种模式. + + + + WSPR Guard Band + WSPR 守护波段 + + + + Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands. + 请选择另一个频率. WSJT-X在标准的FT8子带中不会以狐狸模式工作. + + + + Fox Mode warning + 狐狸模式警告 + Last Tx: %1 @@ -5409,6 +5424,11 @@ quiet period when decoding is done. Data bits 数据位元 + + + Data Bits + 数据位元 + D&efault @@ -5434,6 +5454,11 @@ quiet period when decoding is done. Stop bits 停止位元 + + + Stop Bits + 停止位元 + @@ -5615,7 +5640,7 @@ or bandwidth is selected). None - + @@ -5748,7 +5773,32 @@ transmitting periods. 向外发射输出. - + + <html><head/><body><p>Enter the service port number of the UDP server that WSJT-X should send updates to. If this is zero no updates will be sent.</p></body></html> + <html><head/><body><p>输入WSJT-X应该向其发送更新的UDP服务器的服务端口号. 如果该值为零则不会发送任何更新.</p></body></html> + + + + Outgoing interfaces: + 传出接口: + + + + <html><head/><body><p>When sending updates to a multicast group address it is necessary to specify which network interface(s) to send them to. If the loop-back interface is multicast capable then at least that one will be selected.</p><p>For most users the loop-back interface is all that is needed, that will allow multiple other applications on the same machine to interoperate with WSJT-X. If applications running on other hosts are to receive status updates then a suitable network interface should be used.</p><p>On some Linux systems it may be necessary to enable multicast on the loop-back network interface.</p></body></html> + <html><head/><body><p>向多播组地址发送更新时需要指定将更新发送到哪个网络接口. 如果环回接口支持多播那么将至少选择该接口.</p><p>对于大多数用户来说环回接口是他们所需要的, 这将允许同一台机器上的多个其他应用程序与WSJT-X进行互操作. 如果运行在其他主机上的应用程序要接收状态更新则应使用合适的网络接口.</p><p>在某些Linux系统上可能需要在环回网络接口上启用多播.</p></body></html> + + + + <html><head/><body><p>Sets the number or router hops that multicast datagrams are allowed to make. Almost everyone should set this to 1 to keep outgoing multicast traffic withn the local subnet.</p></body></html> + <html><head/><body><p>设置允许多点传送数据报的资料元或路由器资料元. 几乎每个人都应该将该值设置为 1 以保持出站多点传送流量在本地子网中.</p></body></html> + + + + Multicast TTL: + 多点传送 TTL: + + + Days since last upload 自上次上传以来的天数 @@ -5808,7 +5858,7 @@ both here. 启用甚高频和子模式功能 - + Ou&tput: 输出(&t): @@ -6525,7 +6575,7 @@ Right click for insert and delete options. <html><head/><body><p>Generate Tx audio with four times the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-4 before generating RF.</p></body></html> - <html><head/><body><p>具有正常音調間距四倍的發射音頻. 適用於在產生射頻之前使用除以 4 的特殊 LF/MF 發射器.</p></body></html> + <html><head/><body><p>具有正常音调间距四倍的发射音频. 适用于在产生射频之前使用除以 4 的特殊 LF/MF 发射器.</p></body></html> diff --git a/translations/wsjtx_zh_HK.ts b/translations/wsjtx_zh_HK.ts index 7bfff1f4e..851f485b9 100644 --- a/translations/wsjtx_zh_HK.ts +++ b/translations/wsjtx_zh_HK.ts @@ -504,7 +504,12 @@ Format: 您必須輸入有效的 ARRL RTTY Roundup 交換數據 - + + Pending DNS lookup, please try again later + 等待 DNS 查找, 請稍後再試 + + + Reset Decode Highlighting 重置解碼突出顯示 @@ -519,7 +524,17 @@ Format: WSJT-X 解碼文本字體選擇 - + + UDP server DNS lookup failed + UDP 伺服器 DNS 尋找失敗 + + + + MAC-ambiguous multicast groups addresses not supported + MAC 模棱兩可的多播組位址不受支援 + + + Load Working Frequencies 載入工作頻率 @@ -1956,7 +1971,7 @@ Error: %2 - %3 Satellite - 卫星 + 衛星 @@ -2434,7 +2449,7 @@ Yellow when too low If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode. - 如果橙色或红色出现表示无线电设备控制故障, 请单击以重置并读取频率. S 表示异频模式. + 如果橙色或紅色出現表示無線電設備控制故障, 請按下以重置並讀取頻率. S 表示異頻模式. @@ -3879,7 +3894,7 @@ list. The list can be maintained in Settings (F2). "WSJT-X 的演演演算法, 原始碼, 外觀和感覺及相關程式, 和協定規格模式 FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 的版權 (C) 2001-2019 由以下一個或多個作者: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; 和 WSJT 開發組的其他成員." - + No data read from disk. Wrong file format? 沒有從磁盤讀取數據. 檔案格式錯誤? @@ -3899,7 +3914,7 @@ list. The list can be maintained in Settings (F2). 鍵盤快捷鍵 - + <table cellspacing=1> <tr><td><b>Esc </b></td><td>Stop Tx, abort QSO, clear next-call queue</td></tr> <tr><td><b>F1 </b></td><td>Online User's Guide (Alt: transmit Tx6)</td></tr> @@ -3993,7 +4008,7 @@ list. The list can be maintained in Settings (F2). </table> - + Special Mouse Commands 特殊滑鼠組合 @@ -5410,6 +5425,11 @@ quiet period when decoding is done. Data bits 數據位元 + + + Data Bits + 數據位元 + D&efault @@ -5435,6 +5455,11 @@ quiet period when decoding is done. Stop bits 停止位元 + + + Stop Bits + 停止位元 + @@ -5465,7 +5490,7 @@ quiet period when decoding is done. &None - 無(&N) + @@ -5749,7 +5774,32 @@ transmitting periods. 向外發射輸出. - + + <html><head/><body><p>Enter the service port number of the UDP server that WSJT-X should send updates to. If this is zero no updates will be sent.</p></body></html> + <html><head/><body><p>輸入 WSJT-X 應向其發送更新的 UDP 伺服器的服務埠號. 如果這是零將不發送任何更新.</p></body></html> + + + + Outgoing interfaces: + 傳出介面: + + + + <html><head/><body><p>When sending updates to a multicast group address it is necessary to specify which network interface(s) to send them to. If the loop-back interface is multicast capable then at least that one will be selected.</p><p>For most users the loop-back interface is all that is needed, that will allow multiple other applications on the same machine to interoperate with WSJT-X. If applications running on other hosts are to receive status updates then a suitable network interface should be used.</p><p>On some Linux systems it may be necessary to enable multicast on the loop-back network interface.</p></body></html> + <html><head/><body><p>向組播組地址發送更新時需要指定要將其發送到哪個網路介面. 如果環回介面支援組播則至少將選擇該介面.</p><p>對於大多數用戶來說迴圈回式介面是所有需要的, 將允許同一台電腦上的多個其他應用程式與 WSJT-X 進行互通. 如果在其他主機上運行的應用程式要接收狀態更新則應使用合適的網路介面.</p><p>在某些 Linux 系統上可能需要在環回網路介面上啟用組播.</p></body></html> + + + + <html><head/><body><p>Sets the number or router hops that multicast datagrams are allowed to make. Almost everyone should set this to 1 to keep outgoing multicast traffic withn the local subnet.</p></body></html> + <html><head/><body><p>設置允許組播數據報進行的數位或路由器躍點. 幾乎每個人都應該將此設置為 1 以保持傳出的組播流量與本地子網.</p></body></html> + + + + Multicast TTL: + 組播 TTL TTL: + + + Days since last upload 自上次上傳以來的天數 @@ -5809,7 +5859,7 @@ both here. 啟用甚高頻和子模式功能 - + Ou&tput: 輸出(&t): @@ -6001,7 +6051,7 @@ and DX Grid fields when a 73 or free text message is sent. Log automatically (contesting only) - 日誌自記錄 (僅限競赛) + 日誌自動記錄 (僅限競赛) From 3134dd8a606c0586ca02361ef60693a75e022efc Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 3 Dec 2020 12:20:14 +0000 Subject: [PATCH 10/16] Removed incorrect pointer declaration, tnx to Rud, K5RUD --- lib/wsprd/wsprd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/wsprd/wsprd.c b/lib/wsprd/wsprd.c index 2e3b385da..522b7097f 100644 --- a/lib/wsprd/wsprd.c +++ b/lib/wsprd/wsprd.c @@ -71,7 +71,7 @@ unsigned long readc2file(char *ptr_to_infile, float *idat, float *qdat, float *buffer; double dfreq; int i,ntrmin; - char *c2file[15]; + char c2file[15]; size_t nr; FILE* fp; From ac6a6d0cd7e8f4f11c6d95d98a5bcd29fa2923e5 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 3 Dec 2020 13:12:12 +0000 Subject: [PATCH 11/16] Fail wsprd if data directory specified not accessible Also fixed trivial memory leak on error exit. --- lib/wsprd/wsprd.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/wsprd/wsprd.c b/lib/wsprd/wsprd.c index 522b7097f..8ef66fd19 100644 --- a/lib/wsprd/wsprd.c +++ b/lib/wsprd/wsprd.c @@ -875,10 +875,12 @@ int main(int argc, char *argv[]) } } - if( stackdecoder ) { - stack=calloc(stacksize,sizeof(struct snode)); + if( access(data_dir, R_OK | W_OK)) { + fprintf(stderr, "Error: inaccessible data directory: '%s'\n", data_dir); + usage(); + return EXIT_FAILURE; } - + if( optind+1 > argc) { usage(); return 1; @@ -886,6 +888,10 @@ int main(int argc, char *argv[]) ptr_to_infile=argv[optind]; } + if( stackdecoder ) { + stack=calloc(stacksize,sizeof(struct snode)); + } + // setup metric table for(i=0; i<256; i++) { mettab[0][i]=round( 10*(metric_tables[2][i]-bias) ); From ad8c33bee78dda1c706676b0a7a92ee93c7dc6d2 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 3 Dec 2020 14:31:46 +0000 Subject: [PATCH 12/16] Try not setting low-latency audio category --- Audio/soundout.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Audio/soundout.cpp b/Audio/soundout.cpp index 54b765e22..7f38447ac 100644 --- a/Audio/soundout.cpp +++ b/Audio/soundout.cpp @@ -109,7 +109,7 @@ void SoundOutput::restart (QIODevice * source) { m_stream->setBufferSize (m_stream->format().bytesForFrames (m_framesBuffered)); } - m_stream->setCategory ("game"); + m_stream->setCategory ("production"); m_stream->start (source); LOG_INFO ("Selected buffer size (bytes): " << m_stream->bufferSize () << " period size: " << m_stream->periodSize ()); } From 93cf8a1b58c8aa812b9af4b11bdac576d1a60683 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 3 Dec 2020 19:19:47 +0000 Subject: [PATCH 13/16] Updated WSJT-X Danish UI translation, tnx Michael, 5P1KZX --- translations/wsjtx_da.ts | 71 ++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 10 deletions(-) diff --git a/translations/wsjtx_da.ts b/translations/wsjtx_da.ts index 3acc2f102..bb7744752 100644 --- a/translations/wsjtx_da.ts +++ b/translations/wsjtx_da.ts @@ -20,8 +20,8 @@ Are you sure you want to delete the %n selected QSO(s) from the log? - Er du sikker på at du vil slette de %n valgte QSO(er) fra loggen? - + Sikker på du vil slette de %n valgte QSO(er) fra loggen? + Er du sikker på du vil slette de %n valgte QSO(s) fra loggen? @@ -626,7 +626,7 @@ Format: Not found audio device missing - + Audio device mangler @@ -2711,12 +2711,12 @@ Når den ikke er markeret, kan du se kalibreringsresultaterne. F High - + F Høj F Low - + F Lav @@ -2964,12 +2964,12 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2). SWL Mode - + SWL Mode Hide lower panel controls to maximize deocde windows - + Skjul nederste del af Control Panel for at maksimere dekoder vinduet Calling CQ @@ -3864,7 +3864,8 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2). Excessive dropped samples - %1 (%2 sec) audio frames dropped in period starting %3 - + For store tabte prøver -% 1 (% 2 sek) lydrammer faldt i perioden startende med% 3 + For stort tab i - %1 (%2 sec) audio frames stoppet i periode startende %3 @@ -3889,7 +3890,7 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2). Enumerating audio devices - + Opsumering af audio enheder @@ -4147,7 +4148,57 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2). <tr><td><b>Alt+Z </b></td><td>Clear hung decoder status</td></tr> </table> Keyboard shortcuts help window contents - + Hjælpetekst til Tastetur genveje + <tabelcelleafstand = 1> + <tr><td> <b> Esc </b></td> <td> Stop Tx, afbryd QSO, ryd kø ved næste kald </td> </tr> + <tr><td> <b> F1 </b></td> <td> Online brugervejledning (Alt: transmitter Tx6) </td> </tr> + <tr><td> <b> Shift + F1 </b></td> <td> Meddelelse om ophavsret </td> </tr> + <tr><td> <b> Ctrl + F1 </b></td> <td> Om WSJT-X </td> </tr> + <tr><td> <b> F2 </b></td> <td> Åbn indstillingsvinduet (Alt: send Tx2) </td> </tr> + <tr><td> <b> F3 </b></td> <td> Vis tastaturgenveje (Alt: transmitter Tx3) </td> </tr> + <tr><td> <b> F4 </b></td> <td> Ryd DX Call, DX Grid, Tx meddelelser 1-4 (Alt: send Tx4) </td> </tr> + <tr><td> <b> Alt + F4 </b></td> <td> Afslutningsprogram </td> </tr> + <tr><td> <b> F5 </b></td> <td> Vis specielle musekommandoer (Alt: transmitter Tx5) </td> </tr> +<tr><td> <b> F6 </b></td> <td> Åbn næste fil i biblioteket (Alt: skift "Call 1st") </td> </tr> + <tr><td> <b> Shift + F6 </b></td> <td> Dekod alle resterende filer i biblioteket </td> </tr> + <tr><td> <b> F7 </b></td> <td> Vis vindue for gennemsnitsmeddelelse </td> </tr> + <tr><td> <b> F11 </b></td> <td> Flyt Rx-frekvensen ned 1 Hz </td> </tr> + <tr><td> <b> Ctrl + F11 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser ned 1 Hz </td> </tr> + <tr><td> <b> Shift + F11 </b></td> <td> Flyt Tx-frekvensen 60 Hz ned (FT8) eller 90 Hz (FT4) </td> </tr> + <tr><td> <b> Ctrl + Shift + F11 </b></td> <td> Flyt kaldefrekvensen 2000 Hz ned </td> </tr> + <tr><td> <b> F12 </b></td> <td> Flyt Rx-frekvensen 1 Hz op </td> </tr> + <tr><td> <b> Ctrl + F12 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser 1 Hz op </td> </tr> +<tr><td> <b> Ctrl + F11 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser ned 1 Hz </td> </tr> + <tr><td> <b> Shift + F11 </b></td> <td> Flyt Tx-frekvensen ned 60 Hz (FT8) eller 90 Hz (FT4) </td> </tr> + <tr><td> <b> Ctrl + Shift + F11 </b></td> <td> Flyt kaldefrekvensen ned 2000 Hz </td> </tr> + <tr><td> <b> F12 </b></td> <td> Flyt Rx-frekvensen op 1 Hz </td> </tr> + <tr><td> <b> Ctrl + F12 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser 1 Hz op </td> </tr> + <tr><td> <b> Shift + F12 </b></td> <td> Flyt Tx-frekvensen 60 Hz op (FT8) eller 90 Hz (FT4) </td> </tr> + <tr><td> <b> Ctrl + Shift + F12 </b></td> <td> Flyt kaldefrekvensen 2000 Hz op</td> </tr> + <tr><td> <b> Alt + 1-6 </b></td> <td> Indstil NU transmission til dette nummer på fane 1 </td> </tr> + <tr><td> <b> Ctl + 1-6 </b></td> <td> Indstil næste transmission til dette nummer på fane 1 </td> </tr> + <tr><td> <b> Alt + B </b></td> <td> Skift status "Bedste S + P" </td> </tr> + <tr><td> <b> Alt + C </b></td> <td> Skift afkrydsningsfelt "Kald 1st" </td> </tr> + <tr><td> <b> Alt + D </b></td> <td> Dekod igen ved QSO-frekvens </td> </tr> + <tr><td> <b> Shift + D </b></td> <td> Fuld Dekodning (begge vinduer) </td> </tr> +<tr><td> <b> Ctrl + E </b></td> <td> Aktiver TX lige / 1. </td> </tr> + <tr><td> <b> Shift + E </b></td> <td> Deaktiver TX lige / 1. </td> </tr> + <tr><td> <b> Alt + E </b></td><td>Sætning</td> </tr> + <tr><td> <b> Ctrl + F </b></td> <td> Rediger fri tekstmeddelelsesfelt </td> </tr> + <tr><td> <b> Alt + G </b></td> <td> Generer standardmeddelelser </td> </tr> + <tr><td> <b> Alt + H </b></td> <td> Stop Tx </td> </tr> + <tr><td> <b> Ctrl + L </b></td> <td> Opslag af kaldesignal i database, generer standardbeskeder </td> </tr> + <tr><td> <b> Alt + M </b></td><td> Skærm</td> </tr> + <tr><td> <b> Alt + N </b></td> <td> Aktivér Tx </td> </tr> + <tr><td> <b> Ctrl + O </b></td> <td> Åbn en .wav-fil </td> </tr> + <tr><td> <b> Alt + O </b></td> <td> Skift operatør </td> </tr> + <tr><td> <b> Alt + Q </b></td> <td> Log QSO </td> </tr> + <tr><td> <b> Ctrl + R </b></td> <td> Indstil Tx4-besked til RRR (ikke i FT4) </td> </tr> + <tr><td> <b> Alt + R </b></td> <td> Indstil Tx4-besked til RR73 </td> </tr> + <tr><td> <b> Alt + S </b></td> <td> Stop overvågning </td> </tr> + <tr><td> <b> Alt + T </b></td> <td> Skift Tune status </td> </tr> + <tr><td> <b> Alt + Z </b></td> <td> Ryd fyldt buffer dekoderstatus </td> </tr> +</tabel> <table cellspacing=1> From 9fed3534d8f69304bb7ebb36eb05ef2c2c82a910 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 3 Dec 2020 23:39:44 +0000 Subject: [PATCH 14/16] Updated Japanese UI translation, tnx Oba san, JA7UDE --- translations/wsjtx_ja.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/translations/wsjtx_ja.ts b/translations/wsjtx_ja.ts index 0cf5f52bb..2813f3c91 100644 --- a/translations/wsjtx_ja.ts +++ b/translations/wsjtx_ja.ts @@ -625,7 +625,7 @@ Format: Not found audio device missing - + 見つかりません @@ -2703,12 +2703,12 @@ When not checked you can view the calibration results. F High - + F 高 F Low - + F 低 @@ -2962,12 +2962,12 @@ ENTERを押してテキストを登録リストに追加. SWL Mode - + SWLモード Hide lower panel controls to maximize deocde windows - + 下部制御パネルを非表示にしてデコードウィンドウを最大化 Calling CQ @@ -3825,7 +3825,7 @@ ENTERを押してテキストを登録リストに追加. Excessive dropped samples - %1 (%2 sec) audio frames dropped in period starting %3 - + サンプル大量欠落 - %3から始まる%1個(%2秒)のオーディオフレームが欠落 @@ -3850,7 +3850,7 @@ ENTERを押してテキストを登録リストに追加. Enumerating audio devices - + オーディオデバイスを列挙 From f3a2c653aa20d59a0a6dbe6df57f4ac459e3724c Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 4 Dec 2020 18:59:41 +0000 Subject: [PATCH 15/16] Revert to default o/s or Qt Tx audio buffer sizes --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index aaec4e558..8ce3e29cb 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -212,7 +212,7 @@ namespace auto quint32_max = std::numeric_limits::max (); constexpr int N_WIDGETS {36}; constexpr int rx_chunk_size {3456}; // audio samples at 12000 Hz - constexpr int default_tx_audio_buffer_frames {48000 / 5}; // audio frames at 48000 Hz + constexpr int default_tx_audio_buffer_frames {-1}; // lets Qt decide bool message_is_73 (int type, QStringList const& msg_parts) { From 538d0eedd5d148167ebf9e6f9e9472fa4f9bc808 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 4 Dec 2020 19:01:05 +0000 Subject: [PATCH 16/16] Change to wide character logging and handle wide character file paths --- Logger.cpp | 18 +++++++++--------- Logger.hpp | 4 ++-- WSJTXLogging.cpp | 12 ++++++------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Logger.cpp b/Logger.cpp index 00e5597b1..e92c7aa2a 100644 --- a/Logger.cpp +++ b/Logger.cpp @@ -21,10 +21,10 @@ #include #include #include - -#include +#include #include +namespace fs = boost::filesystem; namespace logging = boost::log; namespace srcs = logging::sources; namespace sinks = logging::sinks; @@ -128,7 +128,7 @@ namespace Logger CommonInitialization ci; } - void init_from_config (std::istream& stream) + void init_from_config (std::wistream& stream) { CommonInitialization ci; try @@ -152,24 +152,24 @@ namespace Logger logging::core::get ()->set_logging_enabled (false); } - void add_datafile_log (std::string const& log_file_name) + void add_datafile_log (std::wstring const& log_file_name) { // Create a text file sink - boost::shared_ptr backend + boost::shared_ptr backend ( - new sinks::text_ostream_backend() + new sinks::wtext_ostream_backend() ); - backend->add_stream (boost::shared_ptr (new std::ofstream (log_file_name))); + backend->add_stream (boost::shared_ptr (new fs::wofstream (log_file_name))); // Flush after each log record backend->auto_flush (true); // Create a sink for the backend - typedef sinks::synchronous_sink sink_t; + typedef sinks::synchronous_sink sink_t; boost::shared_ptr sink (new sink_t (backend)); // The log output formatter - sink->set_formatter (expr::format ("[%1%][%2%] %3%") + sink->set_formatter (expr::format (L"[%1%][%2%] %3%") % expr::attr ("TimeStamp") % logging::trivial::severity % expr::message diff --git a/Logger.hpp b/Logger.hpp index 6e29789e4..5d497943f 100644 --- a/Logger.hpp +++ b/Logger.hpp @@ -21,14 +21,14 @@ namespace Logger void init (); // define logger(s) and sinks from a configuration stream - void init_from_config (std::istream& config_stream); + void init_from_config (std::wistream& config_stream); // disable logging - useful for unit testing etc. void disable (); // add a new file sink for LOG_DATA_* for Severity >= INFO // this file sink will be used alongside any configured above - void add_data_file_log (std::string const& log_file_name); + void add_data_file_log (std::wstring const& log_file_name); } #define LOG_LOG_LOCATION(LOGGER, LEVEL, ARG) \ diff --git a/WSJTXLogging.cpp b/WSJTXLogging.cpp index ffa563b23..e0ba871bd 100644 --- a/WSJTXLogging.cpp +++ b/WSJTXLogging.cpp @@ -93,7 +93,7 @@ namespace << boost::log::add_value ("Line", context.line) << boost::log::add_value ("File", file) << boost::log::add_value ("Function", function) - << msg.toStdString (); + << msg.toStdWString (); } else { @@ -101,7 +101,7 @@ namespace << boost::log::add_value ("Line", context.line) << boost::log::add_value ("File", file) << boost::log::add_value ("Function", function) - << context.category << ": " << msg.toStdString (); + << context.category << ": " << msg.toStdWString (); } if (QtFatalMsg == type) { @@ -155,8 +155,8 @@ WSJTXLogging::WSJTXLogging () pos = match.capturedEnd (0); } new_config += config.mid (pos); - std::stringbuf buffer {new_config.toStdString (), std::ios_base::in}; - std::istream stream {&buffer}; + std::wstringbuf buffer {new_config.toStdWString (), std::ios_base::in}; + std::wistream stream {&buffer}; Logger::init_from_config (stream); LOG_INFO ("Read logging configuration file: " << log_config.fileName ()); } @@ -180,7 +180,7 @@ WSJTXLogging::WSJTXLogging () ( keywords::auto_flush = false #if BOOST_VERSION / 100 >= 1070 - , keywords::file_name = app_data.absoluteFilePath ("wsjtx_syslog.log").toStdString () + , keywords::file_name = app_data.absoluteFilePath ("wsjtx_syslog.log").toStdWString () , keywords::target_file_name = #else , keywords::file_name = @@ -200,7 +200,7 @@ WSJTXLogging::WSJTXLogging () keywords::max_size = 40 * 1024 * 1024 , keywords::min_free_space = 1024 * 1024 * 1024 , keywords::max_files = 12 - , keywords::target = app_data.absoluteFilePath ("logs").toStdString () + , keywords::target = app_data.absoluteFilePath ("logs").toStdWString () ) ); sys_sink->locked_backend ()->scan_for_files ();