Add Sleep Trigger to GUI

This commit is contained in:
Florian Märkl 2020-10-22 13:53:31 +02:00
commit 8ddbad6f61
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
8 changed files with 108 additions and 6 deletions

View file

@ -38,6 +38,13 @@ enum class ControllerButtonExt
ANALOG_STICK_RIGHT_Y_DOWN = (1 << 25), ANALOG_STICK_RIGHT_Y_DOWN = (1 << 25),
}; };
enum class DisconnectAction
{
AlwaysNothing,
AlwaysSleep,
Ask
};
class Settings : public QObject class Settings : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -95,6 +102,9 @@ class Settings : public QObject
ChiakiConnectVideoProfile GetVideoProfile(); ChiakiConnectVideoProfile GetVideoProfile();
DisconnectAction GetDisconnectAction();
void SetDisconnectAction(DisconnectAction action);
QList<RegisteredHost> GetRegisteredHosts() const { return registered_hosts.values(); } QList<RegisteredHost> GetRegisteredHosts() const { return registered_hosts.values(); }
void AddRegisteredHost(const RegisteredHost &host); void AddRegisteredHost(const RegisteredHost &host);
void RemoveRegisteredHost(const HostMAC &mac); void RemoveRegisteredHost(const HostMAC &mac);

View file

@ -34,6 +34,7 @@ class SettingsDialog : public QDialog
Settings *settings; Settings *settings;
QCheckBox *log_verbose_check_box; QCheckBox *log_verbose_check_box;
QComboBox *disconnect_action_combo_box;
QComboBox *resolution_combo_box; QComboBox *resolution_combo_box;
QComboBox *fps_combo_box; QComboBox *fps_combo_box;
@ -48,6 +49,7 @@ class SettingsDialog : public QDialog
private slots: private slots:
void LogVerboseChanged(); void LogVerboseChanged();
void DisconnectActionSelected();
void ResolutionSelected(); void ResolutionSelected();
void FPSSelected(); void FPSSelected();

View file

@ -48,6 +48,7 @@ class ChiakiException: public Exception
struct StreamSessionConnectInfo struct StreamSessionConnectInfo
{ {
Settings *settings;
QMap<Qt::Key, int> key_map; QMap<Qt::Key, int> key_map;
HardwareDecodeEngine hw_decode_engine; HardwareDecodeEngine hw_decode_engine;
uint32_t log_level_mask; uint32_t log_level_mask;
@ -71,6 +72,7 @@ class StreamSession : public QObject
SessionLog log; SessionLog log;
ChiakiSession session; ChiakiSession session;
ChiakiOpusDecoder opus_decoder; ChiakiOpusDecoder opus_decoder;
bool connected;
Controller *controller; Controller *controller;
#if CHIAKI_GUI_ENABLE_SETSU #if CHIAKI_GUI_ENABLE_SETSU
@ -103,8 +105,11 @@ class StreamSession : public QObject
explicit StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent = nullptr); explicit StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent = nullptr);
~StreamSession(); ~StreamSession();
bool IsConnected() { return connected; }
void Start(); void Start();
void Stop(); void Stop();
void GoToBed();
void SetLoginPIN(const QString &pin); void SetLoginPIN(const QString &pin);

View file

@ -34,11 +34,12 @@ class StreamWindow: public QMainWindow
~StreamWindow() override; ~StreamWindow() override;
private: private:
const StreamSessionConnectInfo connect_info;
StreamSession *session; StreamSession *session;
AVOpenGLWidget *av_widget; AVOpenGLWidget *av_widget;
void Init(const StreamSessionConnectInfo &connect_info); void Init();
protected: protected:
void keyPressEvent(QKeyEvent *event) override; void keyPressEvent(QKeyEvent *event) override;

View file

@ -136,6 +136,25 @@ ChiakiConnectVideoProfile Settings::GetVideoProfile()
return profile; return profile;
} }
static const QMap<DisconnectAction, QString> disconnect_action_values = {
{ DisconnectAction::Ask, "ask" },
{ DisconnectAction::AlwaysNothing, "nothing" },
{ DisconnectAction::AlwaysSleep, "sleep" }
};
static const DisconnectAction disconnect_action_default = DisconnectAction::Ask;
DisconnectAction Settings::GetDisconnectAction()
{
auto v = settings.value("settings/disconnect_action", disconnect_action_values[disconnect_action_default]).toString();
return disconnect_action_values.key(v, disconnect_action_default);
}
void Settings::SetDisconnectAction(DisconnectAction action)
{
settings.setValue("settings/disconnect_action", disconnect_action_values[action]);
}
void Settings::LoadRegisteredHosts() void Settings::LoadRegisteredHosts()
{ {
registered_hosts.clear(); registered_hosts.clear();

View file

@ -85,6 +85,23 @@ SettingsDialog::SettingsDialog(Settings *settings, QWidget *parent) : QDialog(pa
log_directory_label->setReadOnly(true); log_directory_label->setReadOnly(true);
general_layout->addRow(tr("Log Directory:"), log_directory_label); general_layout->addRow(tr("Log Directory:"), log_directory_label);
disconnect_action_combo_box = new QComboBox(this);
QList<QPair<DisconnectAction, const char *>> disconnect_action_strings = {
{ DisconnectAction::AlwaysNothing, "Do Nothing"},
{ DisconnectAction::AlwaysSleep, "Enter Sleep Mode"},
{ DisconnectAction::Ask, "Ask"}
};
auto current_disconnect_action = settings->GetDisconnectAction();
for(const auto &p : disconnect_action_strings)
{
disconnect_action_combo_box->addItem(tr(p.second), (int)p.first);
if(current_disconnect_action == p.first)
disconnect_action_combo_box->setCurrentIndex(disconnect_action_combo_box->count() - 1);
}
connect(disconnect_action_combo_box, SIGNAL(currentIndexChanged(int)), this, SLOT(DisconnectActionSelected()));
general_layout->addRow(tr("Action on Disconnect:"), disconnect_action_combo_box);
auto about_button = new QPushButton(tr("About Chiaki"), this); auto about_button = new QPushButton(tr("About Chiaki"), this);
general_layout->addRow(about_button); general_layout->addRow(about_button);
connect(about_button, &QPushButton::clicked, this, [this]() { connect(about_button, &QPushButton::clicked, this, [this]() {
@ -140,7 +157,7 @@ SettingsDialog::SettingsDialog(Settings *settings, QWidget *parent) : QDialog(pa
UpdateBitratePlaceholder(); UpdateBitratePlaceholder();
audio_buffer_size_edit = new QLineEdit(this); audio_buffer_size_edit = new QLineEdit(this);
audio_buffer_size_edit->setValidator(new QIntValidator(1024, 0x20000)); audio_buffer_size_edit->setValidator(new QIntValidator(1024, 0x20000, audio_buffer_size_edit));
unsigned int audio_buffer_size = settings->GetAudioBufferSizeRaw(); unsigned int audio_buffer_size = settings->GetAudioBufferSizeRaw();
audio_buffer_size_edit->setText(audio_buffer_size ? QString::number(audio_buffer_size) : ""); audio_buffer_size_edit->setText(audio_buffer_size ? QString::number(audio_buffer_size) : "");
stream_settings_layout->addRow(tr("Audio Buffer Size:"), audio_buffer_size_edit); stream_settings_layout->addRow(tr("Audio Buffer Size:"), audio_buffer_size_edit);
@ -249,6 +266,11 @@ void SettingsDialog::ResolutionSelected()
UpdateBitratePlaceholder(); UpdateBitratePlaceholder();
} }
void SettingsDialog::DisconnectActionSelected()
{
settings->SetDisconnectAction(static_cast<DisconnectAction>(disconnect_action_combo_box->currentData().toInt()));
}
void SettingsDialog::LogVerboseChanged() void SettingsDialog::LogVerboseChanged()
{ {
settings->SetLogVerbose(log_verbose_check_box->isChecked()); settings->SetLogVerbose(log_verbose_check_box->isChecked());

View file

@ -30,6 +30,7 @@
#define SETSU_UPDATE_INTERVAL_MS 4 #define SETSU_UPDATE_INTERVAL_MS 4
StreamSessionConnectInfo::StreamSessionConnectInfo(Settings *settings, QString host, QByteArray regist_key, QByteArray morning) StreamSessionConnectInfo::StreamSessionConnectInfo(Settings *settings, QString host, QByteArray regist_key, QByteArray morning)
: settings(settings)
{ {
key_map = settings->GetControllerMappingForDecoding(); key_map = settings->GetControllerMappingForDecoding();
hw_decode_engine = settings->GetHardwareDecodeEngine(); hw_decode_engine = settings->GetHardwareDecodeEngine();
@ -58,6 +59,7 @@ StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObje
audio_output(nullptr), audio_output(nullptr),
audio_io(nullptr) audio_io(nullptr)
{ {
connected = false;
chiaki_opus_decoder_init(&opus_decoder, log.GetChiakiLog()); chiaki_opus_decoder_init(&opus_decoder, log.GetChiakiLog());
audio_buffer_size = connect_info.audio_buffer_size; audio_buffer_size = connect_info.audio_buffer_size;
@ -135,6 +137,11 @@ void StreamSession::Stop()
chiaki_session_stop(&session); chiaki_session_stop(&session);
} }
void StreamSession::GoToBed()
{
chiaki_session_goto_bed(&session);
}
void StreamSession::SetLoginPIN(const QString &pin) void StreamSession::SetLoginPIN(const QString &pin)
{ {
QByteArray data = pin.toUtf8(); QByteArray data = pin.toUtf8();
@ -299,8 +306,10 @@ void StreamSession::Event(ChiakiEvent *event)
switch(event->type) switch(event->type)
{ {
case CHIAKI_EVENT_CONNECTED: case CHIAKI_EVENT_CONNECTED:
connected = true;
break; break;
case CHIAKI_EVENT_QUIT: case CHIAKI_EVENT_QUIT:
connected = false;
emit SessionQuit(event->quit.reason, event->quit.reason_str ? QString::fromUtf8(event->quit.reason_str) : QString()); emit SessionQuit(event->quit.reason, event->quit.reason_str ? QString::fromUtf8(event->quit.reason_str) : QString());
break; break;
case CHIAKI_EVENT_LOGIN_PIN_REQUEST: case CHIAKI_EVENT_LOGIN_PIN_REQUEST:

View file

@ -19,6 +19,7 @@
#include <streamsession.h> #include <streamsession.h>
#include <avopenglwidget.h> #include <avopenglwidget.h>
#include <loginpindialog.h> #include <loginpindialog.h>
#include <settings.h>
#include <QLabel> #include <QLabel>
#include <QMessageBox> #include <QMessageBox>
@ -26,7 +27,8 @@
#include <QAction> #include <QAction>
StreamWindow::StreamWindow(const StreamSessionConnectInfo &connect_info, QWidget *parent) StreamWindow::StreamWindow(const StreamSessionConnectInfo &connect_info, QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent),
connect_info(connect_info)
{ {
setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose);
setWindowTitle(qApp->applicationName() + " | Stream"); setWindowTitle(qApp->applicationName() + " | Stream");
@ -36,7 +38,7 @@ StreamWindow::StreamWindow(const StreamSessionConnectInfo &connect_info, QWidget
try try
{ {
Init(connect_info); Init();
} }
catch(const Exception &e) catch(const Exception &e)
{ {
@ -51,7 +53,7 @@ StreamWindow::~StreamWindow()
delete av_widget; delete av_widget;
} }
void StreamWindow::Init(const StreamSessionConnectInfo &connect_info) void StreamWindow::Init()
{ {
session = new StreamSession(connect_info, this); session = new StreamSession(connect_info, this);
@ -98,10 +100,42 @@ void StreamWindow::mouseReleaseEvent(QMouseEvent *event)
session->HandleMouseEvent(event); session->HandleMouseEvent(event);
} }
void StreamWindow::closeEvent(QCloseEvent *) void StreamWindow::closeEvent(QCloseEvent *event)
{ {
if(session) if(session)
{
if(session->IsConnected())
{
bool sleep = false;
switch(connect_info.settings->GetDisconnectAction())
{
case DisconnectAction::Ask: {
auto res = QMessageBox::question(this, tr("Disconnect Session"), tr("Do you want the PS4 to go into sleep mode?"),
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
switch(res)
{
case QMessageBox::Yes:
sleep = true;
break;
case QMessageBox::Cancel:
event->ignore();
return;
default:
break;
}
break;
}
case DisconnectAction::AlwaysSleep:
sleep = true;
break;
default:
break;
}
if(sleep)
session->GoToBed();
}
session->Stop(); session->Stop();
}
} }
void StreamWindow::SessionQuit(ChiakiQuitReason reason, const QString &reason_str) void StreamWindow::SessionQuit(ChiakiQuitReason reason, const QString &reason_str)