diff --git a/gui/include/sessionlog.h b/gui/include/sessionlog.h index b49b78a..6977460 100644 --- a/gui/include/sessionlog.h +++ b/gui/include/sessionlog.h @@ -21,6 +21,7 @@ #include #include +#include #include class QFile; @@ -45,6 +46,7 @@ class SessionLog ChiakiLog *GetChiakiLog() { return &log; } }; +QString GetLogBaseDir(); QString CreateLogFilename(); #endif //CHIAKI_SESSIONLOG_H diff --git a/gui/include/settings.h b/gui/include/settings.h index ef026e8..ccf8a0e 100644 --- a/gui/include/settings.h +++ b/gui/include/settings.h @@ -39,9 +39,13 @@ class Settings : public QObject public: explicit Settings(QObject *parent = nullptr); - bool GetDiscoveryEnabled() { return settings.value("settings/auto_discovery", true).toBool(); } + bool GetDiscoveryEnabled() const { return settings.value("settings/auto_discovery", true).toBool(); } void SetDiscoveryEnabled(bool enabled) { settings.setValue("settings/auto_discovery", enabled); } + bool GetLogVerbose() const { return settings.value("settings/log_verbose", false).toBool(); } + void SetLogVerbose(bool enabled) { settings.setValue("settings/log_verbose", enabled); } + uint32_t GetLogLevelMask(); + ChiakiVideoResolutionPreset GetResolution() const; void SetResolution(ChiakiVideoResolutionPreset resolution); diff --git a/gui/include/settingsdialog.h b/gui/include/settingsdialog.h index 1b3d3ae..f879931 100644 --- a/gui/include/settingsdialog.h +++ b/gui/include/settingsdialog.h @@ -23,6 +23,7 @@ class Settings; class QListWidget; class QComboBox; +class QCheckBox; class SettingsDialog : public QDialog { @@ -31,6 +32,8 @@ class SettingsDialog : public QDialog private: Settings *settings; + QCheckBox *log_verbose_check_box; + QComboBox *resolution_combo_box; QComboBox *fps_combo_box; @@ -38,6 +41,8 @@ class SettingsDialog : public QDialog QPushButton *delete_registered_host_button; private slots: + void LogVerboseChanged(); + void ResolutionSelected(); void FPSSelected(); diff --git a/gui/include/streamsession.h b/gui/include/streamsession.h index ac5bd35..3dab317 100644 --- a/gui/include/streamsession.h +++ b/gui/include/streamsession.h @@ -34,6 +34,7 @@ class QGamepad; class QAudioOutput; class QIODevice; class QKeyEvent; +class Settings; class ChiakiException: public Exception { @@ -49,6 +50,9 @@ struct StreamSessionConnectInfo QByteArray regist_key; QByteArray morning; ChiakiConnectVideoProfile video_profile; + + StreamSessionConnectInfo(); + StreamSessionConnectInfo(Settings *settings, QString host, QByteArray regist_key, QByteArray morning); }; class StreamSession : public QObject diff --git a/gui/src/main.cpp b/gui/src/main.cpp index 826531c..f1a920a 100644 --- a/gui/src/main.cpp +++ b/gui/src/main.cpp @@ -89,32 +89,25 @@ int main(int argc, char *argv[]) QString host = args[1]; - StreamSessionConnectInfo connect_info; + if(parser.value(regist_key_option).isEmpty() || parser.value(morning_option).isEmpty()) + parser.showHelp(1); - connect_info.log_level_mask = CHIAKI_LOG_ALL & ~CHIAKI_LOG_VERBOSE; - connect_info.log_file = CreateLogFilename(); - - connect_info.host = host; - - connect_info.regist_key = parser.value(regist_key_option).toUtf8(); - if(connect_info.regist_key.length() > sizeof(ChiakiConnectInfo::regist_key)) + QByteArray regist_key = parser.value(regist_key_option).toUtf8(); + if(regist_key.length() > sizeof(ChiakiConnectInfo::regist_key)) { printf("Given regist key is too long.\n"); return 1; } - connect_info.regist_key += QByteArray(sizeof(ChiakiConnectInfo::regist_key) - connect_info.regist_key.length(), 0); + regist_key += QByteArray(sizeof(ChiakiConnectInfo::regist_key) - regist_key.length(), 0); - connect_info.morning = QByteArray::fromBase64(parser.value(morning_option).toUtf8()); - if(connect_info.morning.length() != sizeof(ChiakiConnectInfo::morning)) + QByteArray morning = QByteArray::fromBase64(parser.value(morning_option).toUtf8()); + if(morning.length() != sizeof(ChiakiConnectInfo::morning)) { printf("Given morning has invalid size (expected %llu)", (unsigned long long)sizeof(ChiakiConnectInfo::morning)); return 1; } - chiaki_connect_video_profile_preset(&connect_info.video_profile, settings.GetResolution(), settings.GetFPS()); - - if(connect_info.regist_key.isEmpty() || connect_info.morning.isEmpty()) - parser.showHelp(1); + StreamSessionConnectInfo connect_info(&settings, host, regist_key, morning); return RunStream(app, connect_info); } diff --git a/gui/src/registdialog.cpp b/gui/src/registdialog.cpp index 88c3ad6..9009f97 100644 --- a/gui/src/registdialog.cpp +++ b/gui/src/registdialog.cpp @@ -124,8 +124,7 @@ RegistExecuteDialog::RegistExecuteDialog(Settings *settings, const ChiakiRegistI layout->addWidget(button_box); connect(button_box, &QDialogButtonBox::rejected, this, &QDialog::reject); - // TODO: respect verbose setting - chiaki_log_init(&log, CHIAKI_LOG_ALL/* & ~CHIAKI_LOG_VERBOSE*/, RegistExecuteDialogLogCb, this); + chiaki_log_init(&log, settings->GetLogLevelMask(), RegistExecuteDialogLogCb, this); chiaki_regist_start(®ist, &log, ®ist_info, RegistExecuteDialogRegistCb, this); setWindowTitle(tr("Register Console")); diff --git a/gui/src/sessionlog.cpp b/gui/src/sessionlog.cpp index 299645e..1f6c5f7 100644 --- a/gui/src/sessionlog.cpp +++ b/gui/src/sessionlog.cpp @@ -90,12 +90,8 @@ static void LogCb(ChiakiLogLevel level, const char *msg, void *user) #define KEEP_LOG_FILES_COUNT 5 -QString CreateLogFilename() +QString GetLogBaseDir() { - static const QString date_format = "yyyy-MM-dd_HH-mm-ss-zzzzzz"; - static const QString session_log_wildcard = "chiaki_session_*.log"; - static const QRegularExpression session_log_regex("chiaki_session_(.*).log"); - auto base_dir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); if(base_dir.isEmpty()) return QString(); @@ -106,6 +102,20 @@ QString CreateLogFilename() if(!dir.cd("log")) return QString(); + return dir.absolutePath(); +} + +QString CreateLogFilename() +{ + static const QString date_format = "yyyy-MM-dd_HH-mm-ss-zzzzzz"; + static const QString session_log_wildcard = "chiaki_session_*.log"; + static const QRegularExpression session_log_regex("chiaki_session_(.*).log"); + + QString dir_str = GetLogBaseDir(); + if(dir_str.isEmpty()) + return QString(); + QDir dir = QDir(dir_str); + dir.setNameFilters({ session_log_wildcard }); auto existing_files = dir.entryList(); QVector> existing_files_date; diff --git a/gui/src/settings.cpp b/gui/src/settings.cpp index 184a908..5508ae2 100644 --- a/gui/src/settings.cpp +++ b/gui/src/settings.cpp @@ -25,6 +25,14 @@ Settings::Settings(QObject *parent) : QObject(parent) LoadRegisteredHosts(); } +uint32_t Settings::GetLogLevelMask() +{ + uint32_t mask = CHIAKI_LOG_ALL; + if(!GetLogVerbose()) + mask &= ~CHIAKI_LOG_VERBOSE; + return mask; +} + static const QMap resolutions = { { CHIAKI_VIDEO_RESOLUTION_PRESET_360p, "360p"}, { CHIAKI_VIDEO_RESOLUTION_PRESET_540p, "540p"}, diff --git a/gui/src/settingsdialog.cpp b/gui/src/settingsdialog.cpp index 51084f6..4859840 100644 --- a/gui/src/settingsdialog.cpp +++ b/gui/src/settingsdialog.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,8 @@ #include #include #include +#include +#include SettingsDialog::SettingsDialog(Settings *settings, QWidget *parent) : QDialog(parent) { @@ -37,6 +40,26 @@ SettingsDialog::SettingsDialog(Settings *settings, QWidget *parent) : QDialog(pa setLayout(layout); + // General + + auto general_group_box = new QGroupBox(tr("General")); + layout->addWidget(general_group_box); + + auto general_layout = new QFormLayout(); + general_group_box->setLayout(general_layout); + if(general_layout->spacing() < 16) + general_layout->setSpacing(16); + + log_verbose_check_box = new QCheckBox(this); + general_layout->addRow(tr("Verbose Logging:\nWarning: This logs A LOT!\nDon't enable for regular use."), log_verbose_check_box); + log_verbose_check_box->setChecked(settings->GetLogVerbose()); + connect(log_verbose_check_box, &QCheckBox::stateChanged, this, &SettingsDialog::LogVerboseChanged); + + auto log_directory_label = new QLineEdit(GetLogBaseDir(), this); + log_directory_label->setReadOnly(true); + general_layout->addRow(tr("Log Directory:"), log_directory_label); + + // Stream Settings auto stream_settings_group_box = new QGroupBox(tr("Stream Settings")); @@ -118,6 +141,11 @@ void SettingsDialog::ResolutionSelected() settings->SetResolution((ChiakiVideoResolutionPreset)resolution_combo_box->currentData().toInt()); } +void SettingsDialog::LogVerboseChanged() +{ + settings->SetLogVerbose(log_verbose_check_box->isChecked()); +} + void SettingsDialog::FPSSelected() { settings->SetFPS((ChiakiVideoFPSPreset)fps_combo_box->currentData().toInt()); diff --git a/gui/src/streamsession.cpp b/gui/src/streamsession.cpp index d6c64bd..a53de32 100644 --- a/gui/src/streamsession.cpp +++ b/gui/src/streamsession.cpp @@ -16,6 +16,7 @@ */ #include +#include #include @@ -29,6 +30,22 @@ #include +StreamSessionConnectInfo::StreamSessionConnectInfo() +{ + log_level_mask = CHIAKI_LOG_ALL; + std::memset(&video_profile, 0, sizeof(video_profile)); +} + +StreamSessionConnectInfo::StreamSessionConnectInfo(Settings *settings, QString host, QByteArray regist_key, QByteArray morning) +{ + log_level_mask = settings->GetLogLevelMask(); + log_file = CreateLogFilename(); + chiaki_connect_video_profile_preset(&video_profile, settings->GetResolution(), settings->GetFPS()); + this->host = host; + this->regist_key = regist_key; + this->morning = morning; +} + static void AudioSettingsCb(uint32_t channels, uint32_t rate, void *user); static void AudioFrameCb(int16_t *buf, size_t samples_count, void *user); static void VideoSampleCb(uint8_t *buf, size_t buf_size, void *user);